当前位置:网站首页>仿SBUS与串口数据固定转换
仿SBUS与串口数据固定转换
2022-08-05 09:26:00 【CaewarfeneggerCao】
写在前面
无论如何,数据肯定是在嵌入式中无法避免的一个问题。杂乱无章的数据没有太大的意义。因此我们需要在源头将数据打包,组帧,再进行传输;抵达终端后进行解包,还原,读取出原始数据。
编程思路
该函数运用于一个简易的环境检测项目,使用到了LoRa模块,直接用单片机的串口驱动即可。但是使用的STM32F1系列单片机ADC为12位,存储变量又只有8位或16位,这其中需要进行数据转换。SBUS协议中帧头为0x0F,帧尾为0x00,倒数第二个字节为标志字节,计划将其作为一个紧急标志字节,例如正常情况是间隔一段时间报告一次采集节点周围环境情况;但有火情或是其它数据超过阈值,则立即发送数据。不过此次重点在于如何转换,为求简便,不考虑校验。
构建结构
typedef struct _SBUSData_Struct
{
uint16_t Channel[8];
uint8_t FlagByte;
} SBUSData_Struct;
具体函数
1.将串口数据转换为仿SBUS数据。
ErrorStatus Map_SCOMtoSBUS(SBUSData_Struct *SBUSdata,uint8_t *SCOMdata)
{
uint8_t ii;
if((SCOMdata == NULL) | (SCOMdata[0] != 0x0F)|(SCOMdata[13] != 0x00))
{
return ERROR;
}
SBUSdata->FlagByte = *(SCOMdata +12);
SBUSdata->Channel[0] = ((*(SCOMdata +2)<<8) | (*(SCOMdata +1))>>0)&0x07FF;
SBUSdata->Channel[1] = ((*(SCOMdata +3)<<5) | (*(SCOMdata +2))>>3)&0x07FF;
SBUSdata->Channel[2] = ((*(SCOMdata +5)<<10) | ((*(SCOMdata +4))<<2) | ((*(SCOMdata +3))>>6))&0x07FF;
SBUSdata->Channel[3] = ((*(SCOMdata +6)<<7) | (*(SCOMdata +5))>>1)&0x07FF;
SBUSdata->Channel[4] = ((*(SCOMdata +7)<<4) | (*(SCOMdata +6))>>4)&0x07FF;
SBUSdata->Channel[5] = ((*(SCOMdata +9)<<9) | ((*(SCOMdata +8))<<1) | ((*(SCOMdata +7))>>7))&0x07FF;
SBUSdata->Channel[6] = ((*(SCOMdata +10)<<6) | (*(SCOMdata +9))>>2)&0x07FF;
SBUSdata->Channel[7] = ((*(SCOMdata +11)<<3) | (*(SCOMdata +10))>>5)&0x07FF;
for(ii = 0; ii < 8; ii++)
{
if(SBUSdata->Channel[ii] > 2047)
{
SBUSdata->Channel[ii] = 2047;
}
}
return SUCCESS;
}
2.将仿SBUS数据转换为串口数据。
ErrorStatus Map_SBUStoSCOM(uint8_t *SCOMdata,SBUSData_Struct *SBUSdata)
{
uint8_t ii;
uint16_t Tempdata[16];
if(SBUSdata == NULL)
{
return ERROR;
}
*(SCOMdata + 0) = 0x0F;
*(SCOMdata + 13) = 0x00;
*(SCOMdata + 12) = SBUSdata->FlagByte;
for(ii=0;ii<8;ii++)
{
Tempdata[ii] = SBUSdata->Channel[ii] & 0x07FF;
}
*(SCOMdata + 1) = Tempdata[0] & 0xFF;
*(SCOMdata + 2) = (Tempdata[0]>>8)|(Tempdata[1]<<3);
*(SCOMdata + 3) = (Tempdata[1]>>5)|(Tempdata[2]<<6);
*(SCOMdata + 4) = (Tempdata[2]>>2);
*(SCOMdata + 5) = (Tempdata[2]>>10)|(Tempdata[3]<<1);
*(SCOMdata + 6) = (Tempdata[3]>>7)|(Tempdata[4]<<4);
*(SCOMdata + 7) = (Tempdata[4]>>4)|(Tempdata[5]<<7);
*(SCOMdata + 8) = (Tempdata[5]>>1);
*(SCOMdata + 9) = (Tempdata[5]>>9)|(Tempdata[6]<<2);
*(SCOMdata + 10) = (Tempdata[6]>>6)|(Tempdata[7]<<5);
*(SCOMdata + 11) = (Tempdata[7]>>3);
return SUCCESS;
}
写在后面
帧头和帧尾是固定的,标志字节暂时没有考虑,因为如果仅是“紧急情况”与“普通情况”,数据位数足够满足。本质上就是11个8bit的数据转换成8个11bit的数据。虽然说定义变量的时候仍然是uint16_t,即unsigned short int。但那是因为计算机是二进制,我不能定义11位的数据,但我可以定义了16位的数据,但只用到11位。例如函数中也有一个大于2047便等于2047的操作。因为12位ADC,最大值应该是4095,但全统一为11位,所以有此操作。
单单一种仿制的通信格式,刚刚接触的时候也是焦头烂额,遑论更完备的协议,要斟酌的东西太多了。还是要继续学习。
若是对数据要求只在二进制下,11位也可以传输12位的数据,传输前右移一位,传输后左移一位,便可以恢复。
边栏推荐
- MQTT X Newsletter 2022-07 | 自动更新、MQTT X CLI 支持 MQTT 5.0、新增 conn 命令…
- ECCV 2022 Oral Video Instance Segmentation New SOTA: SeqFormer & IDOL and CVPR 2022 Video Instance Segmentation Competition Champion Scheme...
- 无题七
- 只有一台交换机,如何实现主从自动切换之nqa
- 深度学习21天——卷积神经网络(CNN):服装图像分类(第3天)
- 无题十一
- 嵌入式实操----基于RT1170 移植memtester做SDRAM测试(二十五)
- Thinking and summary of the efficiency of IT R&D/development process specification
- Embedded practice ---- based on RT1170 transplant memtester to do SDRAM test (25)
- 链表中的数字相加----链表专题
猜你喜欢

