在我正在开发的嵌入式应用程序中,我们有一个串行端口抽象,我正在研究一种模拟的抽象变体,当你没有在'真正的'硬件上运行时使用。我正在使用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从句柄中提取的方式)它们工作得很好