通过串口与设备进行通讯,使用了codeproject上面的CSerialPort封装类(Naughter)。向设备下发命令的时候一切都好,设备也能够执行指定的动作。但是根据设备的通信协议,命令执行成功之后将回送一个响应信息。
程序需要处理这个响应信息,可是每次读到的内容都是此前发送的内容?
把读取的代码注释掉再运行代码发送命令,然后通过超级终端可以看到设备响应的内容是正确的,我就不知道为什么了。还有,如何使用串口通信的事件掩码呢?
比如说在接收缓冲区出现字符的情况下,我想马上执行读取的动作,
是不是需要等待EV_RXCHAR?是不是需要首先设置这个掩码?MSDN看不太明白,望不吝赐教!!!
谢谢!!!

解决方案 »

  1.   

    这是请求/应答的通讯模式,我没有用CSerialPort,我自己编写了一个类
    extern "C" DllExport int WINAPI OpenComm(int nPort, int nBaudrate, int nComType)
    {
    COMMTIMEOUTS TimeOuts;
    char szComPort[10];

    if (bOpened)
    return COMM_HAVE_OPENED; if (nPort <= 0)
    nPort = 0;
    if (nBaudrate < 0)
    nBaudrate = 0;
    if (nBaudrate > 4)
    nBaudrate = 4;
    if (nComType < 0)
    nComType = 0;
    if (nComType > 1)
    nComType = 1;
    COM_1.Baud = (BYTE)nBaudrate;
    COM_1.Port = (BYTE)nPort; sprintf(szComPort, "COM%d", COM_1.Port);
    if ((hComm = CreateFile (szComPort, GENERIC_READ | GENERIC_WRITE,
                     0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
        {
    bOpened = FALSE;
    return COM_OPEN_FAILED;
    } SetupComm (hComm, 256, 256);       // allocate transmit & receive buffer if (nComType == 1)
    if (!OpenIrDA ())
    {
    CloseHandle (hComm);
    bOpened = FALSE;
    return IR_SET_FAILED;
    }   switch (COM_1.Baud)
           {
           case 0 :  dcb.BaudRate = CBR_115200;  break;
           case 1 :  dcb.BaudRate = CBR_57600;   break;
           case 2 :  dcb.BaudRate = CBR_38400;   break;
           case 3 :  dcb.BaudRate = CBR_19200;   break;
           case 4 :  dcb.BaudRate = CBR_9600;    break;
           } dcb.ByteSize = 8;
        dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT; dcb.fBinary = TRUE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fNull = FALSE;
    dcb.fErrorChar = FALSE; if (SetCommState (hComm, &dcb) < 0)
        {
    CloseHandle (hComm);                    // close the COM port.
    bOpened = FALSE;
    return GENERAL_ERROR;
    } TimeOuts.ReadIntervalTimeout = MAXDWORD;
    TimeOuts.ReadTotalTimeoutMultiplier = 0;
    TimeOuts.ReadTotalTimeoutConstant = 0;
    TimeOuts.WriteTotalTimeoutMultiplier = 5;
    TimeOuts.WriteTotalTimeoutConstant = 50;
    SetCommTimeouts (hComm, &TimeOuts);          // check dwProvCapabilities bOpened = TRUE;
    return SUCCESS;
    }//-------------------------------------------------------------------------//
    void Send_Read (char *szSend, int nLen)
    {
    DWORD dwChar = 0;
        WriteFile (hComm, szSend, nLen, &dwChar, NULL);
        ReadCom ();
    }//-------------------------------------------------------------------------//
    void ReadCom (void)
    {
        static  BYTE   szIn [16];             // Input buffer for received data.
        DWORD   dwTime, i, nCnt=0;
        BYTE    cRet=0;
    DWORD dwChar;    szRead [0] = 0;
        dwTime = GetTickCount() + TIMEOUT;    while (cRet != '\r' && nCnt < 10)
    {
            if (ReadFile (hComm, szIn, 3, &dwChar, NULL) && dwChar > 0)
    {
                for (i=0; i<dwChar; i++)
                    szRead [nCnt++] = szIn [i];
                cRet = szIn [i-1];
    }        if (GetTickCount() > dwTime)
                break;
    }    if (nCnt > 0 && szRead [nCnt-1] == '\r')
            szRead [nCnt-1] = 0;                           // exclude CR
    }
      

  2.   

    其中Send_Read就是用来“先发送,然后等待回应”的函数。与穿口设备通讯一般都是这种通讯模式
      

  3.   

    sorry,问题解决了。
    原因在于我自己没有在命令结束的时候按照设备协议使用回车作为结束。
    不过那样居然命令也能够被设备执行,只是没有状态上报信息了。
    不好意思~~~,再一次感谢刻苦学习。