C中的Raspberry PI串行通信中的奇偶校验设置问题

时间:2018-12-19 11:07:20

标签: c serial-port raspberry-pi3

我从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 );

}

1 个答案:

答案 0 :(得分:2)

Raspberry PI系统上的

ttyS0是微型uart,它不支持奇偶校验位。参见:https://www.raspberrypi.org/documentation/configuration/uart.md

否则,您发布的代码基本上是正确的。我目前无法访问RPi,但是如果驱动程序实现正确,您还应该能够通过检查tcsetattr()的返回值来验证属性的正确应用,还可以通过检查由tcgetattr()设置的值,因为setattr仅在无法设置任何属性时才指示失败。