类似这种 ready.o是我用来读取串口信息的一个程序 执行结果如下:
1 2 3 4 5 6 7 8 9 10
| [root@localhost testPlc]# ./ready.o 0 02 1 30 2 30 3 46 4 46 5 31 6 03 7 32 8 bd
|
按照通信协议,串口应返回的的是
1 2 3 4 5 6 7 8 9 10
| 0 02 1 30 2 30 3 46 4 46 5 31 6 03 7 32 8 31 9 38
|
并且其他几个指令,也是与通信协议所要求的返回的位数不同,并且最后一位也有是错误的,使用串口助手有没有问题。所以推测是接收区只有8位,然后代码里的接收buffer设置为128,所以应该是底层的原因,所以采用了select进行等待,最终实现了完整读取串口信息
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| void SetBench(unsigned char *msg, unsigned char *recv) { fd_set fs_read; int fd = 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; } } }
|