read函数读串口数据“分包”问题及解决方案
最近在做一个项目,其中要实现一个简单的数据透传功能。
功能简介:
实现通过网络向485串口(温湿度传感器)发送指令,然后把串口返回的数据发送到网络端。
实现方法:
采用多线程技术,函数执行时创建两个线程,
一个线程负责接收(recv)网络端的数据指令,并把收到的指令写到(write)串口。
另一个线程负责读取(read)串口的数据,并且把读到的数据发送(send)到网络端。
遇到的问题:
1、线程中调用了阻塞函数,导致线程释放失败。
2、串口读数据会分包,导致一次返回的数据要读取两次才可读完。
解决方案:
在调用相关函数之前,要确定它是否为阻塞函数。
至于读数据分包的问题,为了便于理解,下面以伪代码的形式向大家展示解决方案。
//以下代码在线程内部执行,注意阻塞情况
char readbuff[1024] = {0};
while(bool_pth_isRunning(pth_id)) //bool_pth_isRunning()为公司库函数,线程如果在执行时,返回值为true
{
memset(readbuff,0,1024);
int readsize = read(fd,readbuff,1023);
usleep(10000); //usleep()函数不懂的自己可以查一下,是一个线程微睡眠函数,为百万分之一秒。这里睡眠为10毫秒
int moresize = read(fd,&readbuff[readsize],1023-readsize);
if(moresize > 0)
{
readsize += moresize;
}
if(readsize > 0)
{
int size = send(sockfd,readbuff,readsize);
}
}