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);

}

}



经验分享 程序员 微信小程序 职场和发展