类似这种 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;
        }
    }
}

版权声明:本文为FatWang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/FatWang/p/14251383.html