2016-12-27 76 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