Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在同一串行端口上同时读/写_C++_Serial Port - Fatal编程技术网

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

C++ 在同一串行端口上同时读/写,c++,serial-port,C++,Serial Port,我正在构建一个应用程序,通过接收传输、修改数据并回显更改后的结果来连接串行通信线路 传输的数据由高波特率的状态信号和大量数据组成 我创建了两个线程,一个读取sentace并将指向每个新sentance的指针推入队列,另一个从队列中弹出指针,对其进行操作,将其发送到串行端口并删除指针 队列操作在带有CriticalSection锁的外部函数中,因此工作正常 为了确保队列不会很快溢出,我需要快速发送消息,而不是等待接收结束 据我所知,串行端口可以同时接收和传输,但尝试这样做会导致访问错误 另一种解决

我正在构建一个应用程序,通过接收传输、修改数据并回显更改后的结果来连接串行通信线路

传输的数据由高波特率的状态信号和大量数据组成

我创建了两个线程,一个读取sentace并将指向每个新sentance的指针推入队列,另一个从队列中弹出指针,对其进行操作,将其发送到串行端口并删除指针

队列操作在带有CriticalSection锁的外部函数中,因此工作正常

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

据我所知,串行端口可以同时接收和传输,但尝试这样做会导致访问错误

另一种解决方案是将系统分成两个不同的端口,但我尽量避免使用,因为硬件会发生变化,并且需要另一个USB和转换器

我读过关于重叠结构的书,但并没有完全理解它们的用途,而且,据我所知,它们管理asinc操作,而我的问题是并行操作

对不起,我的英语不好,任何帮助或解释都会有帮助

我将此类用于串行通信,将overlapped设置为在打开comport时启用,以允许等待事件超时:

提前谢谢

罗马人

澄清: 我不会打开端口两次,只在主程序中打开一次,然后将处理程序传递给两个线程(现在编写它会使这种方法的问题最大化)

更多详情:

错误来自Cserial库: “Cserial::read overlapped complete With result.”在发送线程中注释send back to serial命令不会引发错误,队列已填充并正确显示-


我在一个没有互联网接入的分类系统上,所以我不能上传样本,从我的平板电脑上写。错误发生在我得到第一个sentace后,这会在队列大小改变时触发第一个send命令ss,然后由于receive失败,接收线程退出,因此队列停止填充,没有发送任何内容

可能是因为两者都使用相同的串行处理程序,但有什么替代方法可以同时访问相同的端口而不锁定一个线程或另一个线程

忽略错误996,它是“读取重叠完成,无结果”的错误id,并且在检测到它时不退出线程,这会导致接收到的传输数据错误(缺少字节)

在问了很多问题后,在按钮线上:

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


usb中的D+/-是传输/接收线还是传输和接收线都使用?

两个线程不能在单端口/文件描述符上运行。根据您使用的库,您应该尝试异步执行此操作,或者通过检查在不阻塞线程的情况下可以读取/写入多少字节来执行此操作。(如果是Linux原始文件描述符,则应查看轮询/选择)

“:读取重叠完成,无结果”

您是否正在防止操作系统将执行切换到写入线程而中断读取?您需要使用互斥锁或类似工具来防止这种情况发生

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

如果读操作是两条独立的通信线路,为什么读操作会被写操作中断

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

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

这将使您对所发生的问题有一个全面的了解,除非您阻止操作系统运行读写操作。这是一个意见问题,我们最好使用多线程和互斥对象(或等效对象)或异步事件驱动设计。

唯一可能出错的是尝试多次打开端口。不支持,线程需要使用相同的句柄。有趣的问题。您是通过USB到串行转换器还是串行端口访问串行端口?如果我创建两个互不阻塞的串行端口并在如果有两个不同的物理接口,它是可以的,但是不能访问同一个物理端口的两次。在ButtoM线中,数据可以在C++中同时进出同一端口吗?我不能允许发送被截取。所有接收到的数据都必须回响。另一个pott是一个简单的解决方案,我现在尽量避免,因为我没有另一个转换器,无法调试接收端