【问题标题】:Cannot communicate serial port with different COM无法与不同的 COM 通信串口
【发布时间】:2016-12-27 17:57:32
【问题描述】:

我在与 Windows 的串行端口通信时遇到问题。

我有一个用 C 语言编写的 Windows 服务。 此服务已准备好侦听来自应用程序的请求以与 Pinpad 通信。很简单。

问题出现在Pinpad的com分配时,有时分配给COM4,COM5,COM9(这些com都正常工作),所以当Pinpad的comm得到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 会告诉我们什么?

标签: c windows serial-port


【解决方案1】:

无效的 com 端口名称。

"COM9" 之后的 com 端口需要不同的字符串格式。
Specify Serial Ports Larger than COM9

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多