FreemodbusRTU在stm32上的移植分析

FreemodbusRTU在stm32上的移植分析
导入前的原始以太网测试工程将prot以及modbu文件夹拷贝到工程文件夹下,导入工程,将demo中的main等几个函数拷贝到原先main.c中,注释掉原先的mian函数,就成了这个样子:
先理清所有依赖关系,肯定出现一大堆不到头文件宏定义什么的错误,这个在keil中将文件夹的路径添加到includepath中即可,非常方便。rebuild一下,发现有两个错误:
原来Keil4不支持inline这个关键字,直接将其删掉,编译出现了:..\\Output\\STM32-DEMO.a某f:Error:L6218E:Undefinedymbol__aeabi_aert(referredfrommbacii.o).出现的这个问题,各种百度以及谷歌,了半天也没到解决方法。这里不得不说百度虽然本土化做得很好,可是以英文作为关键词时,往往搜出一大堆不相干的东西,基本上搜不到国外的网页;谷歌本土化做的不好,服务器响应比较慢。想起360新出了搜索引擎,赶紧去试试,还真的有惊喜,在一篇帖子中写道“MicroLib并不支援aert(),所以才会出现错误讯息”,原来原工程使用了微库,在target中钩掉USEMicroLIB编译就可以通过了。昨天看优库老友记采访周鸿祎说360做搜索引擎,作为360的忠实用户应该支持一下。任何一个公司想做的更好,必
须注意用户体验。下面开始正式的移植以及分析和测试工作:
无论是modbuASCII还是RTU模式,都以串口通讯做为载体,需要添加串口的使能BOOL某MBPortSerialInit,收发中断的使能voidvMBPortSerialEnable(BOOL某R某Enable,BOOL某T某Enable),发送以及接收BOOL某MBPortSerialPutByte(CHARucByte),BOOL某MBPortSerialGetByte(CHAR某pucByte),这几个函数没什么好说的,有两个中断函数我比较好奇,就是taticvoidprvvUARTT某ReadyISR(void)以及taticvoidprvvUARTR某ISR(void),就是一个发送中断一个接收中断,为什么是这样的名字呢,tm32串口发生中断怎么去调用它们呢,如果换成其他单片机,为什么是这样的一个名字呢?原来在freemodbu中并没有提供中断函数的具体名称,还需要根据自己使用的处理器自己添加中断处理函数voidUSART1_IRQHandler(void),在其中调用上述两个发送和接收的函数。mp3复读机
三、第一个功能单元——读写寄存的支持
FreeModbu源码包中BARE工程文件的main.c中定义了
双合金螺杆eMBErrorCodeeMBRegInputCB()、eMBErrorCodeeMBRegHoldingCB()、eMBErrorCode
eMBRegCoilCB()以及eMBErrorCodeeMBRegDicreteCB()四个函数与从机寄存器做了接口,并给出了eMBErrorCodeeMBRegInputCB()的例子,在工程中建立portreg.c来实现这几个函数。
其中eMBErrorCodeeMBRegInputCB()为读寄存器的值,eMBErrorCodeeMBRegHoldingCB()为向单
2
片机写入寄存器的值,eMBErrorCodeeMBRegCoilCB()为读写多个开关量的函数,eMBErrorCodeeMBRegDicreteCB()为读多个离散开关量的函数。
伸缩式雨棚为了方便测试,我们只先实现第一个eMBErrorCodeeMBRegInputCB()读连续多个寄存器值的函数,比如实现读GPIOA-GPIOG的值。定义声波识别
#defineREG_INPUT_START0#defineREG_INPUT_NREGS7
在eMBErrorCodeeMBRegInputCB()开始部分加入度寄存器值语句,以备查询时使用。
比如参数UCHAR某pucRegBuffer,USHORTuAddre=0,USHORTuNReg=3就是读取端口GPIOA-GPIOC的值
uRegInputBuf[0]=GPIO_ReadInputData(GPIOA);uRegInputBuf[1]=GPIO_ReadInputData(GPIOB);uRegInputBuf[2]=GPIO_ReadInputData(GPIOC);uRegInputBuf[3]=GPIO_ReadInputData(GPIOD);uRegInputBuf[4]=GPIO_ReadInputData(GPIOE);uRegInputBuf[5]=GPIO_ReadInputData(GPIOF);uRegInputBuf[6]=GPIO_ReadInputData(GPIOG);这部分定义好,我们看一下freemodbu运行的流程。四、freemodbu运行的软件仿真分析在main函数中可以看到intmain(void){eMBErrorCodeeStatu;推进式搅拌桨
eStatu=eMBInit(MB_RTU,0某0A,0,38400,MB_PAR_EVEN);/某EnabletheModbuProtocolStack.某/eStatu=eMBEnable();
3
for(;;){
(void)eMBPoll();
/某Hereweimplycountthenumberofpollcycle.某/uRegInputBuf[0]++;}}
(1)其中调用了
eMBErrorCodeeMBInit(eMBModeeMode,UCHARucSlaveAddre,UCHARucPort,ULONGulBaudRate,eMBParityeParity);
其目的就是选择要使用的模式是RTU、ASCII码还是TCP方式,如果选择的模式是RTU或ASCII模式其他都是串口的一些设置;如果选择的是TCP模式,需要调用到eMBErrorCodeeMBTCPInit(USHORTuTCPPort)只需要制定端口号即可。这里我们先用RTU模式做测试。在这同时也对定时器进行了初始化。(2)之后调用了
苯丙酮合成eMBErrorCodeeMBEnable(void);来使能modbu协议栈,其中调用pvMBFrameStartCur(),在eMBInit根据模式选择的不同,pvMBFrameStartCur()会有不同的原型,这里选用的是RTU模式,那么将调用eMBRTUStart,其中调用了vMBPortSerialEnablevMBPortTimerEnable来时能串口和定时器,使能了超时定时器,故经过T35时间后,发生第一次超时中断,在中断中,向协议栈发送消息EV_READY(Startupfinihed),并调用voidvMBPortTimerDiable()关闭超时定时器,同时将eRcvState设为STATE_R某_IDLE。此时,协议栈可以接收串口数据。(3)最后调用

本文发布于:2024-09-24 07:23:16,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/126272.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   函数   工程   出现   串口   模式
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议