一个串口编程问题,采用modbus协议与多机进行通讯,请大家指教。

killermat 2004-09-02 12:31:02
网络中通过串口与多台下位机相连,下位机台数由软件设定,可变,采用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()中进行接受处理的。
请各位高手指教,帮我想个具体的实现方法。分不够在加。
...全文
727 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
killermat 2004-09-03
  • 打赏
  • 举报
回复
谢谢支持
kyhong 2004-09-02
  • 打赏
  • 举报
回复
比我做的难多了,多线程,心有余而力不足兮

up帮你!
oyljerry 2004-09-02
  • 打赏
  • 举报
回复
可以考虑针对不同的数据帧开多个线程来发送和接收数据
killermat 2004-09-02
  • 打赏
  • 举报
回复
MODBUS协议手册上写到:
----------------------------------------------------------------------------------
使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时
间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传
输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个
域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,
一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收
设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小
于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错
误,因为在最后的CRC域的值不可能是正确的。
---------------------------------------------------------------
我在VC中怎么检测3.5个字符的时间间隔,当一个不定长消失帧过来时,我何时触发OnCommMscomm()读取这个消息
kyhong 2004-09-02
  • 打赏
  • 举报
回复
协议中不是有格式么,可以通过格式来对你接受到的数据进行判断阿

我可是刚刚工作的菜鸟,也要做什么RTU的鬼东西

另外你的CRC校验应该挺厉害,我都没做,头说了,相信你也做不出来,呵呵
zj7961767520 2004-09-02
  • 打赏
  • 举报
回复
up
killermat 2004-09-02
  • 打赏
  • 举报
回复
帖子都转了个地方了,怎么没有兄弟回应一下啊
郁闷!
是不俺的问题太基础了,各位都不屑回答啊!
吭个声,帮一下小弟啦!!!
killermat 2004-09-02
  • 打赏
  • 举报
回复
中午大家都午休去了吗?请大家UP一下,帮俺想想办法

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