以asynchronous模式读取Linux串口

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

例如:

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

我的问题是如何使用asynchronous串行编程,以便在callback函数中,这两个数据包可以被读取为两个消息

说50个字节来了,回拨function可以让我读50个字节127个字节来,回拨function可以让我读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()中跳出。 如果字节数少于预期,则可以设置select的超时时间,并再次读取当前缓冲区中的数据。 如果你在超时之前得到数据,那么你有完整的信息。