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_bufmodbus.modbus_count ++ = ch;

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

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

{

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

}

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

HAL_UART_Receive_IT(&huart3,&ch,1);

}

}

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

相关推荐
全栈道5 分钟前
AI 时代,软件开发应该如何学习
人工智能·学习
存在morning21 分钟前
【OLAP 学习笔记】Doris:数据湖之上的分析查询引擎
笔记·学习
代码山河21 分钟前
Java语言特点:跨平台、面向对象、安全性详解
java·学习·架构·教程·面向对象·项目
每天题库32 分钟前
登高架设作业考试题库大全 核心考点真题刷题备考通关秘籍
学习·安全·考试·题库·考证
andrsted1 小时前
练题簿在线免费刷题:听读练题支持暂停续播、循环播放,让自己的题库听得更方便
学习·微信小程序·小程序·刷题·在线刷题
李日华大战鸡红12 小时前
FOC状态空间方程模型推导(学习记录)
python·学习·线性代数
kkkkkkkkkk_Z14 小时前
新手自学嵌入式 | 学习日记:异常与中断基础、i.MX6ULL裸机开发环境搭建、GPIO模块与点灯原理
学习
m4Rk_15 小时前
【论文阅读】Agent 记忆机制(94):MemGen——在推理过程中动态生成并织入潜在记忆
论文阅读·人工智能·学习·开源·github
晓德15 小时前
0、LLM大模型安全学习系列(启)
学习·安全
Titan202415 小时前
MySQL索引学习笔记
笔记·学习·mysql