经过一个下午的打磨,小编已经差不多熟悉整个modbus体系的搭建啦,之前那个算是一种,今天再来看看另一种
先来看一个新鲜的东西:
这里用了一种新的方式去获取上位机,也就是主控板发过来的modbus类型的消息,也就是队列,他会把信息存储到msg里面
接着就是去处理主机发过来的modbus消息了
先不管他的这个判断条件,我们来看看他是怎么去处理的
他就是把刚刚接收到的那个队列给传进来
这些就是把接收modbus结构体以及响应modbus结构体给准备好先,然后顺便重新去定义一个指针指向刚刚传进来的队列里面的数据段,当然,接收和响应modbus里面的数据段也是需要去定义一个指针去指向的,方便操作
这个就是把刚刚的队列里面的信息给提取出来,然后赋值给我们准备好的接收modbus数据的结构体,这里还有一个很有意思的地方,那就是去构建错误码,我们来岔开话题去看看
还是比较有意思的,我们回归主题,继续去看看怎么去解析队列里面的数据
可以看到,他传入了队列以及我们刚刚创建好的那个modbus接收的结构体
这里是先把设备id,命令以及寄存器的起始地址给分离出来先
后面这些的话,其实就是去找那个要读取的寄存器的数量了,因为是俩个字节的,但也有特殊的:
最后就是crc了:
那么到这里,接收modbus命令的结构体就已经赋值好了,那么下面,就是去构建应答结构体了,这里面可还是有点学问的
刚刚我们已经构建好了接收modbus数据的结构体,所有我们只需要把接收modbus以及响应modbus的结构体传进去就可以啦
这些就是先把设备id 指令 开始寄存器先赋值好啦,我们来看看modbus的应答数据帧
所以设备id以及功能码是必须的
这些就是分不同的指令去构建不同的应答数据啦,我们一个一个来看
一样是传入那俩个结构体
这里就是先把要读取的寄存器数量给先提取出来
这个就是去循环读取那些寄存器了,最后那个readRegCount就是一次读取的寄存器的数量,这样子就可以判断好需要循环读取多少次
接着就是看要读取的是哪一个寄存器啦
这些寄存器都是我们随意去定义的,是虚拟的
我是感觉这个寄存器没有什么用在里面,因为他的data是已经定好的,我们看另一个
对嘛,这个就是传感器的数值来着,这个意义才比较大
其实是通过串口的中断去接收的,我们来好好看一下这个中断回调函数,其实也很简单,那么到这里,我们这个过程就已经完全完成啦,撒花(doge.)