Linux 串行读取()无关数据
Linux serial read() extraneous data
我有两个应用程序通过串口通信。目标有一个它导航的状态机。它将接收和抛出数据,直到它获得消息字节 (0xE3) 的开始,然后处理数据直到消息字节 (0x3E) 结束。我对某些数据有疑问。我相信这是一个处理问题,而不是沟通问题。我也知道这很简单,但很难看到问题所在。
主机正在像这样向目标发送数据。 bfr数据为:{0xAA, 0xFF, 0x05, 'H', 'e', 'l', 'l', 'o'};
byte = MSG_START_BYTE; // 0xE3
if (write(fd, &byte, 1) < 0)
return -1;
if (write(fd, bfr, bfr_len) < 0)
return -1;
if (write(fd, &crc, sizeof(crc)) < 0)
return -1;
byte = MSG_END_BYTE; // 0x3E
if (write(fd, &byte, 1) < 0)
return -1;
目标正在使用 select() 和 read() 来接收数据。
char rx_bfr[128];
uint8_t max_bytes_to_read = 1;
memset(rx_bfr, 0, strlen(rx_bfr));
...
printf("\tactivity...");
bytes_read = read(fd, rx_bfr, max_bytes_to_read);
if (bytes_read < 0)
return -1;
else if (bytes_read == 0)
return -1;
printf(" %d bytes to process...\n", bytes_read);
for (i = 0; i < bytes_read; i++)
{
printf("byte[%d] = 0x%x\n", i, rx_bfr[i]);
switch (state)
{
case SOM:
if (rx_bfr[i] == 0xE3)
...
目标控制台输出为:
Waiting for message...
activity... 1 bytes to process...
byte[0] = 0xffffffe3
activity... 1 bytes to process...
byte[0] = 0xffffffaa
activity... 1 bytes to process...
byte[0] = 0xffffffff
activity... 1 bytes to process...
byte[0] = 0x5
activity... 1 bytes to process...
byte[0] = 0x48
activity... 1 bytes to process...
byte[0] = 0x65
activity... 1 bytes to process...
byte[0] = 0x6c
activity... 1 bytes to process...
byte[0] = 0x6c
activity... 1 bytes to process...
byte[0] = 0x6f
activity... 1 bytes to process...
byte[0] = 0xffffffd4
activity... 1 bytes to process...
byte[0] = 0xffffff81
activity... 1 bytes to process...
byte[0] = 0x1a
activity... 1 bytes to process...
byte[0] = 0x3c
activity... 1 bytes to process...
byte[0] = 0x3b
activity... 1 bytes to process...
byte[0] = 0x3e
所以在我的状态机中,if 条件正在寻找 0xE3
作为 SOM,但是从 printf 看到的缓冲区中的第一个 "byte" 是 0xFFFF_FFE3
.
char rx_bfr[128];
在您的平台上 char
已签名。值为 0xE3 的有符号字符为负数,而值为 0xE3 的整数为正数,因此它们不会相等。请改用 unsigned char
。
我有两个应用程序通过串口通信。目标有一个它导航的状态机。它将接收和抛出数据,直到它获得消息字节 (0xE3) 的开始,然后处理数据直到消息字节 (0x3E) 结束。我对某些数据有疑问。我相信这是一个处理问题,而不是沟通问题。我也知道这很简单,但很难看到问题所在。
主机正在像这样向目标发送数据。 bfr数据为:{0xAA, 0xFF, 0x05, 'H', 'e', 'l', 'l', 'o'};
byte = MSG_START_BYTE; // 0xE3
if (write(fd, &byte, 1) < 0)
return -1;
if (write(fd, bfr, bfr_len) < 0)
return -1;
if (write(fd, &crc, sizeof(crc)) < 0)
return -1;
byte = MSG_END_BYTE; // 0x3E
if (write(fd, &byte, 1) < 0)
return -1;
目标正在使用 select() 和 read() 来接收数据。
char rx_bfr[128];
uint8_t max_bytes_to_read = 1;
memset(rx_bfr, 0, strlen(rx_bfr));
...
printf("\tactivity...");
bytes_read = read(fd, rx_bfr, max_bytes_to_read);
if (bytes_read < 0)
return -1;
else if (bytes_read == 0)
return -1;
printf(" %d bytes to process...\n", bytes_read);
for (i = 0; i < bytes_read; i++)
{
printf("byte[%d] = 0x%x\n", i, rx_bfr[i]);
switch (state)
{
case SOM:
if (rx_bfr[i] == 0xE3)
...
目标控制台输出为:
Waiting for message...
activity... 1 bytes to process...
byte[0] = 0xffffffe3
activity... 1 bytes to process...
byte[0] = 0xffffffaa
activity... 1 bytes to process...
byte[0] = 0xffffffff
activity... 1 bytes to process...
byte[0] = 0x5
activity... 1 bytes to process...
byte[0] = 0x48
activity... 1 bytes to process...
byte[0] = 0x65
activity... 1 bytes to process...
byte[0] = 0x6c
activity... 1 bytes to process...
byte[0] = 0x6c
activity... 1 bytes to process...
byte[0] = 0x6f
activity... 1 bytes to process...
byte[0] = 0xffffffd4
activity... 1 bytes to process...
byte[0] = 0xffffff81
activity... 1 bytes to process...
byte[0] = 0x1a
activity... 1 bytes to process...
byte[0] = 0x3c
activity... 1 bytes to process...
byte[0] = 0x3b
activity... 1 bytes to process...
byte[0] = 0x3e
所以在我的状态机中,if 条件正在寻找 0xE3
作为 SOM,但是从 printf 看到的缓冲区中的第一个 "byte" 是 0xFFFF_FFE3
.
char rx_bfr[128];
在您的平台上 char
已签名。值为 0xE3 的有符号字符为负数,而值为 0xE3 的整数为正数,因此它们不会相等。请改用 unsigned char
。