当前位置:网站首页>仿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); //使能串口中断
}
}
边栏推荐
- 网站ping端口的操作方法和命令介绍
- Cobaltstrike和BurpSuite桌面快捷配置
- Oracle问题: ORA-01882: 未找到时区
- LeetCode 0593. 有效的正方形
- WeChat Mini Program 30 Customizing Templates and Obtaining User Login Credentials
- 干货!联邦学习中的合作均衡
- 微博账号奇葩逻辑产品设计
- 第二好PyTorch新手课程;论文写作指南;使用µGo语言开发迷你编译器;超高效使用Transformer的扩展库;前沿论文 | ShowMeAI资讯日报
- 940. Different subsequences II
- 用 Array.every & Array.some 匹配全部/部分内容 es6
猜你喜欢

如何进入董事会:给CIO的十条建议

诺氟沙星-DNA复合物|半乳糖化脂质体-聚阳离子-DNA复合物|注意事项

336. Palindromic Pairs

Looking for a job - a chat with my cousin

OneNote tutorial, how to take notes in OneNote?

RedisJson 横空出世!

酷客导航助你商场轻松购物,业务办理不迷茫

【Nacos】nacos1.x 单机、内置数据库模式修改密码

The Ministry of Human Resources and Social Security announced that "database operation administrator" has become a new occupation, and OceanBase participated in the formulation of occupational standar

怎么实现您的个人知识库?
随机推荐
分析少年派2中的Crypto
Come in now!!!Take you to know the basic data types of C language
带你刷(牛客网)C语言百题(第四天)
模型推理模板
LeetCode 0144. 二叉树的前序遍历:二叉树必会题
C# 窗体与子线程数据交互
错误解决:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]
从实例学Kettle(一):获取股票行情数据
【593. Valid Square】
Liu Genghong, boys and girls, come here!Sports data analysis and mining!(with a full set of code and data sets)
惠普服务器硬盘指示灯不亮或显示蓝色
378. The Kth Smallest Element in an Ordered Matrix
PEG-PEI共聚物/DNA复合物|甘草次酸修饰的长循环阳离子脂质体DNA复合物|解析说明
【无标题】
七个易犯的 IT 管理错误—以及如何避免
240. Searching 2D Matrix II
根据昵称首字母生成头像
相亲信息
Baidu internship students late night fun: originally giant is this kind of life
酷客导航助你商场轻松购物,业务办理不迷茫