gpt4 book ai didi

c - 串行 COM 端口未打开

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:36 30 4
gpt4 key购买 nike

我正在尝试在 Win32 应用程序中打开串行 COM 端口。端口打开正确,但我可以发送接收字节,就像我之前使用 Teraterm 或 Hyperterminal 打开它一样。

如果我从设备管理器中停用和激活 COM 端口(因此该端口刚刚未使用),我只需使用 Teraterm 或 Putty 打开 COM 端口,然后关闭它,然后运行我的软件,我就可以正确发送和接收在任何时候。

我正在使用带有 FileMonkey 的 Embarcadero X3 来使应用程序同时与 MACOSX 和 Win32 兼容。 FileMonkey 不支持 VCL。

相同的代码在使用 VCL 的 Builder 6 c++ 上运行良好,但无论如何都不应该影响它。我的代码非常简单。

这是一个非常奇怪的行为。似乎我需要先初始化 COM(我正在使用 FTDI 转换器),然后才能使用它,当 PC 重新启动或我从设备管理器中停用并激活 COM 时,这个 INIT 似乎消失了,我只需要打开COM 以使用另一个串口软件将其恢复,然后使用我的软件。

注意:一旦端口为 INIT,我就可以通过我的软件进行完全控制。我确信我的代码确实打开了 COM 端口,因为如果我尝试将它与其他软件一起使用,一旦 iNIT 完成,COM 就会显得很忙。因此,到目前为止,没有火警,而且应用程序在另一侧正常工作。

这个问题困扰我很久了,现在我决定解决它!

这是我的代码:

// GLOBAL VARIABLES
HANDLE hComm = NULL;
COMMTIMEOUTS ctmoNew = {0}, ctmoOld;

DCB dcbCommPort;
hComm = CreateFile("COM2",

GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);

if(hComm == INVALID_HANDLE_VALUE)
{

Application->Terminate();
}

GetCommTimeouts(hComm,&ctmoOld);
ctmoNew.ReadTotalTimeoutConstant = 100;
ctmoNew.ReadTotalTimeoutMultiplier = 0;
ctmoNew.WriteTotalTimeoutMultiplier = 0;
ctmoNew.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm, &ctmoNew);
dcbCommPort.DCBlength = sizeof(DCB);
GetCommState(hComm, &dcbCommPort);
BuildCommDCB("115200,N,8,1", &dcbCommPort);
SetCommState(hComm, &dcbCommPort);

最佳答案

只是一种可能,不确定是不是这个问题。

但与我们典型的 COM 端口打开代码的一个区别是我们使用 SetupCom在 CreateFile 成功后直接设置我们的缓冲区大小,通常为 4KB。

关于c - 串行 COM 端口未打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15862823/

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