2013-04-07 157 views
2

我想在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); 

回答

1

只是一種可能性,不是肯定,這就是問題所在。

但是與我們典型的COM端口開放代碼不同的是,我們在CreateFile成功後直接使用SetupCom並設置我們的緩衝區大小,通常爲4KB。

0

將設置更改爲:

「115200,NOPARITY,8,ONESTOPBIT」