我相信很多买原子板子的都跟我一样是个学生,所以在初做项目的时候四处找资料,但是又头疼看不懂。我第一次接手学院里面一个用modbus协议读数据的项目时也是费了大力。毕竟是个学生很多都只学习了理论。很感谢吧友以及原力召唤出来的原子哥给予的帮助,现在我把我调试modbus-RTU的详细资料发出来。这些资料并不是我的,只是我总结吧友的东西。为了能让更多像我一样小白的同学能看明白。
材料:正点原子F103战舰板。两根线
准备工作:正点原子的F103战舰板右上角有一个接线柱,上面标注了RS485,并画了A,B。好了先把板子的A跟要通讯的设备A连起来,B跟设备的B连起来。现在板子是主机,设备是从机。主机发送请求,从机给予应答。然后在板子的右侧有一个usart2的跳线帽。连接PA2-》485TX。PA3->485RX。这一部分参见正点原子的库开发指南的485教学,里面有详细的介绍。
然后用那根串口调试的线接上,打开并设置好电脑调试助手。读取到的数据就会显示在串口调试助手上。这个是适配于这个逆变器的,具体的协议我发上来了,就是那个茂硕逆变器的。
关于协议:
实质上就是发送一系列数组来让设备应答的,来上实例:
我们现在读出这两个数据,它的地址是0xC104,0xC105
因为我们是要读取这两个数据,所以从机应答数据,就是从机寄存器的输出。我们要来读取,于是功能码先用0x03。
读两个数据,因为是连续的,数据长度是0x02.这个东西是顺着读的,如果你想读一个0xC104跟0xC106。就得读三个数据了,然后中间的那个0xC105就得晾着了。
寄存器地址:就看你要开始的地址,就是0xC104.
从机地址:这个要看说明书,因为这个东西是写在从机里面的,我那里手册上面写到了这个机子的地址是0x01。
如果就算一点也不了解,先把这几个数按照咱们推出来的改一下就ok了
即改为:
功能码 0x03 数据位0x02 寄存器地址 0xC104 从机地址0x01。
波特率,起始位,停止位,奇偶判断:这些标注的很清楚了,在master.c文件里面,波特率跟奇偶判断在开头的著名里面改,有详细备注。停止位在usart2的使能函数里面改,一般都是1个停止位。起始位不用管,都是一个。
然后问题是轮询周期,协议上面都写着最短的轮询周期,就是多长时间你可以鸟一下从机。我这个协议是1S的。写这个代码的人很聪明的利用了定时器解决了这个问题,他用定时器4每固定秒数触发modbus.c的335行代码void mosbus()前多少秒写进去一次数据,然后再过多少秒再读(其实是处理)一次数据。具体的延时设计为主函数的第44行,我的是1秒的轮询周期,所以上面写的是5000(500ms,两个过程加一起就是1秒)。
CRC校验已经在modbus.c里面写的很清楚了,字面意思理解不了了可以先拿去复制。
主函数第56行是输出读到的数据的,读取到的数据具体怎么处理出来我觉得各位头疼modbus的同学都知道怎么搞吧,我觉得各位都是在跟我当初一样头疼没有响应吧,这个里面我又加了好多注释,因为我只是个学生。所以很多注释加的不专业甚至就是大白话。
在此再次感谢这位能分享这个源码的巨老以及各位给我留言帮助过我的吧友(顺道捎上盖过楼的原子哥)。
在while(1)前有一段:Modbus_RegMap();//modbus通讯
可是这个貌似没有发信息啊?
请问能否留个联系方式,或者麻烦你加我qq?
u16 Master_WriteReg[1000];//写寄存器--将寄存器中的数据发给从机
void Modbus_RegMap(void)
{
Master_WriteReg[0]=1;
Master_WriteReg[1]=8;
Master_WriteReg[2]=9;
Master_WriteReg[3]=235;
Master_WriteReg[4]=8690;
Master_WriteReg[5]=23578;
Master_WriteReg[6]=125;
Master_OutputIO[20]=1;
Master_OutputIO[21]=0;
Master_OutputIO[22]=1;
Master_OutputIO[23]=1;
Master_OutputIO[24]=0;
Master_OutputIO[25]=0;
Master_OutputIO[26]=1;
Master_OutputIO[27]=1;
Master_OutputIO[28]=1;
Master_OutputIO[29]=0;
}
请问您解决了吗?我也遇到了这种问题
一周热门 更多>