繁体   English   中英

Linux异步模式下的串行端口读取

[英]Linux serial port reading in asynchronized mode

我在Linux系统中从串行读取数据时遇到麻烦。 我正在尝试使用UART将传感器与linux系统连接。 我可以读写/ deve / ttyS1。 但是问题是我不想轮询来自UART的消息。 相反,我想使用异步模式来获取数据。 当数据到来时,回调函数将输入某个例程并运行我的代码。 问题不在于传感器向我发送了不同的数据包,每个数据包都包含各种字节的数据。 他们每秒来!

例如:

Time              Sensor          MyLinux
1s                        50bytes
                          124bytes
2s                        40bytes
                          174bytes
3s                        60bytes
                          244bytes

我的问题是如何使用异步串行编程,以便在回调函数中,可以将这两个数据包读取为两条消息

说50个字节来了,回调函数可以让我读取50个字节127个字节来了,回调函数可以让我读取127个字节

现在,它来了50个字节,我只能读取27个字节,其余的23个在下一条消息中。

我在POSIX中对串行端口的设置是:

    /* now we setup the values in port's termios */
    serial->tio.c_cflag=baudrate|databits|checkparity|stopbits|CLOCAL|CREAD;
    serial->tio.c_iflag=IGNPAR;
    serial->tio.c_oflag=0;
    serial->tio.c_lflag=0;
    serial->tio.c_cc[VMIN]=28;
    serial->tio.c_cc[VTIME]=6;

    /* we flush the port */
    tcflush(serial->fd,TCOFLUSH);
    tcflush(serial->fd,TCIFLUSH);

    /* we send new config to the port */
    tcsetattr(serial->fd,TCSANOW,&(serial->tio));

尝试将VMIN和VTIME设置为以下值:

serial->tio.c_cc[VMIN]=0;
serial->tio.c_cc[VTIME]=1;

然后,从传感器读取完整的数据块之后,您将摆脱select()的局面。 如果字节数少于预期,则可以设置选择超时,并再次将数据读取到当前缓冲区中。 如果您在超时之前获得数据,那么您将收到完整的消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM