2016-12-27 86 views
0

我真的有与Windows的串口通信的问题。不能通信的串行端口与不同的COM

我有一个Windows服务用C写的 这项服务是愿意听取来自有密码键盘进行通信的应用请求。很简单。

当Pinpad的Com被分配时,有时会分配COM4,COM5,COM9(这些coms工作正常),所以当Pinpad的comm得到COM10或更高版本时,出现错误,而且我不能与pinpad进行通信。它向我发送一个错误,已经定义了这个错误,但我想不出有什么问题,在功能CreateFileA引起。一切都运行完美,我的意思是,它返回一个句柄,但在接下来的功能:GetCommState,我得到的错误。

int srlOpen(char * szCOM) 
{ 
    DCB dcbSrlParms; 
    COMMTIMEOUTS timeouts; 
    int inRetVal = P_SUCCESS; 
    memset(&dcbSrlParms, 0x00, sizeof(dcbSrlParms)); 
    memset(&timeouts, 0x00, sizeof(timeouts)); 

if(inRetVal > P_ERROR) 
{ 
    hSerial = CreateFileA(szCOM, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL,0); 
    //hSerial = CreateFileA("COM21", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 
    // FILE_ATTRIBUTE_NORMAL,0); 
    if(hSerial == INVALID_HANDLE_VALUE) 
    { 
     if(GetLastError() == ERROR_FILE_NOT_FOUND) 
     { 
      inRetVal = ERR_PORT_NOT_FOUND; 
     } 
    } 
} 

if(inRetVal > P_ERROR) 
{ 
    dcbSrlParms.DCBlength = sizeof(dcbSrlParms); 
    if(!GetCommState(hSerial, &dcbSrlParms))   
    { 
     inRetVal = ERR_GET_PORT_CONFIG; 
    } 
} 

if(inRetVal > P_ERROR) 
{ 
    dcbSrlParms.BaudRate = CBR_19200; 
    dcbSrlParms.ByteSize = 8; 
    dcbSrlParms.Parity = NOPARITY; 
    dcbSrlParms.StopBits = ONESTOPBIT; 

    if(!SetCommState(hSerial, &dcbSrlParms)) 
    { 
     inRetVal = ERR_SET_PORT_CONFIG; 
    } 
} 

if(inRetVal > P_ERROR) 
{ 
    timeouts.ReadIntervalTimeout = COMM_READ_INT_TMEOUT; 
    timeouts.ReadTotalTimeoutConstant = COMM_READ_TOTAL_TIMEOUT; 
    timeouts.ReadTotalTimeoutMultiplier = COMM_READ_TOTAL_MULTI; 
    timeouts.WriteTotalTimeoutConstant = COMM_WRITE_TOTAL_TIMEOUT; 
    timeouts.WriteTotalTimeoutMultiplier = COMM_WRITE_TOTAL_MULTI; 

    if(!SetCommTimeouts(hSerial, &timeouts)) 
    { 
     inRetVal = ERR_SET_TIMEOUT_CONFIG; 
    } 
} 

pdebug (("inRetVal=%x", inRetVal)); 
return inRetVal; 
} 
+1

你怎么知道CreateFileA的成功就ComXX端口?它可能会失败并返回ERROR_FILE_NOT_FOUND以外的内容。如果GetCommState失败,GetLastError会告诉什么? –

回答

0

无效的com端口名称。

一个COM端口过去"COM9"需要一个不同的字符串格式。
Specify Serial Ports Larger than COM9

srlOpen("COM9");   //OK 
srlOpen("COM10");  //Not OK 
srlOpen("\\\\.\\COM9"); //OK 
srlOpen("\\\\.\\COM10"); //OK