【发布时间】:2014-06-05 13:10:12
【问题描述】:
我正在构建一个应用程序,它通过接收传输、修改数据和回显更改的结果来截断串行通信线路。
传输的数据由高波特率的状态语句组成,数据量很大。
我创建了两个线程,一个读取语句并将指向每个新语句的指针推送到队列中,另一个将指针从队列中弹出,操作它们,将它们发送到串行端口并删除指针。
队列操作位于带有 CririticalSection 锁的外部函数中,因此可以正常工作。
为了确保队列不会很快溢出,我需要快速发送消息,而不是等待接收结束。
据我了解,串行端口可以同时接收和传输,但尝试这样做会导致访问限制出错。
另一种解决方案是将系统分成两个不同的端口,但我尽量避免这样做,因为硬件发生了变化,并且需要另一个 USB 和转换器。
我阅读了有关重叠结构的信息,但没有完全理解它们的用途,并且据我所知,它们管理 asinc 操作,而我的问题是并行操作。
对不起,我蹩脚的英语,任何帮助或解释都会有所帮助。
我将这个类用于串行通信,设置重叠以在打开 comport 时启用以允许等待事件超时:
http://www.codeproject.com/Articles/992/Serial-library-for-C
提前致谢。
罗马式。
澄清: 我没有打开端口两次,只在主程序中打开一次并将处理程序传递给两个线程(现在编写它可以最大化这种方法中的问题
更多细节:
错误来自 Cserial 库: “Cserial::read 完全重叠,没有结果。”在发送线程中注释 send back to serial 命令不会引发错误,队列已填满并正确显示–
我在一个没有互联网访问的机密系统上,所以我无法上传样本,用我的平板电脑写。在我得到第一个sentace之后,错误就出现了,它会在队列大小发生变化时立即触发第一个发送命令ss,然后接收线程因为接收失败而退出,所以队列停止填充并且没有任何发送。
可能是因为两者都使用相同的串行处理程序,但是在不锁定一个线程或另一个线程的情况下同时访问同一端口的替代方法是什么
忽略错误996,这是“读取重叠完成但没有结果”的错误ID,并且在检测到它时不退出线程,这使得两者都接收到传输的数据错误(丢失字节)
在最后一行,问了很多问题后:
如果这是两条单独的通信线路,为什么读取操作会被写入操作中断?我可以为同一端口上的每个任务使用两个处理程序吗?
usb 中的 D+/- 是发送/接收还是同时用于发送和接收?
【问题讨论】:
-
您唯一可能做错的事情就是尝试多次打开端口。不支持,线程需要使用相同的 HANDLE。
-
有趣的问题。您是通过 USB 转串口转换器还是串口访问串口?
标签: c++ serial-port