我在Linux上从串行端口读取数据时遇到了一个奇怪的问题。大约50%的时间,当我从串行端口读取数据时,我不会从串行端口获取任何数据,但是如果我使用GTKTerm,我会在100%的时间获取数据。我已经仔细检查了我的设置,而且我使用的终端设置与GTKTerm使用的完全相同,所以我很困惑为什么会发生这种情况。我唯一能想到的是端口被设置为规范模式,而不是原始模式,但我设置得很好——我正在读取的设备不会用所有命令发送回换行符。但是,当设备用换行符发送回命令时,一切都正常工作。
下面是我使用的代码:

int fd = open(serial_port, O_RDWR );
if( fd < 0 ){
    perror("open");
}

//Set the serial port settings
struct termios newio;
if( tcgetattr( fd, &newio ) < 0 )
    perror("tcgetattr");

if( cfsetospeed( &newio, B9600 ) < 0 )
    perror("cfsetospeed");

newio.c_cflag &= ~CSTOPB;
newio.c_cflag &= ~CSIZE;
newio.c_cflag |= CS8;

newio.c_cflag |= CREAD;
newio.c_iflag |= IGNPAR;
newio.c_iflag |= IGNBRK;
newio.c_iflag &= ~BRKINT;
newio.c_iflag &= ~ICRNL;
newio.c_iflag &= ~IXON;
newio.c_cflag |= CLOCAL;
newio.c_oflag = 0;
newio.c_lflag = 0;
newio.c_cc[VTIME] = 0;
newio.c_cc[VMIN] = 1;
if( tcsetattr( fd, TCSANOW, &newio ) < 0 )
    perror("tcsetattr");
tcflush( fd, TCOFLUSH );
tcflush( fd, TCIFLUSH );

读取代码(在单独的线程中)
void* thr(void* ign){
    char buffer[10];
    while( 1 ){
            int got = read(fd, buffer, 10);
            buffer[got] = 0;
            printf("got %s\n", buffer);
    }
}

最佳答案

嗯,我发现了问题。
出于某种奇怪的原因,我要发送到的设备似乎没有大的缓冲区或其他东西;结果是,当我一次以字符串形式发送命令时,我不会总是得到响应。在发送字符之间睡觉可以解决问题(尽管我承认,这不是一个很好的解决方案)。可能发生的事情是我在某些点被打断了,这将为设备处理一些输入留出足够的时间。GTKTerm将在接收到每个字符时发送该字符,并且不可能以足够快的速度键入以发生此错误。

09-26 23:48