文章目录

  • 前情提要
  • 问题背景
  • CRC校验失败
    • 问题现象
    • 原始问题数据
    • 问题分析
      • 1. CRC校验算法验证
      • 2. 手动计算验证
      • 问题解决思路
  • 问题解决
    • 根本原因
    • 解决方式1
    • 解决方式2
  • 重新编译测试

前情提要

在自己的开发板上移植了野火的modbus主机程序并尝试使用。

问题背景

我使用STM32显示板作为Modbus主机连接电脑,并在电脑上运行Modbus Slave软件。测试中发现,读取保持寄存器和输入寄存器均失败,但写入操作正常。Modbus Slave可以正确接收到请求帧:

这说明主机发出的命令没有问题。然而,在我的代码中,用于存储保持寄存器的数组 usMRegHoldBuf[][]始终为0,未能更新。进一步排查发现,程序并未进入回调函数 eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode)

已经解决了接收中断不触发的问题。在使用FreeModbus库进行通信时,发现从机返回的数据CRC校验失败,导致数据解析异常。

CRC校验失败

问题现象

mb_m.c文件的eMBErrorCode eMBMasterPoll( void )中的分支添加解析结果的测试,结果显示parse_success_count一直为0,parse_fail_count递增,排查原因是CRC校验失败,导致解析失败。

        case EV_MASTER_FRAME_RECEIVED:eStatus = peMBMasterFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );/* 测试:记录解析结果 */extern volatile uint32_t parse_success_count, parse_fail_count;if(eStatus == MB_ENOERR) {parse_success_count++;} else {parse_fail_count++;}/* Check if the frame is for us. If not ,send an error process event. */if ( ( eStatus == MB_ENOERR ) && ( ucRcvAddress == ucMBMasterGetDestAddress() ) ){( void ) xMBMasterPortEventPost( EV_MASTER_EXECUTE );}else{vMBMasterSetErrorType(EV_ERROR_RECEIVE_DATA);( void ) xMBMasterPortEventPost( EV_MASTER_ERROR_PROCESS );}break;

原始问题数据

  • 主机发送: 01 03 00 01 00 04 15 C9
  • 从机返回: 01 03 08 00 02 00 03 00 04 00 05 73 55(实际接收)
  • 期望返回: 01 03 08 00 02 00 03 00 04 00 05 73 D5

问题分析

1. CRC校验算法验证

使用Modbus CRC16算法对接收到的数据进行校验:

// Modbus CRC16计算函数
USHORT usMBCRC16(UCHAR * pucFrame, USHORT usLen)
{UCHAR ucCRCHi = 0xFF;UCHAR ucCRCLo = 0xFF;int iIndex;while(usLen--){iIndex = ucCRCLo ^ *(pucFrame++);ucCRCLo = (UCHAR)(ucCRCHi ^ aucCRCHi[iIndex]);ucCRCHi = aucCRCLo[iIndex];}return (USHORT)(ucCRCHi << 8 | ucCRCLo);
}

2. 手动计算验证

对从机返回的数据进行计算:

  • 数据部分: 01 03 08 00 02 00 03 00 04 00 05 (11字节)
  • 接收CRC: 73 55
  • 计算CRC: 73 D5

发现差异: 最后一个字节应为 D5 但实际接收为 55

问题解决思路

通过检查代码配置,发现串口校验位不匹配

  • ModbusSlave工具配置: 115200-8-E-1 (偶校验)
  • 代码中配置: UART_PARITY_NONE (无校验)
// 原错误配置
#define MB_MASTER_USART_PARITY UART_PARITY_NONE// 正确配置应为
#define MB_MASTER_USART_PARITY UART_PARITY_EVEN

问题解决

根本原因

校验位不匹配导致数据接收错误
虽然官方给的文档中说串口配置是无校验位
在这里插入图片描述
实际程序中的串口定义也是无校验位
在这里插入图片描述)
但是主函数中,设置的是偶校验
在这里插入图片描述)
而串口的数据位配置的是8位,这就导致了数据接收错误

解决方式1

修改校验位设置为

MB_PAR_NONE, /*!< No parity. */

	/* FreeModbus主机初始化 */eMBMasterInit(MB_RTU, MB_MASTER_USARTx, MB_MASTER_USART_BAUDRATE, MB_PAR_NONE);

解决方式2

修改usart.cMX_USART2_UART_Init的工作模式配置,让它根据选择的校验模式自行判断应该配置成多少位。

