2013-04-07 155 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”