gpt4 book ai didi

c++ - 如何允许线程 2 在我在线程 1 中打开的端口上进行通信?

转载 作者:行者123 更新时间:2023-11-27 23:08:50 26 4
gpt4 key购买 nike

我正在尝试使用 CLI C++ 程序中的两个不同线程与同一个端口通信(在 Windows 上运行但不使用 Windows API)。该端口是 USB 端口(连接到 RS-232 转换器,然后连接到另一台设备)。我可以使用 OpenCom()Transmit() 在我的 main 线程中成功建立端口通信,这些函数的制造商在 DLL 中提供设备。

然后我调用 newThreadFunc()(在另一个 DLL 中定义),它在单独的线程中运行(我们称之为回调线程)并调用回调函数。在该回调函数中,我再次调用 Transmit(),但现在返回错误(由 DLL 定义):“Port not ready (CreateFile)”。

这是简化的伪代码:

#include "Device.h"            // contains OpenCom() & Transmit()

const short comPort = 3; // COM port number (global)

int main(int argc, char* argv[]) {

OpenCom(comPort); // Open the port
Transmit(command); // where "command" represents some command

newThreadFunc(taskHandle); // Creates new "callback thread" and calls callbackFunc
getchar(); // wait while other thread runs
return 0;
}

signed long __cdecl callbackFunc (params) {
Transmit(command); // error: "Port not ready (CreateFile)"
OpenCom(comPort); // error: "Port already open (CreateFile)"
}

如果我在回调线程中调用 OpenCom,我会得到这个错误:“Port already open (CreateFile)”。因此回调线程可以看到端口已打开但无法在其上进行通信。我知道我应该用互斥锁或类似的东西以某种方式管理端口通信,但是回调线程无法在端口上通信的原因是什么?以及如何让回调线程在我在主线程中打开的端口上进行通信?

最佳答案

串口是非常简单的设备,它们只支持不透明的字节流。没有协议(protocol)允许两个线程或两个应用程序共享一个端口。没有什么能像 TCP 那样允许通过单个网络连接与特定端口号建立逻辑连接。在OSI model ,一个串口占据最底层,物理层。由于没有出现在其之上构建层的标准,因此没有人就第 2 层应该是什么样子达成一致。用于调制解调器的 Hayes AT 协议(protocol)达到了前所未有的高度。

因此,如果操作系统实际上允许您这样做,那么结果将非常糟糕。一个应用程序或线程会窃取对另一个应用程序或线程的输入,这永远不会有好结果。所以你真的确实必须自己处理这个并打开端口一次。使用某种方案来仲裁对确定哪个线程获取输入的端口的访问。就像一个互斥体。或者您创建的网络层具有逻辑目标地址,这在总线协议(protocol)中很常见。这可以像消息中的单个字节一样简单。但是当然增加了实现数据链路层并指定消息帧格式的要求,以便可以可靠地读取该字节。这也很常见,每个人都自己旋转。

关于c++ - 如何允许线程 2 在我在线程 1 中打开的端口上进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21525516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com