我是用sdk
协议规定有两类指令:
1)计算机主动下发,终端机应答。
这个我是写文件,再读文件(使用超时设置)。我想这样用应该没问题。
2)终端机主动上传,计算机应答。
而指令是不定长的,问题就在这。我要去循环检查是否来数据,然后检查是什么指令。麻烦是两点,1指令不定长,2接受的数据不一定是正确的。还好有固定的指令起始字符,可以减少搜索次数。不知道大家是用什么方法处理的?
协议规定有两类指令:
1)计算机主动下发,终端机应答。
这个我是写文件,再读文件(使用超时设置)。我想这样用应该没问题。
2)终端机主动上传,计算机应答。
而指令是不定长的,问题就在这。我要去循环检查是否来数据,然后检查是什么指令。麻烦是两点,1指令不定长,2接受的数据不一定是正确的。还好有固定的指令起始字符,可以减少搜索次数。不知道大家是用什么方法处理的?
我的问题是指令不定长时接受的过程和指令判断。我不理解您说的意思
不用去检测,来数据再去收便是
//功能:
// 监视线程函数,用来接收串口数据
//参数:
// 类的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;
}