在同一串行端口上同时读/写

时间:2014-06-05 13:10:12

标签: c++ serial-port

我正在构建一个应用程序,它通过接收传输,修改数据和回显更改的结果来使串行通信线发生间隔。

传输的数据由高波特率的状态发送和大量数据组成。

我创建了两个线程,一个读取sentaces并将指向每个新sentance的指针推入队列,而Other将指针弹出队列,操纵它们,将它们发送到串行端口并删除指针。

队列操作在具有CririticalSection锁的外部函数中,因此工作正常。

为了确保队列不会快速溢出,我需要快速发送消息,而不是等待接收结束。

据我所知,串口可以同时接收和传输但是尝试这样做会给出访问重建带来错误。

另一个解决方案是将系统拆分为两个不同的端口,但我试图避免它,因为硬件发生了变化,需要另外一个USB和转换器。

我读到了Overlapped结构,但没有完全理解它们的用法是什么,并且当我得到它时,它们管理asinc操作,我的问题是并行操作。

对不起我的蹩脚英语,任何帮助或解释都会有所帮助。

我使用此类进行串行通信,设置重叠以在打开comport时启用以允许等待事件超时:

http://www.codeproject.com/Articles/992/Serial-library-for-C

提前致谢。

罗马。

澄清: 我没有打开端口两次,只在主程序中打开一次并将处理程序传递给两个线程(现在编写它可以最大化此方法中的问题

更多详情:

错误来自Cserial库:  " Cserial :: read重叠完成但没有结果。"在发送线程中注释send back to serial命令不会引发错误并且队列已填满并正确显示 -

我在没有互联网访问权限的分类系统上,所以我无法上传样本,从我的平板电脑写。在我获得第一个sendace之后,错误得以实现,当队列大小发生变化时会立即触发第一个发送命令,然后接收线程因为收到故障而退出,因此队列停止填充并且没有任何发送。

可能是因为两者都使用相同的串行处理程序,但是如果不锁定一个线程或另一个线程,可以选择同时访问同一个端口

忽略错误996,这是"读取重叠的错误ID,没有结果"并且在检测到它时两个都没有退出线程使得两个传输数据都错误(丢失字节)

在问题界线上,在询问了很多问题之后:

为什么读操作会被写操作中断,如果它们是两个单独的通信线?我可以在同一个端口上为每个任务使用两个处理程序吗?

usb中的D +/-是传输/接收还是两条线用于传输和接收?

2 个答案:

答案 0 :(得分:0)

两个线程无法在单个端口/文件描述符上运行。根据您使用的库,您应该尝试异步或通过检查可以读取/写入多少字节而不阻塞线程。 (如果是Linux原始文件描述符,你应该看看民意调查/选择)

答案 1 :(得分:0)

“:读取重叠完成而没有结果”

您是否阻止读取被OS切换执行到写入线程中断?您需要使用互斥锁或类似工具来防止这种情况发生。

真正的解决方案是切换到异步库,例如bosst :: asio。

如果这些是两条单独的通信线路,为什么写操作会中断读取操作?

这里有一个可能的挥手可视化,如果您在两个线程中使用同步操作而不将它们相互锁定,会发生什么。 (我猜测你如何安排软件的细节)

  • 您的应用从端口收到读取请求。
  • 您的应用请求操作系统启动读取线程。
  • 操作系统同意,您的读取线程完成读取操作。 - 。您的应用正在进行处理。
  • 您的应用要求操作系统启动写入线程。
  • 操作系统同意,你的写线程开始写。
  • 第二个读取请求到达端口。这不会中断任何事情,只是等待。
  • 写入尚未完成,但操作系统决定写入线程有足够的时间。它决定将上下文切换到正在等待的读取线程。
  • 读取线程开始阅读
  • OS再次确定正在运行的线程(读取)在CPU上有一个公平的破解。它将上下文切换回写线程。这会导致未完成的读取崩溃。请注意,这种情况发生在您的软件中,而不是硬件或硬件驱动程序中。

这可以让您对发生的问题进行一般性的了解,除非您使操作系统不会在彼此的顶部运行读写操作。值得注意的是,使用多线程与互斥(或等效)或异步事件驱动设计更好。