当前位置:网站首页>仿Modbus消息帧进行通信
仿Modbus消息帧进行通信
2022-07-29 20:38:00 【十月之望】
Modbus消息帧格式
| 起始符 | 设备地址 | 功能代码 | 数据 | 校验 | 结束符 |
|---|---|---|---|---|---|
| 一个字符 | 2个字符 | 1个字符 | n个字符 | 2个字符 | 1个字符 |
起始符:表示一帧的开始
设备地址:用于指定需要进行信息传递的设备
功能代码: 用于指定需要完成的操作
数据: 表示需要传输的数据
校验: 用于通信中的错误校验
结束符: 表示一帧数据的结束
自定义的帧格式设定
| 帧头 | 设备码 | 功能码 | 帧尾 |
|---|---|---|---|
| 0xaa | 一个字符(8bit) | 一个字符(8bit) | 0X55 |
- 帧头: 0xaa 表示一帧数据的开始
- 设备码: 0x01表示指示灯
- 功能码: 0x00表示关闭指示灯,0x01表示开启指示灯
- 帧尾:0x55表示一帧数据的结束
uint8_t RxBuffer[4]; //接受缓冲区
uint8_t RxFlag = 0; //接受完成标志: 为0表示接受未完成,为1表示接受完成
uint8_t ErrFlag = 0; //指令错误标志: 为0表示指令正确,为1表示指令错误
HAL_UART_Receive_IT(&huart2, (uint8_t*)RxBuffer, 4); //使能接受中断
while(1) //帧解析代码
{
if(RxFlag == 1) //判断数据是否接受完成
{
RxFlag = 0; // 清除标志位
if(RxBuffer[0] == 0xaa && RxBuffer[3] == 0x55) //判断帧头帧尾
{
if(RxBuffer[1] == 0x01) //判断设备码
{
if(RxBuffer[2] == 0x00) //判断功能码
{
//用户操作
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
printf("LD2 is close!\r\n");
}
else if(RxBuffer[2] == 0x01) //判断功能码
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
printf("LED2 is open!\r\n");
}
else //功能码错误
{
ErrFlag = 1; //置位错误标志
}
}
else
{
ErrFlag = 1; //置位错误标志
}
}
else
{
ErrFlag = 1; //置位错误标志
}
if(ErrFlag == 1)
{
printf("Communication Error! Please send again!\r\n");
}
// 清除接受缓冲区和错误标志,准备下一次接受
ErrFlag = 0;
RxBuffer[0] = 0;
RxBuffer[1] = 0;
RxBuffer[2] = 0;
RxBuffer[3] = 0;
}
}
//接受中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart ->Instance == USART2) //判断发生接受中断的串口
{
RxFlag = 1; //置位接受完成标志
HAL_UART_Receive_IT(&huart2, (uint8_t*)RxBuffer, LENGTH); //使能串口中断
}
}
边栏推荐
- sizeof和strlen的区别(strlen和sizeof的用法)
- 940. 不同的子序列 II
- 惠普服务器硬盘指示灯不亮或显示蓝色
- PyQt5学习一(环境搭建)
- Sasser virus source code (ransomware source code)
- Setinel 原理简介
- Jenkins 如何玩转接口自动化测试?
- 剑指 Offer II 097. 子序列的数目
- Liu Genghong, boys and girls, come here!Sports data analysis and mining!(with a full set of code and data sets)
- RedisJson 横空出世!
猜你喜欢

刘畊宏男孩女孩看过来!运动数据分析挖掘!(附全套代码和数据集)

A dish hold up valuations billions of mt. Pickled fish, can move beyond the edge food safety?

378. The Kth Smallest Element in an Ordered Matrix

博世集团启动量子数字孪生计划

Dry goods!Cooperative Balance in Federated Learning

MySQL Data Query - Union Query

PyQt5学习一(环境搭建)

Setinel 原理简介

Cobaltstrike and BurpSuite desktop shortcut configuration

探索创客教育在线管理实施体系
随机推荐
Cobaltstrike and BurpSuite desktop shortcut configuration
940. 不同的子序列 II
嵌入式分享合集24
Permutations of a small feat: cantor
指定宽度截取字符串
C#笔记 之 Oracle.ManagedDataAccess包的安装及配置
分析少年派2中的Crypto
JS实现百叶窗特效
高通WLAN框架学习(31)-- Power save
怎么实现您的个人知识库?
一线技术人应该关注的四种思维能力
赶紧进来!!!带你认识C语言基本数据类型
MySQL - Design game user information table
LeetCode 0593. 有效的正方形
回归——岭回归
七个易犯的 IT 管理错误—以及如何避免
如何优雅的自定义 ThreadPoolExecutor 线程池
带你刷(牛客网)C语言百题(第四天)
336. 回文对
Chrome浏览器打印flash log