野火STM32Modbus主機讀取寄存器/線圈失敗(二)-解決CRC校驗錯誤

文章目錄

  • 前情提要
  • 問題背景
  • 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"…