16,472
社区成员
发帖
与我相关
我的任务
分享
//这是我写的只实现显示到文本中。
LONG CModbusSCommDlg::OnCommunication(WPARAM ch, LPARAM port)
{ CString str;
str.Format("%02X ",ch);
m_Receive+=str;//m_Receive为RichEdit的字符变量
BYTE data[50];//后面该怎么写
。。。。。。
show(data,50,len);//这是我处理解析报文的函数,len为报文长度
UpdateData(FALSE);
return 0;
}
// set the timeout values
m_CommTimeouts.ReadIntervalTimeout = 3;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
我把读字符间间隔设为3ms,但在响应函数oncommunication()我不知怎么得到超时时间,本来我打算得到超时事件算一帧的结束,这样行吗?
我有想oncommunication()加个计时器,每次计算两次响应oncommunication()的时间间隔,大于3ms算一帧报文结束,这样行吗?如型用什么计时,settimer()好像是固定时间循环的干某件事,好像不行
//定义一个虚拟基类作为各种报文处理的接口
class BaseProcess{
virtual bool IsMyType(string strHead)=0;
virtual int GetLen(string strHead)=0;
virtual void Process(string strMsg)=0;
}
//AI类报文
class ProcessAI:public BaseProcess{
...
}
//DI类报文
class ProcessDI:public BaseProcess{
...
}
//你的接收流程
void RecvMsg(){
vector<BaseProcess*> vec;
BuildVector(vec);//将各种报文处理类存入
string strHead=Recv(3);//modbus报文头总是3 bytes长
for(vector<>::iterator it=m_vec.begin();it!=m_vec.end();++it){
BaseProcess* pProc=*it;
if(pProc->IsMyType(strHead)){//扫描何种处理类有能力搞定
string strMsg=strHead+Recv(pProc->GetLen(strHead));//接收剩余报文
pProc->Process(strMsg);//处理
break;
}
}
}