0

以下是串行通信端口设置
1. BaudRate: 19200
2. Parity: Even
3. StopBits: 1

发送器发送几个字节的数据:0x5A 0xA5 0xAA 接收
器是在 Linux 上使用 termios 串行 API 用 C 语言编写的
每个字节的设置为 0...为什么?

以下是用于在接收器应用程序上设置串行端口设置的 C (OS: Linux) 代码摘录:

void *threadRecv(void *arg)
{
    char *portName = (char *)arg;
    char ch;
    struct termios portSettings;

    //fd = open(portName, O_RDWR | O_NOCTTY | O_NDELAY);
    fd = open(portName, O_RDONLY | O_NOCTTY);
    close(fd);
    fd = open(portName, O_RDONLY | O_NOCTTY);
    if(fd == -1)
    {
        printf("Error opening port: %s", portName);
        pthread_exit("Exiting thread");
    }

    cfsetispeed(&portSettings, B19200);

    //Parity
    portSettings.c_cflag &= ~PARENB;
    portSettings.c_cflag |= PARENB;
    portSettings.c_cflag &= ~PARODD;

    //Stop Bit
    portSettings.c_cflag &= ~CSTOPB;

    //Data Size: 8bits
    portSettings.c_cflag &= ~CSIZE;
    portSettings.c_cflag |= CS8;

    portSettings.c_cflag |= CREAD;
    portSettings.c_cflag |= CLOCAL;

    portSettings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    portSettings.c_iflag |= (INPCK);

    portSettings.c_oflag &= ~OPOST; //For RAW I/P

    portSettings.c_cc[VMIN] = 77;
    portSettings.c_cc[VTIME] = 0;

    if(tcsetattr(fd, TCSANOW, &portSettings) == -1)
    {
        printf("Error setting port: %s", portName);
        pthread_exit("Exiting thread");
    }
    while(1)
    {
        //Recv Logic
    }
}
4

1 回答 1

1

虽然您的代码遵循按位修改termios结构条款的首选做法,但您的程序缺少通过调用tcgetattr(fd, &portSettings). 如果未初始化的termios
结构中 的垃圾值已启用,那么这可以解释您看到的结果。 由于您的代码仅对位进行了最少的修改,因此它应该具有类似于以下内容的语句: iflag.ISTRIP
iflagcfmakeraw()

portSettings.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP 
                             | INLCR | IGNCR | ICRNL | IXON); 

请参阅POSIX 操作系统的串行编程指南


portSettings.c_cc[VMIN] = 77;
portSettings.c_cc[VTIME] = 0;

如果消息帧同步丢失,这是一个有问题的配置。指定非零 VTIME 将是一种安全措施,只要您有适当的搜寻逻辑来重新实现消息同步,就可以进行恢复。


顺便说一句,原始(又名非规范)I/O 通常是 8 位,没有奇偶校验。八位奇偶校验是一种不寻常的配置。您是否尝试模拟接收 9 位字符帧(即 9N1)?

于 2015-01-03T22:09:41.907 回答