2016-12-27 10 views
0

Windowsのシリアルポートと通信する際に問題があります。異なるCOMとシリアルポートを通信できません

私はCで書かれたWindowsサービスを持っています。 このサービスは、Pinpadと通信するアプリケーションからの要求を待ち受けます。ものすごく単純。

Pinpad's Comが割り当てられているときに問題が発生することがあります.COM4、COM5、COM9(これらのCOMは正常に動作しています)が割り当てられている場合があるため、Pinpadの通信がCOM10以降になるとエラーが発生し、ピンパッドと通信する。それは私にエラーを送信します、このエラーは既に定義されていますが、私は何が問題であるのかわかりません、関数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ポート名です。

"COM9"以降のCOMポートは異なる文字列形式を必要とします。
Specify Serial Ports Larger than COM9

srlOpen("COM9");   //OK 
srlOpen("COM10");  //Not OK 
srlOpen("\\\\.\\COM9"); //OK 
srlOpen("\\\\.\\COM10"); //OK 
関連する問題