当前位置:网站首页>仿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); //使能串口中断
}
}
边栏推荐
- Looking for a job - a chat with my cousin
- 剑指 Offer II 097. 子序列的数目
- About the choice of x86, x64, x86_64, ARM 64, ARM 32 when installing software
- 7 行代码搞崩溃 B 站,原因令人唏嘘!
- 336. Palindromic Pairs
- 断言+异常处理类,代码更简洁了
- Huawei laptop keyboard locked (how does the laptop keyboard light up)
- The difference between uri and url is simple to understand (what is the difference between uri and url)
- 优惠券系统设计思想
- TCP协议详解
猜你喜欢
![LeetCode 593 有效的正方形[数学] HERODING的LeetCode之路](/img/c2/34624c9c7693ba40d0b3724c0db611.png)
LeetCode 593 有效的正方形[数学] HERODING的LeetCode之路

相亲信息

First thoughts on the first attempt to avoid killing without a file (Part 1)

R language for airbnb data nlp text mining, geography, word cloud visualization, regression GAM model, cross-validation analysis

378. 有序矩阵中第 K 小的元素

WeChat Mini Program 31 Subcontracting Mechanism

Setinel 原理简介

OneNote tutorial, how to take notes in OneNote?

Cobaltstrike and BurpSuite desktop shortcut configuration

诺氟沙星-DNA复合物|半乳糖化脂质体-聚阳离子-DNA复合物|注意事项
随机推荐
C# WPF给综合实战项目加个帮助文档
mdnice-test
分布式限流 redission RRateLimiter 的使用及原理
Use the PostgreSQL GRANT command to modify permissions on various database objects
The difference between uri and url is simple to understand (what is the difference between uri and url)
无文件落地免杀的初尝试思考(上)
Kotlin - Coroutine Scope CoroutineScope, Coroutine Builder CoroutineBuilder, Coroutine Scope Function CoroutineScope Functiom
LeetCode 0593. 有效的正方形
MySQL Data Query - Union Query
基于PaddleSpeech搭建个人语音听写服务
网站ping端口的操作方法和命令介绍
Dry goods!Cooperative Balance in Federated Learning
sizeof和strlen的区别(strlen和sizeof的用法)
PEG-PEI共聚物/DNA复合物|甘草次酸修饰的长循环阳离子脂质体DNA复合物|解析说明
R language for airbnb data nlp text mining, geography, word cloud visualization, regression GAM model, cross-validation analysis
Durable rules (persistent rules engine) learning notes
从实例学Kettle(一):获取股票行情数据
OneNote tutorial, how to take notes in OneNote?
The sword refers to Offer II 097. Number of subsequences
一 JS中Promise用法、二闭包的概念与用法、三对象创建的四种方式与区区别、四 如何声明一个类