我正在构建一个应用程序,它通过接收传输,修改数据和回显更改的结果来使串行通信线发生间隔。
传输的数据由高波特率的状态发送和大量数据组成。
我创建了两个线程,一个读取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 +/-是传输/接收还是两条线用于传输和接收?
答案 0 :(得分:0)
两个线程无法在单个端口/文件描述符上运行。根据您使用的库,您应该尝试异步或通过检查可以读取/写入多少字节而不阻塞线程。 (如果是Linux原始文件描述符,你应该看看民意调查/选择)
答案 1 :(得分:0)
“:读取重叠完成而没有结果”
您是否阻止读取被OS切换执行到写入线程中断?您需要使用互斥锁或类似工具来防止这种情况发生。
真正的解决方案是切换到异步库,例如bosst :: asio。
如果这些是两条单独的通信线路,为什么写操作会中断读取操作?
这里有一个可能的挥手可视化,如果您在两个线程中使用同步操作而不将它们相互锁定,会发生什么。 (我猜测你如何安排软件的细节)
这可以让您对发生的问题进行一般性的了解,除非您使操作系统不会在彼此的顶部运行读写操作。值得注意的是,使用多线程与互斥(或等效)或异步事件驱动设计更好。