一个串口编程问题,采用modbus协议与多机进行通讯,请大家指教。
网络中通过串口与多台下位机相连,下位机台数由软件设定,可变,采用MODBUS协议(RTU格式)。 我需要实时查询各台下位机的状态,并且要可随时给下位机发送控制数据。
对查询各台下位机的状态,我设置一个定时器,在定时期里周期性的给各台下位机发送查询数据帧,格式如下:
void ****::OnTimer(UINT nIDEvent)
{
C***Doc* pdoc=(C***Doc*)this->GetActiveDocument();
int temp,bytecount;
for(int No=0;No<pdoc->airnum;No++) //pdoc->airnum 机器台数
{
COleVariant varOutput;
CByteArray outbuf;
//读Coil(R/W)数据,开关量
...........//构造MODBUS数据格式函数
m_comm.SetOutput(varOutput);
//读Input register(R)状态数据,连续区域
...........//构造MODBUS数据格式函数
m_comm.SetOutput(varOutput);
//读Holding register(R/W)控制数据,连续区域
...........//构造MODBUS数据格式函数
m_comm.SetOutput(varOutput);
//读Input register(R)报警数据,连续区域
...........//构造MODBUS数据格式函数
m_comm.SetOutput(varOutput); }
CFrameWnd::OnTimer(nIDEvent);
}
由于每个帧的数据长度不同,我在OnCommMscomm()中接收每个帧的回应时数据长度也是不一样的接受数据时也不知道本帧数据长度,怎么设置读取缓冲区的字节数,若是全部读取,那下一帧的数据就会丢失一部分。另外该如何设置中断触发时,是不是缓冲有一个数据时就触发接受一个,还是我该怎样读数据,MODBUS协议RTU下,我在VC中怎样判断每个帧起停,另外我采用CRC校验,当计算CRC错误时,我是不马上构造一包含错误消息的帧发出去,要求相应的机器重发,但是在构造的时候,我如何确定该帧的地址,也就是我怎样判断该把这个帧发给哪个下位机呢。
MODBUS协议RTU模式帧格式:T1-T2-T3-T4|8 bits 地址|8bits 功能码| n*8bits 数据 |16bits CRC校验码| T1-T2-T3-T4
T1-T2-T3-T4 是时间间隔
另外在OnTimer()外的不定时间,还要构造发送控制数据的帧给指定地址的下位机,下位机的回应帧也不是固定长度,这个帧也是在OnCommMscomm()中进行接受处理的。
请各位高手指教,帮我想个具体的实现方法。分不够在加。