我从Raspberry PI发送字节,并使用终端程序通过串行通信端口在笔记本电脑上接收它们。通讯参数如下:
波特率:9600,数据位:8,奇偶校验:奇数,停止位:1,握手:无。
在发送了两个字节{0x10, 0x05}
之后,我在终端机上(在我的笔记本电脑中)收到{0x10, 0xC1}
。仅当我将终端上的奇偶校验更改为NONE时,我才能收到正确的字节。
如何将奇偶校验设置为ODD
?
请参阅下面的代码:
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
int main()
{
struct termios RSopt;
char str[3] = { 0x10, 0x05, 0x0};
int fd;
fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );
tcgetattr( fd, &RSopt);
cfmakeraw( &RSopt);
cfsetspeed ( &RSopt, (speed_t)B9600);
RSopt.c_cflag &= ~CSIZE;
RSopt.c_cflag |= CS8;
RSopt.c_cflag |= PARENB;
RSopt.c_cflag |= PARODD;
RSopt.c_cflag &= ~CSTOPB;
tcflush( fd, TCIFLUSH );
tcsetattr ( fd, TCSANOW, &RSopt);
write( fd, str, 2 );
close( fd );
}
答案 0 :(得分:2)
ttyS0是微型uart,它不支持奇偶校验位。参见:https://www.raspberrypi.org/documentation/configuration/uart.md
否则,您发布的代码基本上是正确的。我目前无法访问RPi,但是如果驱动程序实现正确,您还应该能够通过检查tcsetattr()的返回值来验证属性的正确应用,还可以通过检查由tcgetattr()设置的值,因为setattr仅在无法设置任何属性时才指示失败。