我正在尝试在Win32应用程序中打开串行COM PORT。端口正确打开但我可以发送一个接收字节,如果我之前使用Teraterm或Hyperterminal打开它。
如果我从设备管理器中取消激活并激活COM端口(因此端口刚刚未使用)我只需用Teraterm或Putty打开COM端口,然后关闭它然后运行我可以发送和接收的软件在任何时候。
我正在使用Embarcadero X3和FileMonkey同时使应用程序与MACOSX和Win32兼容。 FileMonkey不会支持VCL。
相同的代码在使用VCL的Builder 6 c ++上运行良好,但它不应该影响它。我的代码很简单。
这是一种非常奇怪的行为。好像我需要在我可以使用它之前进入COM(我正在使用FTDI转换器),当PC重新启动或我从设备管理器停用并激活COM时,似乎这个INIT消失了,我只需要打开COM使用另一个串行软件恢复它,然后使用我的软件。
注意:一旦端口是INIT,我就可以完全控制我的软件。我确信我的代码真正打开了COM端口,因为如果我尝试将iNIT与其他软件一起使用,那么一旦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);
答案 0 :(得分:1)
只是一种可能性,不确定这是问题所在。
但我们典型的COM端口开放代码的一个不同之处是我们在CreateFile成功后直接使用SetupCom并设置缓冲区大小,通常为4KB。