【发布时间】:2013-10-29 22:28:17
【问题描述】:
我在 Linux 系统中从串口读取数据时遇到问题。我正在尝试使用 UART 将传感器与 linux 系统连接起来。我可以读写/dev/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));
【问题讨论】:
-
你在使用select调用异步读取吗?
-
首先要评估的是这个传感器的数据是什么样的?是二进制数据还是ASCII文本;即你可以使用直线纪律吗?您的 termios 设置代码写得不好;尝试阅读Serial Programming Guide for POSIX Operating Systems
标签: c linux asynchronous serial-port uart