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;
}
がどのようにCreateFileAがComXXポートに成功している知っていますか?失敗し、ERROR_FILE_NOT_FOUND以外の何かを返す可能性があります。 GetCommStateが失敗した場合、GetLastErrorは何を通知しますか? –