当前位置: 首页 > news >正文

美食 网站模板wordpress json数据

美食 网站模板,wordpress json数据,购物网站建设开题报告,推广产品的方法文章目录Modbus主机接收数据流程:1. **串口接收中断触发**2. **接收中断处理** (prvvUARTRxISR)3. **接收状态机** (xMBMasterRTUReceiveFSM)4. **定时器启动** (vMBMasterPortTimersT35Enable)5. **T3.5超时触发**6. **定时器中断处理** (prvvTIMERExpiredISR)7. *…

文章目录

    • Modbus主机接收数据流程:
      • 1. **串口接收中断触发**
      • 2. **接收中断处理** (`prvvUARTRxISR`)
      • 3. **接收状态机** (`xMBMasterRTUReceiveFSM`)
      • 4. **定时器启动** (`vMBMasterPortTimersT35Enable`)
      • 5. **T3.5超时触发**
      • 6. **定时器中断处理** (`prvvTIMERExpiredISR`)
      • 7. **协议栈定时器处理** (`xMBMasterRTUTimerExpired`)
      • 8. **事件处理** (`xMBMasterPortEventPost`)
      • 9. **主程序轮询** (`eMBMasterPoll`)
        • 9.1 `eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );`
        • 9.2 后续判断代码:
      • 10. **帧处理** (`eMBMasterRTUReceive`)
      • 11. **回调函数调用**
    • 完整调用链:

Modbus主机接收数据流程:

1. 串口接收中断触发

硬件中断 → USART2_IRQHandler → HAL_UART_IRQHandler → prvvUARTRxISR()

2. 接收中断处理 (prvvUARTRxISR)

void prvvUARTRxISR(void)
{// 读取接收到的字节(void)xMBMasterPortSerialGetByte((CHAR*)&ucByte);// 调用接收状态机(void)pxMBMasterFrameCBByteReceived();// 计数器增加rx_int_count++;
}

3. 接收状态机 (xMBMasterRTUReceiveFSM)

BOOL xMBMasterRTUReceiveFSM(void)
{// 读取字节(void)xMBMasterPortSerialGetByte((CHAR*)&ucByte);switch(eRcvState) {case STATE_M_RX_IDLE:// 收到第一个字节usMasterRcvBufferPos = 0;ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte;eRcvState = STATE_M_RX_RCV;  // 切换到接收状态// 启动T3.5定时器vMBMasterPortTimersT35Enable();break;case STATE_M_RX_RCV:// 继续接收数据if(usMasterRcvBufferPos < MB_SER_PDU_SIZE_MAX) {ucMasterRTURcvBuf[usMasterRcvBufferPos++] = ucByte;} else {eRcvState = STATE_M_RX_ERROR;  // 缓冲区溢出}// 重启T3.5定时器vMBMasterPortTimersT35Enable();break;}
}

4. 定时器启动 (vMBMasterPortTimersT35Enable)

void vMBMasterPortTimersT35Enable()
{vMBMasterSetCurTimerMode(MB_TMODE_T35);  // 设置T3.5模式HAL_TIM_Base_Start_IT(&htim4);           // 启动定时器
}

5. T3.5超时触发

定时器中断 → TIM4_IRQHandler → HAL_TIM_IRQHandler → HAL_TIM_PeriodElapsedCallback → prvvTIMERExpiredISR()

6. 定时器中断处理 (prvvTIMERExpiredISR)

void prvvTIMERExpiredISR(void)
{// 调用协议栈定时器处理(void)pxMBMasterPortCBTimerExpired();// 计数器增加timer_int_count++;
}

7. 协议栈定时器处理 (xMBMasterRTUTimerExpired)

BOOL xMBMasterRTUTimerExpired(void)
{switch(eRcvState) {case STATE_M_RX_RCV:// 帧接收完成,发送事件xNeedPoll = xMBMasterPortEventPost(EV_MASTER_FRAME_RECEIVED);break;}// 重置状态eRcvState = STATE_M_RX_IDLE;eSndState = STATE_M_TX_IDLE;// 停止定时器vMBMasterPortTimersDisable();return xNeedPoll;
}

8. 事件处理 (xMBMasterPortEventPost)

BOOL xMBMasterPortEventPost(eMBMasterEventType eEvent)
{xMasterEventInQueue = eEvent;  // 保存事件return TRUE;
}

9. 主程序轮询 (eMBMasterPoll)

eMBErrorCode eMBMasterPoll(void)
{eMBMasterEventType eEvent;// 获取事件if(xMBMasterPortEventGet(&eEvent) == TRUE) {switch(eEvent) {case EV_MASTER_FRAME_RECEIVED:// 处理接收到的帧eStatus = peMBMasterFrameReceiveCur(&ucRcvAddress, &ucMBFrame, &usLength);break;}}
}
9.1 eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );

这个函数的作用是解析接收到的Modbus帧

参数说明:
&ucRcvAddress:从机地址指针,函数会提取帧中的从机地址
&ucMBFrame:数据帧指针,函数会提取帧中的数据部分
&usLength:数据长度指针,函数会返回数据部分的长度

返回值:
eStatus:解析结果 MB_ENOERR:解析成功 MB_EIO:解析失败(CRC错误、长度错误等)

9.2 后续判断代码:
if ( ( eStatus == MB_ENOERR ) && ( ucRcvAddress == ucMBMasterGetDestAddress() ) )
{( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE );
}
else
{vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA);( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS );
}

