linux串口通信 接收信息不完整 读取不全

时间:2023-03-08 16:07:15
linux串口通信 接收信息不完整 读取不全

类似这种 ready.o是我用来读取串口信息的一个程序 执行结果如下:

[root@localhost testPlc]# ./ready.o
0 02
1 30
2 30
3 46
4 46
5 31
6 03
7 32
8 bd

按照通信协议,串口应返回的的是

0       02
1 30
2 30
3 46
4 46
5 31
6 03
7 32
8 31
9 38

并且其他几个指令,也是与通信协议所要求的返回的位数不同,并且最后一位也有是错误的,使用串口助手有没有问题。所以推测是接收区只有8位,然后代码里的接收buffer设置为128,所以应该是底层的原因,所以采用了select进行等待,最终实现了完整读取串口信息

代码示例:

void SetBench(unsigned char *msg, unsigned char *recv) {
fd_set fs_read;
int fd = nFd;
//nFd是串口句柄
unsigned char buf[16] = {0}; struct timeval time;
FD_ZERO(&fs_read);
FD_SET(fd, &fs_read); time.tv_sec = 2;
time.tv_usec = 0;
write(fd, msg, strlen(msg)); while (select(fd + 1, &fs_read, NULL, NULL, &time) > 0) {
len = read(fd, buf, sizeof(recv));
if (8 == len) {
strncpy(recv + count, buf, 8);
count += 8;
}
if (len > 0 && len < 8) {
strncpy(recv + count, buf, len);
count += len;
}
}
}