FreeModbus源码分析
来源:互联网 发布:aes java代码 编辑:程序博客网 时间:2024/04/30 10:37
0. 版权声明:
本文著作权归属作者本人所有,提供广大网友学习分析用,如需在发表作品中引用,请联系作者本人。ourdev.cn作者ID:smily,百度文库id:mcs3000,电子邮件:guhongliang2000@gmail.com。本人保留署名权。如需转载请包含本版权声明。如果本文有不准确之处,欢迎与作者讨论,QQ:83414576。本人不对使用文中技术造成的后果负责。本文分析基于FreeModbus1.50.可以与作者联系获取pdf或者docx格式文档。
1. FreeModbus协议分析
协议必须首先调用初始化功能eMBinit()函数。后调用eMBEnable(),最后,在循环体或者单独一个任务中调用eMBPoll()函数。
2. 应用层协议
2.1. 系统的启动
2.1.1. eMBInit()函数的源码分析
以RTU方式为例,首先,检查调用的地址是否合法。如不合法,返回错误。如果合法则继续执行,
首先,针对RTU方式还是ASCII方式,选择不同的编译模块。
对需要调用的函数指针进行复制。如果移植需要改变其他用途,则要修改相应的指针,包括如下赋值:
然后调用eStatus = eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity );具体初始化通讯端口。
2.1.2. eMBRTUInit
eMBRTUInit这个函数主要干两件事:
第一,
if( xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE )
{
}
这个函数在portserial.c中,需要用户在移植的时候根据自己的处理器编写。
第二,
2.1.3. eMBEnable源码分析
首先,看看Modbus功能是否是被关闭的,如果不是被关闭(可能是没有被初始化或者已经打开),就返回错误。
如果是disable状态,就干下面两件事:
l
n
n
n
n
n
l
l
2.2. 总线侦听eMBPoll()
首先,判断系统是否被使能,如果没有,则返回错误值。
然后,检查是否有事件发生,如果有,则根据不同类型的事件响应:
l
l
n
n
n
l
2.3. 数据发送
发送数据通过指针eMBRTUSend,调用eMBRTUSend函数。
2.3.1. eMBRTUSend函数
这个函数的作用就是打包,将数据打包成帧。
l
l
l
2.4. 功能注册
l
eMBException eMXXXXXX ( UCHAR * pucFrame, USHORT * usLen )
l
2.4.1. prvvUARTTxReadyISR()
总线状态改为发送后,会在发送缓冲时,自动调用prvvUARTTxReadyISR()中断服务程序。prvvUARTTxReadyISR()只调用了一个函数,就是pxMBFrameCBTransmitterEm
2.4.2. pxMBFrameCBByteReceived ()
pxMBFrameCBTransmitterEm
3. 数据链路层协议
数据链路层是最基本的打包部分,将数据打包成帧,送到应用层。在数据链路层协议中,使用中断方式来接受。那么每次接收到字符就自动调用接收字符的ISR程序。按照规定,应该将中断服务程序安装给prvvUARTRxISR(void)函数。实际上这个函数只调用了一个函数:
pxMBFrameCBByteReceived(),这个指针调用了xMBRTUReceiveFSM函数。
3.1. xMBRTUReceiveFSM()函数
函数首先检查是不是处于发送状态。如果处于发送状态,直接退出。
l
l
n
n
n
l
l
l
l
3.2. xMBRTUTransmitFSM()函数
xMBRTUTransmitFSM首先判断总线是否忙,如果忙,则终止。如果不忙,则继续,根据发送状态变量:
l
l
n
n
4. 传输控制
除了传输控制以外,还有传输控制的若干函数。通过下面几个指针来调用:
4.1. pvMBFrameStopCur()函数
pvMBFrameStopCur是一个函数指针,在RTU方式下,它指向eMBRTUStop()函数。该函数做下面几件事情:
l
l
4.2. pvMBFrameCloseCur()函数
这个指针指向一个叫做vMBPortClose()的函数,该函数目前只有在mbport.h中的声明,而没有实现。需要等到后面的版本再实现。
- FreeModbus源码分析
- FreeModbus源码分析
- FreeModbus源码分析
- FreeModbus源码分析
- [FreeModbus源码分析] 总目录
- freemodbus-v1.5.0 源码分析
- [FreeModbus源码分析] 1.协议简介
- FreeModbus源码详解
- 四:FreeModbus源码详解
- FreeModbus启动流程分析
- Freemodbus原理分析
- FreeModbus--完全分析--系列1
- FreeModbus--完全分析--系列2
- FreeModbus--完全分析--系列3
- freemodbus
- freemodbus移植stm32过程分析及代码
- Freemodbus RTU在stm32上的移植分析
- Freemodbus RTU在stm32上的移植分析
- osg的灯光使用
- Java Map
- Java中Set的使用
- Introduction to DTD
- Linux Slub分配器(五)--释放对象 .
- FreeModbus源码分析
- 恭喜我开通了CSDN博客
- eclipse查看jar包源代码乱码问题解决
- Python ==运算符重载
- Oracle “CONNECT BY” 使用
- mysql忘记root密码&新建用户&新建数据库&赋予权限
- string的find函数,返回下标,当不存在时返回string::npos,为无符号数最大值
- Ubuntu 默认启动到命令行 12.04
- cocos2dx建初始项目