MODBUS协议学习

干货|手把手带你搞懂Modbus通信协议-腾讯云开发者社区-腾讯云干货|手把手带你搞懂Modbus通信协议-腾讯云开发者社区-腾讯云

大致分为以下几种:

  • Modbus-RTU
  • Modbus-ASCII
  • Modbus-TCP

以上三种协议,一个设备只会有一种协议,如果你的设备使用的是Modbus-RTU,只需查看以下对应部分,一般来说大部分的设备都是Modbus-RTU协议的。

Modbus通讯时规定主机久再发送下一组新命令,这个命令(数据)已结束。

翻译中

组命令必须间隔3.5个字符主要用来告诉其他设备这次命令已经发送完了类似于句号。断句

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if(htim->Instance == TIM1) // TIM1定时器中断(1ms周期)

{

if(modbus.time_run == 1) // 检查MODBUS接收超时定时器是否运行

{

modbus.timeout ++; // 超时计数器递增

if(modbus.timeout >= 7) // 超时时间达到7ms(MODBUS帧间隔超时)

{

modbus.rx_flag = 1; // 设置接收完成标志,通知主程序处理数据

modbus.time_run = 0; // 关闭定时器运行

}

}

}

检测MODBUS的初始通讯

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if(huart->Instance == USART3) // 检查是否为USART3中断

{

if(modbus.rx_flag == 1) // 如果正在处理上一帧数据,则忽略新数据

{

return ; // 直接返回,等待主程序处理完当前帧

}

// 将接收到的字符存入MODBUS接收缓冲区

modbus.modbus_buf[modbus.modbus_count ++] = ch;

modbus.timeout = 0; // 重置超时计数器

if(modbus.modbus_count == 1) // 如果是本帧的第一个字节

{

modbus.time_run = 1; // 启动超时定时器

}

// 重新启动串口接收中断,等待下一个字符

HAL_UART_Receive_IT(&huart3,&ch,1);

}

}

将发送来的数据转存MODBUS接收缓冲区并开始重新接收流程

相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习