为什么在使用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消息队列工具之上的一层。因此,它与消息队列具有相同的限制:从管道读取消息时,我们实际上是在读取整个消息。如果接收缓冲区没有足够的空间来存储接收到的数据,那么溢出将被简单地丢弃。

对消息队列或者管道执行接收时,请始终确保将缓冲区设置为队列元素的最大大小。