从Linux FIFO读取时出错

时间:2014-04-15 08:33:55

标签: linux fifo

在我正在开发的嵌入式应用程序中,我们有一个串行端口抽象,我正在研究一种模拟的抽象变体,当你没有在'真正的'硬件上运行时使用。我正在使用FIFO文件,因为你可以插入你想要与实际应用程序通信的软件,但是我遇到了“读取”功能的问题,这标志着你给它一个无效的fd。虽然我已经使用调试工具来验证传递给它的fd与之前打开的相同,但它应该是有效的。我找不到任何导致这个问题的原因。

通过此功能打开FIFO文件:

int createOpenFifo(const std::string& path, int flags)
{
   int fd = open(path.c_str(), flags);
   if (fd < 0)
   {
      mkfifo(path.c_str(), 0777);
      fd = open(path.c_str(), flags);
      if (fd < 0)
      {
         return -1;
      }
   }
   return fd;
}

然后使用以下函数写入FIFO:

int write_serial(handle_t handle, size_t length, const uint8_t* pData)
{
    SerialFifoData* data = static_cast<SerialFifoData*>(handle);

    size_t written = 0;
    while (written < length)
    {
        int result = write(data->writeFd, pData + written, length - written);
        if (result < 0)
        {
           return -1;
        }
        written += result;
    }

    return 0;
}

最后阅读使用此功能:

int read_serial(handle_t handle, size_t buffer_size, uint8_t* pBuffer, size_t* bytes_read)
{
    SerialFifoData* data = static_cast<SerialFifoData*>(handle);

    int return_val = read(data->readFd, pBuffer, buffer_size);

    if (return_val < 0)
    {
        if (errno == EAGAIN || errno == EWOULDBLOCK) // Non-blocking, no data
                                                     // which flag is raised
                                                     // varies between POSIX
                                                     // implementations
        {
            *bytes_read = 0;
            return -2;
        }
        return -1;
    }

    *bytes_read = return_val;
    return 0;
}

我已经验证每个函数都接收到正确的输入,并且读取和写入调用几乎与用于实际串行端口代码的函数相同(唯一的区别是FD从句柄中提取的方式)它们工作得很好

0 个答案:

没有答案
相关问题