用termios编程伪终端通信。奇偶校验位选项不起作用

时间:2016-09-18 13:46:04

标签: c serial-port termios socat

我需要使用串口进行聊天。我通过socat模仿pty:

  

socat -d -d PTY PTY

接下来我写了一个小演示。这就是我如何初始化termios结构:

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

struct termios init(int);

int main(int argc,char** argv)
{
        struct termios tio;
        char c = 0;
        int tty_fd = open(argv[1], O_RDWR | O_NONBLOCK);

        tio = init(strcmp(argv[3], "odd"));

        if (tcsetattr(tty_fd, TCSANOW, &tio) == -1)
        {
                printf("Failed to setup the port");
                return -1;
        }

        if (strcmp(argv[2], "write") == 0)
        {
                while (c != 'q')
                {
                        scanf("%c", &c);
                        write(tty_fd, &c, 1);
                }
        }
        if (strcmp(argv[2], "read") == 0)
        {
                while (c != 'q')
                {
                        if (read(tty_fd, &c, 1) > 0)
                                printf("%c", c);
                }
        }
        close(tty_fd);
}

struct termios init(int is_odd)
{
        struct termios tio;
        bzero(&tio, sizeof(tio));
        // Frame bus runs at 38,400 BAUD
        const int BAUD_Rate = B38400;

        cfsetispeed(&tio, BAUD_Rate);
        cfsetospeed(&tio, BAUD_Rate);

        // Initialize to raw mode. PARMRK and PARENB will be over-ridden before calling tcsetattr()
        cfmakeraw(&tio);

        // Ignore modem lines and enable receiver and set bit per byte
        tio.c_cflag |= CLOCAL | CREAD | CS8;

        // NOTE: The following block overrides PARMRK and PARENB bits cleared by cfmakeraw.
        tio.c_cflag |=  PARENB;         // Enable even parity generation
        tio.c_iflag |=  INPCK;          // Enable parity checking
        tio.c_iflag |=  PARMRK;         // Enable in-band marking 
        tio.c_iflag &= ~IGNPAR;         // Make sure input parity errors are not ignored
        if (is_odd == 0) 
                tio.c_cflag |= PARODD;
        return tio;
}

接下来我的整个演示列表:

junit.framework.TestCase

当我将一个应用程序作为读取器启动时,以及作为具有相似奇偶校验的写入程序的其他应用程但是当我尝试测试奇偶校验位设置时,我会以不同的方式启动它们,一切顺利。所有消息都没有任何错误发送 是因为伪终端使用,而不是真正的COM端口?
 或者也许我创建一个pty的方式?

我的伙伴也尝试使用python进行类似的测试,也有类似的结果。我使用Linux Mint 17.3。

感谢您的重播。

1 个答案:

答案 0 :(得分:1)

我已阅读pty的手册页,发现termios'es c_cflag标志根本不受伪终端支持。