二进制字节与Linux串行通信中的换行符错误

时间:2016-09-19 15:31:43

标签: c linux binary serial-port

我正在使用串行通信接口;运行Linux内核2.6.36的SBC( TS-7200 )通过RS232将数据发送到PC(运行Windows)。数据封装在数据包(每字节字节数)中并发送。当TS尝试发送整数(uint8_t)(10)时会出现此问题,特别是\n的ASCII,终止字符(0xA);不是随机的吗?!

奇怪的是,如果我使用 Arduino Uno 执行相同的操作,将发送和接收整数10而不会出现问题!所以我的结论是Linux会像0b00001010一样\n,刷新串行缓冲区并且不会发送10,而Arduino则不会。在线搜索我发现文件可以在二进制模式(O_BINARY)或文件模式下打开,但显然这在Linux中无法使用;是对的吗?有没有办法让Linux像Arduino一样?

谢谢你, 费德里科

PS:我忘了提及我正在使用 C

1 个答案:

答案 0 :(得分:0)

您必须将串口设置为“原始”模式:

struct termios  tty;
unsigned int    sfd;

/* Open the serial port */
sfd = open("/dev/ttyS1", O_RDWR | O_NOCTTY);

/* Get current port config. */
tcgetattr(sfd, &tty);

/* Set youd speed/parity, etc. */
/* ... */

/*
Set raw mode, equivalent to:
tty->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
            | INLCR | IGNCR | ICRNL | IXON);
tty->c_oflag &= ~OPOST;
tty->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
tty->c_cflag &= ~(CSIZE | PARENB);
tty->c_cflag |= CS8;
*/
cfmakeraw(&tty);

tcsetattr(sfd, TCSANOW, &tty);

/* Do read/write */

小心甚至取消激活软件流控制(XON / XOFF),以便发送数据包中的所有数据。

请查看文章How to read a binary data over serial terminal in C program?