为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > freemodbus教程之freemodbus移植应用串口中断接收和数据解析

freemodbus教程之freemodbus移植应用串口中断接收和数据解析

2021-08-19 2页 doc 70KB 133阅读

用户头像 个人认证

IT人

暂无简介

举报
freemodbus教程之freemodbus移植应用串口中断接收和数据解析     freemodbus教程之freemodbus移植应用串口中断接收和数据解析                    本篇主要讲解从机数据的接收流程。接收流程分为两个阶段:串口中断接收和数据解析。第一阶段:中断接收函数prvvUARTRxISR(xMBRTUReceiveFSM)和定时器中断回调函数xMBRTUTImerT35Expired(),第二阶段:数据解析eMBPoll()。一、串口中断接收从机正常状态下,串口设置为接收中断模式,也不启动定时器。当检测到有数据时,中断函数调用xMBRTUReceiveFSM()...
freemodbus教程之freemodbus移植应用串口中断接收和数据解析
     freemodbus教程之freemodbus移植应用串口中断接收和数据解析                    本篇主要讲解从机数据的接收流程。接收流程分为两个阶段:串口中断接收和数据解析。第一阶段:中断接收函数prvvUARTRxISR(xMBRTUReceiveFSM)和定时器中断回调函数xMBRTUTImerT35Expired(),第二阶段:数据解析eMBPoll()。一、串口中断接收从机正常状态下,串口设置为接收中断模式,也不启动定时器。当检测到有数据时,中断函数调用xMBRTUReceiveFSM()函数,通过该函数中的ucRTUBuf数组存储接收帧,用usRcvBufferPos存储数据帧长度。具体函数:1、中断接收函数。voidUART1_IRQ(void){IF(USART_GeTITStatus(USART1,USART_IT_TXE)){pxMBFrameCBTransmitterEmpty();}elseif(USART_GeTITStatus(USART1,USART_IT_RXNE))//接收中断{pxMBFrameCBByteReceived();//pxMBFrameCBByteReceived=xMBRTUReceiveFSM;}}2、xMBRTUReceiveFSM()函数。RTU接收状态函数。只要进人该函数,就会启动定时器中断。从机的接收状态:(1)STATE_RX_INIT(栈初始化);(2)STATE_RX_ERROR(接收错误);(3)STATE_RX_IDLE(接收空闲,接收帧头,常用);(4)STATE_RX_RCV(接收所有数据,常用)。注意:接收数据时,只要接收到数据,定时器就会清零,重新计数。BOOLxMBRTUReceiveFSM(void){BOOLxTaskNeedSwitch=FALSE;UCHARucByte;assert(eSndState==STATE_TX_IDLE);/*Alwaysreadthecharacter.*/(void)xMBPortSerialGetByte((CHAR*)&ucByte);switch(eRcvState){/*Ifwehavereceivedacharacterintheinitstatewehaveto*waitunTIltheframeisfinished.*/caseSTATE_RX_INIT:vMBPortTimersEnable();break;/*Intheerrorstatewewaituntilallcharactersinthe*damagedframearetransmitted.*/caseSTATE_RX_ERROR:vMBPortTimersEnable();break;/*Intheidlestatewewaitforanewcharacter.Ifacharacter*isreceivedthet1.5andt3.5timersarestartedandthe*receiverisinthestateSTATE_RX_RECEIVCE.*/caseSTATE_RX_IDLE:usRcvBufferPos=0;ucRTUBuf[usRcvBufferPos++]=ucByte;eRcvState=STATE_RX_RCV;/*Enablet3.5timers.*/vMBPortTimersEnable();break;/*Wearecurrentlyreceivingaframe.Resetthetimerafter*everycharacterreceived.Ifmorethanthemaximumpossible*numberofbytesinamodbusframeisreceivedtheframeis*ignored.*/caseSTATE_RX_RCV:if(usRcvBufferPos0{MB_FUNC_OTHER_REPORT_SLAVEID,eMBFuncReportSlaveID},#endif#ifMB_FUNC_READ_INPUT_ENABLED>0{MB_FUNC_READ_INPUT_REGISTER,eMBFuncReadInputRegister},#endif#ifMB_FUNC_READ_HOLDING_ENABLED>0{MB_FUNC_READ_HOLDING_REGISTER,eMBFuncReadHoldingRegister},#endif#ifMB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED>0{MB_FUNC_WRITE_MULTIPLE_REGISTERS,eMBFuncWriteMultipleHoldingRegister},#endif#ifMB_FUNC_WRITE_HOLDING_ENABLED>0{MB_FUNC_WRITE_REGISTER,eMBFuncWriteHoldingRegister},#endif#ifMB_FUNC_READWRITE_HOLDING_ENABLED>0{MB_FUNC_READWRITE_MULTIPLE_REGISTERS,eMBFuncReadWriteMultipleHoldingRegister},#endif#ifMB_FUNC_READ_COILS_ENABLED>0{MB_FUNC_READ_COILS,eMBFuncReadCoils},#endif#ifMB_FUNC_WRITE_COIL_ENABLED>0{MB_FUNC_WRITE_SINGLE_COIL,eMBFuncWriteCoil},#endif#ifMB_FUNC_WRITE_MULTIPLE_COILS_ENABLED>0{MB_FUNC_WRITE_MULTIPLE_COILS,eMBFuncWriteMultipleCoils},#endif#ifMB_FUNC_READ_DISCRETE_INPUTS_ENABLED>0{MB_FUNC_READ_DISCRETE_INPUTS,eMBFuncReadDiscreteInputs},#endif};以功能码04为例,读取输入寄存器。eMBExceptioneMBFuncReadInputRegister(UCHAR*pucFrame,USHORT*usLen){USHORTusRegAddress;USHORTusRegCount;UCHAR*pucFrameCur;eMBExceptioneStatus=MB_EX_NONE;eMBErrorCodeeRegStatus;if(*usLen==(MB_PDU_FUNC_READ_SIZE+MB_PDU_SIZE_MIN))//计算帧长度,除了地址位和两位的crc校验位{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]);/*Checkifthenumberofregisterstoreadisvalid.Ifnot*returnModbusillegaldatavalueexception.*/if((usRegCount>=1)&&(usRegCount=REG_INPUT_START)&&(usAddress+usNRegs<=REG_INPUT_START+REG_INPUT_NREGS)){iRegIndex=(int)(usAddress-REG_INPUT_START);while(usNRegs>0){*pucRegBuffer++=(unsignedchar)(usRegInputBuf[iRegIndex]>>8);*pucRegBuffer++=(unsignedchar)(usRegInputBuf[iRegIndex]&0xFF);iRegIndex++;usNRegs--;}}else{eStatus=MB_ENOREG;}returneStatus;}以上就是整个接收数据、解析数据的过程。来源:csdn博客萧年已逝;在此特别鸣谢! -全文完-
/
本文档为【freemodbus教程之freemodbus移植应用串口中断接收和数据解析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索