hcip BGP 增强实验

19.服务器端会话技术Session

交换机端口的三种类型详解与hybrid端口实验

上海控安技术成果入选市经信委《2021年上海市网络安全产业创新攻关成果目录》

How to realize the short press and long press detection of the button?

链表中的数字相加----链表专题

Overall design and implementation of Kubernetes-based microservice project

Dynamic memory development (C language)

mysql进阶(二十七)数据库索引原理

干货!生成模型的评价与诊断
随机推荐
正则表达式replaceFirst()方法具有什么功能呢?
HStreamDB Newsletter 2022-07|分区模型优化、数据集成框架进一步完善
How to realize the short press and long press detection of the button?
请问大佬们 ,使用 Flink SQL CDC 是不是做不到两个数据库的实时同步啊
ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...
欧盟 | 地平线 2020 ENSEMBLE:D2.13 SOTIF Safety Concept(下)
韦东山 数码相框 项目学习(六)tslib的移植
PAT乙级-B1021 个位数统计(15)
【ASM】字节码操作 方法的初始化 Frame
无题七
ECCV 2022 Oral Video Instance Segmentation New SOTA: SeqFormer & IDOL and CVPR 2022 Video Instance Segmentation Competition Champion Scheme...
Assembly language (8) x86 inline assembly
leetcode points to Offer 10- I. Fibonacci sequence
Marketing Suggestions | You have an August marketing calendar to check! Suggest a collection!
Dynamic memory development (C language)
Hundred lines of code launch red hearts, why programmers lose their girlfriends!
程序员的七种武器
15.1.1、md—md的基础语法,快速的写文本备忘录
express hot-reload
Going to book tickets tomorrow, ready to go home~~