c - 异步模式下的Linux串口读取

标签 c linux asynchronous serial-port uart

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

例如:

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

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

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

现在,好像是,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;

然后您将从传感器读取完整数据 block 后退出 select()。如果字节数少于您的预期,您可以为选择设置超时并再次读取附加到当前缓冲区的数据。如果您在超时之前获得数据,那么您将获得完整的消息。

关于c - 异步模式下的Linux串口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19631891/

相关文章:

c - 使用宏时出现错误 : invalid operands to binary + (have 'char *' and 'char *' ) ,

c - 在 C 中将一定数量的字符打印到 stdout 的最快方法

linux - 您如何诊断内核 oops?

javascript - ServiceNow 客户端脚本异步查询以停止在新服务门户中提交 onSubmit

javascript - 两个嵌套的 async.each 调用

c - 如何编写 DD-WRT C 应用程序?

regex - 如何删除与模式匹配的特定数量的随机行

linux - 使 ExecStartPost 命令在后台运行

javascript - .json()用于错误处理的内容是什么?

c++ - "~ "如何在 C 中找到补集?