類似這種 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;
}
}
}
