串口无法读取

时间:2012-04-02 19:27:33

标签: linux serial-port

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

1 个答案:

答案 0 :(得分:2)

好吧,我发现了问题。

对于一些奇怪的原因,我发送的设备似乎没有大的缓冲区或其他东西;事实证明,当我一次性将命令作为字符串发送时,我不会总是得到回复。在发送字符之间休息可以解决问题(尽管我承认,这不是一个非常好的解决方案)。可能发生的事情是我在点上被中断,这将允许设备有足够的时间来处理它的一些输入。 GTKTerm会在收到每个字符时发出,并且输入的速度不足以发生此错误。