我想在Win32應用程序中打開串行COM端口。端口打開正確,但我可以發送一個接收字節,只要我以前使用Teraterm或超級終端打開它。串行COM端口沒有打開
如果我從設備管理器中禁用並激活COM端口(所以端口剛剛未使用),我只需用Teraterm或Putty打開COM端口,然後關閉它然後運行我的軟件即可發送和接收在任何時候都適當。
我正在使用Embarcadero X3和FileMonkey使應用程序與MACOSX和Win32同時兼容。 FileMonkey不支持VCL。
相同的代碼使用VCL在Builder 6 C++上正常工作,但它不應該影響它。我的代碼非常簡單。
這是一個非常奇怪的行爲。似乎我需要INIT 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);