为什么在使用vxWorks管道时丢失数据?
时间:2020-03-06 14:33:53 来源:igfitidea点击:
我正在使用管道在两个vxWorks任务之间传输信息。
这是一个代码示例:
Init() { fd = open("/pipe/mydev", O_RDWR, 0777); ... } taskRx() { ... len = read(fd, rxbuf, MAX_RX_LEN); ... } taskTx() { ... len = write(fd, txbuf, txLen); ... }
如果我们发送的消息长于MAX_RX_LEN(即txLen> MAX_RX_LEN),我们将进行2次读取以获取消息的其余部分。
我们注意到的是,第二次读取没有收到任何数据!
这是为什么?
解决方案
VxWorks的管道机制不是基于流的(与Unix命名管道不同)。
它是vxWorks消息队列工具之上的一层。因此,它与消息队列具有相同的限制:从管道读取消息时,我们实际上是在读取整个消息。如果接收缓冲区没有足够的空间来存储接收到的数据,那么溢出将被简单地丢弃。
对消息队列或者管道执行接收时,请始终确保将缓冲区设置为队列元素的最大大小。