我是用sdk
协议规定有两类指令:
1)计算机主动下发,终端机应答。
    这个我是写文件,再读文件(使用超时设置)。我想这样用应该没问题。
2)终端机主动上传,计算机应答。
    而指令是不定长的,问题就在这。我要去循环检查是否来数据,然后检查是什么指令。麻烦是两点,1指令不定长,2接受的数据不一定是正确的。还好有固定的指令起始字符,可以减少搜索次数。不知道大家是用什么方法处理的?

解决方案 »

  1.   

    定义自己的通信协议比方说0x01是计算机主动下发。0x02是终端机上传,0x03是转义字符。0x04本次传输是指令,0x05本次传输是数据...再加奇偶校验等。比方说计算机主动下传1号指令则传输的数据为0x01 0x04 0x03 0x01...
      

  2.   

    to ZHENG017(风中王子):
        我的问题是指令不定长时接受的过程和指令判断。我不理解您说的意思
      

  3.   

    waitcommevent()
    不用去检测,来数据再去收便是
      

  4.   

    waitcommevent()不是中断吧,退不出来。232的接收中断是什么意思?
      

  5.   

    给你看看我的串口接受线程函数:
    //功能:
    //    监视线程函数,用来接收串口数据
    //参数:
    //    类的this指针
    //返回值:无意义
    DWORD WINAPI TCommPort::WatchCommThread(LPVOID pComm)
    {
    //标志是否在等待串口事件的完成
    BOOL bWaitStatus = FALSE;
    //接收串口事件
    DWORD dwCommEvent;
    //接收WaitCommEvent的结果
    DWORD dwWaitComm;
    //每次实际读到的串口数据量
    int nReadCount;
    //TCommPort类指针
        TCommPort * pCom = (TCommPort *)pComm;
    //重叠对象
    OVERLAPPED OLComm = {0};
        OLComm.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    pCom->m_hKillWatch = CreateEvent(NULL,FALSE,FALSE,NULL);
    //事件数组
    HANDLE hEvents[2] ={pCom->m_hKillWatch,OLComm.hEvent};
    //设置事件掩码
    DWORD dwWaitResult;
    //读缓冲区
    BYTE lpbBuf[160];
    //一次读取量
    int nMaxLen = 160;
    //循环结束标志
    BOOL bDone = FALSE; OutputDebugString("The Watch Comm Thread Run... \n"); if(!SetCommMask(pCom->m_hCom,EV_RXCHAR))
    bDone = TRUE;
    while(!bDone)
    {
    if(!bWaitStatus)
    dwWaitComm = WaitCommEvent(pCom->m_hCom,&dwCommEvent,&OLComm);
    if(!dwWaitComm)    //等待串口事件失败 
    {
    bWaitStatus = TRUE;
    if(GetLastError() ==  ERROR_IO_PENDING)
    {
    dwWaitResult = WaitForMultipleObjects(2,hEvents,FALSE,INFINITE);
    switch(dwWaitResult)
    {
    case 0:  //退出事件
     bDone = TRUE;
     break;
    case 1:  //串口事件
     nReadCount =1;
     while(nReadCount)             
     {                 //读串口
     nReadCount = pCom->ReadCommBlock(lpbBuf,nMaxLen);
     if(nReadCount)         //保存数据  
     pCom->m_RecvDataQueue.InsertOver(lpbBuf,nReadCount);
     }
     bWaitStatus = FALSE;
     break;
    }
    }
    else    //发生串口错误    
    bDone = TRUE;
    }
    else        //等待串口事件成功
    {
                nReadCount = 1;
    while(nReadCount)              
    {              //读串口
    nReadCount = pCom->ReadCommBlock(lpbBuf,nMaxLen);
    if(nReadCount)         //保存数据  
    pCom->m_RecvDataQueue.InsertOver(lpbBuf,nReadCount);
    }
     bWaitStatus = FALSE;
    }
    }
    CloseHandle(OLComm.hEvent);
    CloseHandle(pCom->m_hKillWatch);
    OutputDebugString("The Watch Comm Thread Exit... \n");
    return 0;
    }