判断逻辑:

  1. eStatus == MB_ENOERR
    检查帧解析是否成功
    如果CRC校验失败或长度错误,eStatus就不是MB_ENOERR

  2. ucRcvAddress == ucMBMasterGetDestAddress()
    检查接收到的从机地址是否匹配
    ucRcvAddress:接收帧中的从机地址
    ucMBMasterGetDestAddress():当前主机请求的目标从机地址

处理结果:

  • 如果两个条件都满足
    发送EV_MASTER_EXECUTE事件
    表示"帧解析成功且地址匹配,可以执行功能处理"

  • 如果任一条件不满足
    设置错误类型为EV_ERROR_RECEIVE_DATA
    发送EV_MASTER_ERROR_PROCESS事件
    表示"接收数据错误,需要错误处理"

简单说:

这段代码就是在验证接收到的Modbus帧是否有效

  1. 帧格式是否正确(CRC、长度等)
  2. 从机地址是否匹配
  3. 根据验证结果决定下一步处理

10. 帧处理 (eMBMasterRTUReceive)

eMBErrorCode eMBMasterRTUReceive(UCHAR *pucRcvAddress, UCHAR **pucFrame, USHORT *pusLength)
{// CRC校验if(usMBCRC16(ucMasterRTURcvBuf, usMasterRcvBufferPos) == 0) {// 提取地址和数据*pucRcvAddress = ucMasterRTURcvBuf[MB_SER_PDU_ADDR_OFF];*pusLength = usMasterRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC;*pucFrame = &ucMasterRTURcvBuf[MB_SER_PDU_PDU_OFF];}
}

这个eMBMasterRTUReceive函数是Modbus RTU帧解析函数

函数功能:
解析接收到的Modbus RTU帧,提取地址、数据和长度信息。

参数说明:
pucRcvAddress:从机地址指针,函数会将解析出的从机地址存储到这里
pucFrame:数据帧指针,函数会将解析出的数据部分存储到这里
pusLength:数据长度指针,函数会将数据部分的长度存储到这里

解析过程:

  1. 长度检查
if( ( usMasterRcvBufferPos >= MB_SER_PDU_SIZE_MIN )&& ( usMBCRC16( ( UCHAR * ) ucMasterRTURcvBuf, usMasterRcvBufferPos ) == 0 ) )

检查接收缓冲区长度是否大于等于最小长度
检查CRC16校验是否正确(CRC校验结果为0表示正确)

  1. 提取从机地址
*pucRcvAddress = ucMasterRTURcvBuf[MB_SER_PDU_ADDR_OFF];

从接收缓冲区中提取从机地址(第0个字节)

  1. 计算数据长度
*pusLength = ( USHORT )( usMasterRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC );

总长度 = 接收长度 - 地址长度(1) - CRC长度(2)
得到实际的数据部分长度

  1. 设置数据指针
*pucFrame = ( UCHAR * ) & ucMasterRTURcvBuf[MB_SER_PDU_PDU_OFF];

指向数据部分的起始位置(第1个字节开始)

返回值:
MB_ENOERR:解析成功
MB_EIO:解析失败(长度不够或CRC错误)

11. 回调函数调用

// 根据功能码调用相应的回调函数
switch(ucFunctionCode) {case MB_FUNC_READ_HOLDING_REGISTERS:eMBMasterRegHoldingCB(&ucMBFrame, &usLength);callback_count++;  // 回调计数器增加break;
}

完整调用链:

串口中断 → 接收状态机 → 启动定时器 → T3.5超时 → 定时器中断 → 协议栈处理 → 事件通知 → 主程序轮询 → 帧处理 → 回调函数
http://www.dtcms.com/a/591847.html

相关文章:

  • 网站建设平台还有没有趋势建设通网站电话
  • 考研门户网站的建设wordpress是国外的吗
  • 通过高权重网站做长尾关键词wordpress左右滑动相册
  • 杭州营销网站建设平台简单的手机网站模板
  • 网站程序是如何开发的企业网站建设457216336
  • 建设公司网站哪家好网站开发流程中网站制作包括
  • 宿迁商城网站建设芜湖网站建设兼职
  • 网站改版计划上海传媒公司总裁结婚
  • 网站制作加教程视频教程网站是什么时候开始的
  • 网站的基础服务管理系统门户网站开发路线
  • 湛江模板建站多少钱法治建设优秀网站
  • 北京人才招聘网站线上怎么注册公司
  • 源码之家 网站模板栾城seo整站排名
  • 个人门户网站建设流程wordpress图片显示缩略图
  • 课程网站开发背景和意义求网址直接能看的2021
  • 做服务网站个人域名备过案了做电影网站会查吗
  • 简洁物流网站模板学wordpress要多久
  • 建网站卖虚拟资源需要怎么做建筑人才网筑才网
  • 网站建设的需求客户公司变更登记申请表
  • 卫计网站建设工作总结指定网站建设前期规划方案
  • 科技网站内容设计湖南中霸建设公司官网
  • 网站怎么做聚合深圳鸿天顺网站建设
  • 网站建设 上传媒网站设计
  • 接网站开发私活如何签合同动漫制作专业名人作品展示
  • 网站建设类公网络营销促销形式
  • 怎么做免费的网站宁波网站建设详细策划
  • 石狮网站定制国内类似wordpress
  • 如何建设音乐网站龙岩天宫山海拔高度多少
  • 招商网站怎么做旅游网站组织结构图怎么做
  • 建设银行网网站打不开百度对wordpress