/*** @brief  DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1* @param  无* @retval 无*/  
void MX_USART2_UART_Init(uint8_t ucPORT, uint32_t ulBaudRate, uint8_t eParity)
{if(ucPORT != 2) //必须设置为串口2return ;huart2.Instance = DEBUG_USART;huart2.Init.BaudRate = ulBaudRate;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = eParity;/* 根据校验位设置数据位长度 */if(eParity == UART_PARITY_NONE) {huart2.Init.WordLength = UART_WORDLENGTH_8B;} else {huart2.Init.WordLength = UART_WORDLENGTH_9B;}huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK){while(1);}}

重新编译测试

修改后重新编译程序,测试结果:

  • ✅ 接收数据正确: 01 03 08 00 02 00 03 00 04 00 05 73 D5
  • ✅ CRC校验通过
  • ✅ 数据解析正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97116.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97116.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97116.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从协作机器人到智能协作机器人:工业革命的下一跳

从协作机器人到智能协作机器人&#xff1a;工业革命的下一跳 文章目录从协作机器人到智能协作机器人&#xff1a;工业革命的下一跳摘要1️⃣ 协作机器人&#xff08;Cobot&#xff09;&#xff1a;工业柔性化的催化剂核心特点典型应用2️⃣ 智能机器人&#xff1a;赋予机器“思…

49个Docker自动化脚本:覆盖全场景运维,构建高可用容器体系

一、容器生命周期管理&#xff08;1-25&#xff09;&#xff1a;从创建到自愈的全流程自动化 1. 自动化容器创建脚本&#xff08;可复用配置&#xff09; 适用场景&#xff1a;快速创建标准化容器&#xff08;如Nginx、Redis&#xff09;&#xff0c;无需重复编写docker run命令…

Linux(二) | 文件基本属性与链接扩展

个人主页-爱因斯晨 文章专栏-Linux 最近学习人工智能时遇到一个好用的网站分享给大家&#xff1a; 人工智能学习 文件属性 看懂文件属性 在Linux中我们可以使用ll或者ls-l命令来显示一个文件的属性以及文件所属的用户和组。如&#xff1a; rootVM-24-17-ubuntu:~# cd / rootV…

MaxCompute MaxFrame | 分布式Python计算服务MaxFrame(完整操作版)

MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame&#xff08;完整操作版&#xff09;前言MaxCompute MaxFrame服务开通开通 MaxCompute 服务开通 DataWorks 服务资源准备创建 DataWorks 工作空间创建 MaxCompute 项目创建MaxCompute数据源绑定数据源或集群创建MaxComp…

[机械结构设计-48]:机械工程师的岗位要求

机械工程师的岗位要求涵盖学历、专业知识、技能水平、工作经验、软件应用、综合能力、沟通协作、职业规范与持续学习等多个维度&#xff0c;具体如下&#xff1a;学历要求&#xff1a;通常要求本科及以上学历&#xff0c;专业背景为机械工程、自动化、材料工程等相关专业。部分…

3446. 按对角线进行矩阵排序

Problem: 3446. 按对角线进行矩阵排序 文章目录思路解题过程复杂度Code思路 发现每条对角线行号减列号是一个定值。 设ki-jn&#xff0c;i0,jn-1时&#xff0c;k1&#xff1b;im-1&#xff0c;j0时&#xff0c;kmn-1。 解题过程 遍历对角线&#xff0c;找出最小和最大列&#x…

疯狂星期四文案网第53天运营日记

网站运营第53天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 必应的关键词排名还可以&#xff0c;自然流量过来的创新高了&#xff0c;这周没有掘金大佬给我宣传&#xff0c;全是自然流量过来的 今日…

【Docker基础】Docker-compose进阶配置:环境变量与配置隔离完全指南

目录 前言 1 Docker-compose环境变量基础 1.1 环境变量的作用与优势 1.2 环境变量的作用范围 2 .env文件的核心用法 2.1 .env文件基础语法 2.2 变量引用与替换 2.3 多环境配置策略 3 高级配置技巧 3.1 环境变量优先级 3.2 条件配置与模板 3.3 安全实践 4 案例&…

习题答案 |《数据结构(C语言版第4版)》人民邮电出版社,李云清杨庆红等,2023年8月

李云清杨庆红等&#xff0c;《数据结构&#xff08;C语言版第4版&#xff09;》&#xff0c;人民邮电出版社&#xff0c;2023年8月 上海电力大学2025年专升本上岸学长经验分享&#xff08;普通考生&#xff09;-免费赠送25年电力考试真题&#xff01;&#xff01;&#xff01;…

Chrome紧急修复AI发现的ANGLE高危漏洞CVE-2025-9478

近日&#xff0c;谷歌为Chrome稳定版发布关键安全更新&#xff0c;修复了ANGLE&#xff08;支撑WebGL及其他渲染任务的图形引擎&#xff09;中的释放后重用&#xff08;use-after-free&#xff09;漏洞。该漏洞编号为CVE-2025-9478&#xff0c;于2025年8月11日被发现——发现者…

8.28作业

1.提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数#include <iostream>using namespace std;int main() {string buf;cout << "输入字符串" << endl;getline(cin,buf);int capital 0,lower…

copy-to-clipboard 网站复制粘贴 三分钟入门

目录 一、介绍和安装 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;安装 二、示例 &#xff08;1&#xff09;示例效果演示 &#xff08;2&#xff09;示例视频演示 &#xff08;3&#xff09;示例代码 一、介绍和安装 &#xff08;1&#xff09;介绍 copy…

Python 多版本环境治理理念驱动的系统架构设计——三维治理、四级隔离、五项自治 原则(路径治理升级修订 V 2.0 版)

Python 多版本环境治理理念驱动的系统架构设计 ——三维治理、四级隔离、五项自治 原则&#xff08;路径治理升级修订 V 2.0 版&#xff09; Python 多版本环境治理理念驱动的系统架构设计&#xff1a;三维治理、四级隔离、五项自治 原则 V1.0 版 &#x1f4da; 系列文章导航 …

Ubuntu Server 快速部署长安链:基于 Go 的智能合约实现商品溯源

文章目录简介智能合约语言智能合约上链管理开发环境准备长安链官网官方源码仓库官方文档官方 Docker 镜像仓库部署管理平台登录管理平台快速生成证书新建区块链链配置文件订阅长安链项目编译打包&#xff08;商品溯源示例&#xff09;部署合约编辑合约上链管理生产商品运输商品…

德克西尔氢气探测器:工业安全守护核心

​ ​引言&#xff1a;氢气泄漏隐患下&#xff0c;谁来守住工业安全防线&#xff1f; 2024年某化工园区因氢气管道阀门老化&#xff0c;泄漏气体未及时被检测&#xff0c;遇静电引发小型爆炸&#xff0c;造成设备损毁与停产损失——这类事故在新能源、化工、冶金等依赖氢气的…

电商高并发稳赢指南:ZKmall开源商城微服务架构的实战拆解

在电商行业&#xff0c;高并发场景&#xff08;如秒杀活动、节日大促&#xff09;对系统稳定性的考验尤为严峻。据阿里云 2024 年电商技术白皮书显示&#xff0c;采用微服务架构的电商系统在峰值流量下的稳定性比单体架构高 4.2 倍&#xff0c;故障恢复时间缩短 75%。ZKmall 开…

搜维尔科技核心产品矩阵涵盖从硬件感知到软件渲染的全产品供应链

在虚拟现实&#xff08;VR&#xff09;技术加速渗透至人因工程、生物力学、拟态环境及XR仿真现实等多学科交叉领域的背景下&#xff0c;我司与恒挚科技展开交流合作&#xff0c;双方将依托我司在动作捕捉、力反馈设备及实时渲染软件等领域的全栈技术积累&#xff0c;共同开拓沉…

Python 前后端框架实战:从选型到搭建简易全栈应用

在全栈开发领域&#xff0c;Python凭借丰富的前后端框架生态&#xff0c;成为开发者快速构建应用的优选。本文将聚焦Python主流前后端框架的选型对比&#xff0c;并以“Flask&#xff08;后端&#xff09; Vue.js&#xff08;前端&#xff09;”组合为例&#xff0c;带您实战搭…

多版本并发控制MVCC

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;。是一个在数据库管理系统中用于处理并发控制的核心技术。理解它对于深入掌握数据库&#xff08;尤其是 InnoDB、PostgreSQL 等&#xff09;的工作原理至关重要。1. 什么是 MVCC&…

嵌入式第三十七天(TCP补充,应用层协议(HTTP))

一.TCP机制二.HTTP协议1.2.3.4.5.6.7.8.#ifndef _HEAD_H #define _HEAD_H#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h>#endif#include "head.h"…