如何在Raspberry PI上的termios结构中正确设置串行端口参数?

时间:2018-12-12 11:33:18

标签: c raspberry-pi serial-port

我已通过串行端口将Raspberry PI与笔记本电脑相连。我已经编写了确保PI上c语言中的设备之间进行通信的程序。为了检查通信,我在笔记本电脑上使用了终端软件。 我必须为通讯设置以下参数:

波特率:300,数据位:8,奇偶校验:奇数,停止位:1,握手:无,读取超时:5秒。

我有一些疑问:

1)我是否正确设置了连接的必需参数?

2)为什么我在笔记本电脑的终端上什么也没收到?

3)为什么,如果我在发生2个超时后发送一个字节,则所有休息 字节立即为0(超时时无浪费)?

请参阅下面的代码:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int main ()
{
    struct termios RSopt;
    char byte = -1;
    char str[2] = {0,0};
    int fd;

    fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );    

    tcgetattr(fd, &RSopt);
    cfsetospeed (&RSopt, (speed_t)B300);
    cfsetispeed (&RSopt, (speed_t)B300);

    cfmakeraw(&RSopt);

    RSopt.c_cflag &= ~CSIZE;
    RSopt.c_cflag &=  ~CRTSCTS; 
    RSopt.c_cflag |= O_NONBLOCK;
    RSopt.c_cflag |=  CREAD;
    RSopt.c_cflag |=  CLOCAL;
    RSopt.c_cflag |=  CS8; 
    RSopt.c_cflag |= PARENB;
    RSopt.c_cflag |= PARODD;  
    RSopt.c_cflag |= ~CSTOPB; 
    RSopt.c_iflag |= IGNPAR; 

    tcflush( fd, TCIFLUSH );
    tcsetattr (fd, TCSANOW, &RSopt); 

    struct timeval timeout;
    fd_set read_fds;

    for (int ii=0;ii<10;++ii)
    {
        FD_ZERO(&read_fds);
        FD_SET(fd, &read_fds);
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;    
        str[0] = 0x5;
        write(fd, str, 1);

        if (select(fd + 1, &read_fds, NULL, NULL, &timeout) == 1)
        {
            read(fd, &byte, 1);
            printf("Recive: %x\n", byte);
        }
        else
        {
            printf("Timeout.\n");
        }
    };
    close(fd);
}

0 个答案:

没有答案