FreeModbus
文章平均质量分 81
小朱炖粉条
这个作者很懒,什么都没留下…
展开
-
FreeModbus学习——接收状态机xMBRTUReceiveFSM
当接收状态机状态为初始化态,接收到一个数据,进入接收状态机,不存储这个数据,而是重启定时器。再接收,再重启,直到这一帧完成(帧与帧之间会有个时间间隔),然后进入定时器中断,将接收状态机变为空闲态,并发布ready事件,代表协议栈就绪。协议栈使能后,会将接收状态机赋值为初始化态,串口接收使能,且定时器也使能(重新计数),定时器进入溢出中断,然后会将接收状态机由初始化态变为空闲态。然后再将接收状态机置为空闲态。当接收状态机为空闲态时,开始接收第一个数据作为帧首,然后将接收状态机置为接收态,重新计数定时器。原创 2024-08-03 17:20:23 · 958 阅读 · 0 评论 -
FreeModbus学习——定时器
接收状态机为空闲态时,接收到一个字符,会进入串口接收中断,串口接收中断中会将接收到的字符保存作为帧首,并且把接收状态机变为STATE_RX_RCV。但是万一这个时候串口接收寄存器已经有数据了咋办,那会进入串口接收中断函数,会调用xMBRTUReceiveFSM,当接收状态机为STATE_RX_INIT时,会清空定时器重新计数。当接收状态机为空闲态STATE_RX_IDLE,接收到第一个数据时作为帧首,然后接收状态机进入接收态STATE_RX_RCV,并且使能定时器(重新计数)。说明一帧已经接收完毕。原创 2024-07-25 19:55:02 · 1024 阅读 · 0 评论 -
Clion开发STM32——移植FreeModbus
网上用keil的比较多,用Clion的比较少,如果你也用Clion,那么希望本文可以给你提供些许参考。原创 2024-07-25 17:52:11 · 1160 阅读 · 0 评论 -
FreeModbus学习——读输入寄存器eMBFuncReadInputRegister
也就是说经过eMBFuncReadInputRegister这个函数处理之后,打包好的帧已经放在了pucFrame,长度放在了usLen。调用回调函数eMBRegInputCB读取寄存器数据,eMBRegInputCB这个函数会把读到的数据继续存放在pucFrameCur 帧里。就是说这个指针pucFrameCur刚开始指向pucFrame这一帧数据的起始位置,然后打包一个数据,pucFrameCur+一个。读寄存器数据,其实就是读数组嘛,寄存器是16位的,所以定义数组也是16位的SHORT型。原创 2024-07-24 21:20:08 · 794 阅读 · 0 评论 -
FreeModbus学习——xFuncHandlers功能码处理
这句话就是说,定义了一个变量,这个变量是pxMBFunctionHandler 函数指针类型。在mb.c文件中,有一个数组是static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX]首先看这个数组的类型 :xMBFunctionHandler ,也就是说这个数组中的每一个元素都是xMBFunctionHandler。以读输入寄存器为例(首先要在mbconfig.h文件中打开这个功能(默认打开))那么这个读输入寄存器函数在哪?原创 2024-07-24 18:27:37 · 392 阅读 · 0 评论 -
FreeModbus学习——eMBPoll轮询
接收状态机为空闲态时(每次定时器溢出中断会将接收机状态置为空闲态),接收到一个字符,会进入串口接收中断,串口接收中断中会将接收到的字符保存作为帧首,并且把接收状态机变为STATE_RX_RCV。直到一帧结束,也就是距离下个字符超过定时器溢出时间,进入定时器中断,此时接收状态机还为STATE_RX_RCV,这就意味着接受完成了一帧。协议栈使能后,会将接收状态机赋值为初始化态,且定时器也使能,定时器进入溢出中断,会将接收状态机由初始化态变为空闲态,并且发布一个EV_READY事件。原创 2024-07-23 19:23:54 · 1740 阅读 · 0 评论 -
FreeModbus学习——eMBEnable协议栈使能
先进行协议栈状态判断,若eMBState == STATE_DISABLED即初始化完成了,就激活协议栈。串口接收使能,发送禁止。在定时器第一次溢出后会将接收状态机的状态由STATE_RX_INIT变为STATE_RX_IDLE。Modbus初始化后,协议栈状态由eMBState由未初始化变成了STATE_DISABLED。先将接收状态机赋值为初始化状态 eRcvState = STATE_RX_INIT;eMBRcvState有四个状态:初始化,空闲态,接收中,帧无效(错误)原创 2024-07-23 17:41:03 · 391 阅读 · 0 评论 -
FreeModbus学习——eMBInit初始化
在调用xMBPortSerialInit进行串口初始化,这个函数在portserial.c文件中,这个函数是留给用户自己实现的,就是初始化函数,实际上串口初始化放在外面自己初始化也可以,反正只要初始化了就行。所以设置Prescaler = 11999;,这样一个时基就是12000/240000000 = 1/20000 = 1/20ms = 1000/20 us = 50us。在mb.c文件中还定义了几个回调函数指针,这里只用到了前三个,分别是字节接收,发送空,定时器溢出回调函数。原创 2024-07-23 16:05:26 · 942 阅读 · 0 评论 -
FreeModbus学习——portevent事件
如果队列中有事件,则就将队列中的事件eQueuedEvent赋值给eEvent ,事件被取走了,那么队列里就没有事件了,所以xEventInQueue = FALSE;eEvent 为要发布的事件,将xEventInQueue 置为TRUE,即队列中有事件了,然后将eEvent赋值给eQueuedEvent ,即队列中的事件为eEvent。在mbport.h文件中有事件类型的定义eMBEventType,有事件状态有四种,或者说有四种事件:就绪,帧接收完成,处理,帧发送完成。首先定义了两个静态变量。原创 2024-07-23 14:46:41 · 287 阅读 · 0 评论