FreeModbus读/写寄存器小Bug
来源:互联网 发布:大数据测试的工具简介 编辑:程序博客网 时间:2024/06/06 08:41
在STM32F401中移植了FreeModBus,移植教程参考了这里:http://www.openedv.com/thread-64794-1-1.html。采用03、04和06号功能码进行数据读写,发现数据能读出,但数值不对。单独调试串口证明串口正常。断点调试发现,每次读/写都是操作的本来想操作寄存器的下一个。于是,一步步查看协议栈各函数调用关系。终于发现,协议栈的小bug。
以03号功能码调用的函数eMBException eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen )为例(在mbfuncinput.c中),有如下代码:
if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) ) { usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 ); usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] ); usRegAddress++; usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 ); usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );
可以看到,在获取寄存器地址usRegAddress后,进行了++操作,把这句话屏蔽即可。同理,在其他几个函数eMBFunc..中,进行同样处理。这些Function分布在文件名为mbfunc**.c的文件中,搜索++字符,并确定是寄存器地址后,将该行屏蔽即可。
2 0
- FreeModbus读/写寄存器小Bug
- FreeModbus 移植--REG_INPUT_START 各种寄存器起始地址
- freemodbus
- 写反转二叉树中遇到的一个小Bug
- 寄存器位写操作
- 小bug
- 小bug
- 小bug?
- 小bug
- 寄存器使用小思路
- 如何使用EVC写寄存器读写软件(哈哈,源码虽小,但是也写出来看看)
- 关于Modbus 3区、4区寄存器地址的理解以及Freemodbus中开始地址的设定
- c 读文件的一个小bug
- 移植Freemodbus
- 移植freemodbus
- 标志寄存器FLAGS----小总结
- 一些寄存器的“小奥秘”
- 记录安卓遇到的两个小bug,望初学者写代码的时候引以为戒
- Learning Entity and Relation Embeddings for Knowledge Graph Completion
- c语言 补码原码换算
- 解决thinkphp关闭调试模式404报错问题
- Android Studio + OpenCV JNI 中的 hello world
- iOS 利用正余弦曲线实现波浪形的XLWaveProgress
- FreeModbus读/写寄存器小Bug
- 异常、File类+JAVA学习笔记-DAY19
- 寻找段落(二分+单调队列)
- POJ 1988 Cube Stacking
- tomcat乱码_中文乱码
- ajax完美解决跨域问题(jsonp、nginx反向代理)
- Oracle CLOB在Hibernate框架下的一次应用
- java布局管理器总结
- 关于文淑大神的BaseRecyclerAdapter的学习心得。。。