关于DR16数据的获取和处理
DR16
关于DR16数据的获取和处理
DR16&DT7
采用DBUS协议数据
- 波特率要调至100kbps
- 单位数据长度 8
- 奇偶校验位 偶校验
- 结束位 1
- 流控 无
注意!!!
cubemx配置的时候,长度要配成9
因为那个是包括校验位的
遥控器不同遥杆传输的数据类型
鼠标及按键信息
遥控器通道与控制开关
控制代码
1.定义相应结构体
typedef struct
{struct {int16_t ch0;int16_t ch1;int16_t ch2;int16_t ch3;int8_t s1;int8_t s2;}remote;struct {int16_t x;int16_t y;int16_t z;int8_t press_left;int8_t press_right;}mouse;union {uint16_t key_code;struct {uint16_t W :1;uint16_t S :1;uint16_t A :1;uint16_t D :1;uint16_t Q :1;uint16_t E :1;uint16_t Shift :1;uint16_t Ctrl :1;}bit;}key;}RC_Ctrl_t;
2.写它的解包函数
减掉1024是想要把初始值变为0
`void Get_DR16_Data(uint8_t *Buff){RC_CtrlData.remote .ch0 =(Buff[0]|Buff[1]<<8)&0x07FF;RC_CtrlData.remote .ch0 -=1024;RC_CtrlData.remote .ch1 =(Buff [1]>>3|Buff[2]<<5)&0x07FF;RC_CtrlData.remote .ch1 -=1024;RC_CtrlData.remote .ch2 =(Buff[2]>>6|Buff[3]<<2|Buff[4]<<10)&0x07FF;RC_CtrlData.remote .ch2 -=1024;RC_CtrlData.remote .ch3 =(Buff[4]>>1|Buff[5]<<7)&0x07FF;RC_CtrlData.remote .ch3 -=1024;RC_CtrlData.remote .s1 =(Buff[5]>>4&0x000C)>>2;RC_CtrlData.remote .s2 =(Buff[5]>>4&0x003);RC_CtrlData.mouse .x =(Buff[6]|Buff[7]<<8);RC_CtrlData.mouse .y =(Buff[8]|Buff[9]<<8);RC_CtrlData.mouse .z =(Buff[10]|Buff[11]<<8);RC_CtrlData.mouse .press_left =(Buff[12]);RC_CtrlData.mouse .press_right =(Buff[13]);}`
串口1接收原始数据并进行储存
串口dma空闲中断接收
- cubemx配置
串口2接收配置
串口2 dma接收配置
串口1 发送到上位机配置
串口1 dma发送配置
因为我用的上位机内部函数有写好要用dma发送,所以才开了dma
- 串口2dma不定长收
串口2中断函数
`if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)){USART_Receive_IDLE(&huart2);}RecHandle(usart2_rx__buffer,usart2_tx__len);`
另外USART_Receive_IDLE()定义如下
void USART_Receive_IDLE(UART_HandleTypeDef *huart)
{uint16_t i=0;BaseType_t pxHigherPriorityTaskWoken = pdFALSE;static USART_COB Usart_RxCOB;if(__HAL_UART_ENABLE_IT(&huart2 ,UART_IT_IDLE)!=RESET ) //触发空闲中断{if(huart->Instance ==USART2 ) //判断是串口2{__HAL_UART_CLEAR_FEFLAG(&huart2); //清除中断标志位HAL_UART_DMAStop (&huart2); //关闭dmai= huart->Instance->SR; //软件序列清零 先SR后DRi= huart->Instance->DR;i=hdma_usart2_rx.Instance->NDTR; //计算dma里未传输的数目usart2_tx__len=128-i; //计算dma传输的数目/*用队列替代简单的mencpy操作*/if(USART_RXPORT != NULL){Usart_RxCOB.port_num=1;Usart_RxCOB.len = usart2_tx__len;Usart_RxCOB.address = usart2_rx__buffer;xQueueSendFromISR(USART_RXPORT,&Usart_RxCOB,&pxHigherPriorityTaskWoken);}
/*本来是利用简单的将usart2_rx__buffer copy到usart1_tx__buffer中,将其作为一个缓存if(usart2_rx__flag==0){//把接收到的东西发送出去memcpy(usart1_tx__buffer,usart2_rx__buffer,usart2_tx__len); usart2_rx__flag =1;}*/HAL_UART_Receive_DMA(huart,(uint8_t *)usart2_rx__buffer,128);}}
}
- 用freertos的队列暂存串口2中接受的数据,并在任务中解包并发送至上位机
`/*对DR16的数据进行处理,然后发送到上位机*/
TaskHandle_t Freertos_DR16_Data_Handle;
void Freertos_DR16_Data(void * argument);
void Freertos_DR16_Data_Init(void)
{xTaskCreate(Freertos_DR16_Data , "Freertos_DR16_Data",128 ,NULL ,6,&Freertos_DR16_Data_Handle);
}
void Freertos_DR16_Data(void * argument)
{static USART_COB Usart_RxCOB;TickType_t xLastWakeTime_t = xTaskGetTickCount();TickType_t _xTicksToWait = pdMS_TO_TICKS(1);for(;;){// if( usart2_rx__flag==1)``//启用队列处理函数if(xQueueReceive(USART_RXPORT,&Usart_RxCOB,portMAX_DELAY) == pdPASS) {Get_DR16_Data(Usart_RxCOB.address); //解包得到的DR16的数据vTaskDelayUntil(&xLastWakeTime_t, _xTicksToWait);
// usart2_rx__flag = 0;Sent_Contorl(&huart1); //发送数据到上位机}}
}`
出现的问题
本来想外加
queue.c
和queue.h
文件原因:对
freertos
的功能概念等不清,不明白队列的含义(这个会在关于freertos
那张笔记进行介绍)在接收回调函数里面把数据放到队列以后用
memset()
将usart2_rx__buffer
这个数组进行清零操作原因:
- 没有考虑到这样子做由于传的是地址,清空会导致
freertos
在执行对数据进行解包的任务时,数据发生丢失。 - 下次写入数据时它本身便会对已有数据进行一个覆盖,根本就不需要清空
- 没有考虑到这样子做由于传的是地址,清空会导致
关于DR16数据的获取和处理相关推荐
- 通过聚合数据API获取微信精选文章
思路 在聚合数据申请账号(https://www.juhe.cn/) 通过聚合数据api获取微信精选文章api 通过newspaper库提取相应的文本内容,关于newspaper库的使用方法可以参考这 ...
- python使用np.argsort对一维numpy概率值数据排序获取倒序索引、获取的top索引(例如top2、top5、top10)索引二维numpy数组中对应的原始数据:原始数据概率最大的头部数据
python使用np.argsort对一维numpy概率值数据排序获取倒序索引.获取的top索引(例如top2.top5.top10)索引二维numpy数组中对应的原始数据:原始数据概率最大的头部数据 ...
- python使用np.argsort对一维numpy概率值数据排序获取升序索引、获取的top索引(例如top2、top5、top10)索引二维numpy数组中对应的原始数据:原始数据概率最小的头部数据
python使用np.argsort对一维numpy概率值数据排序获取升序索引.获取的top索引(例如top2.top5.top10)索引二维numpy数组中对应的原始数据:原始数据概率最小的头部数据 ...
- Spark Machine Learning 03 Spark上数据的获取、处理与准备
Chap 03 Spark上数据的获取处理 Spark上数据的获取.处理与准备 MovieStream,数据包括网站提供的电影数据.用户的服务信息数据以及行为数据. 这些数据涉及电影和相关内容(比如标 ...
- python量化投资必背代码-量化投资:用Python实现金融数据的获取与整理
小编说:数据可以说是量化投资的根本,一切投资策略都是建立在数据基础上的.本文以优矿网为例,带领大家用Python实现金融数据的获取与整理. 本文选自<Python与量化投资:从基础到实战> ...
- Mybatis插入数据后获取主键的值
Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...
- linux读取.data文件,[20121227]v$datafile访问是从数据文件获取信息吗.txt
[20121227]v$datafile访问是从数据文件获取信息吗.txt 记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件. 虽然当时对方并 ...
- OSM数据的获取及格式转换
转自 :http://blog.sina.com.cn/s/blog_72f0b6080102w39z.html 前言:本篇博文将介绍如何对OSM数据进行获取,以及格式的转换(转为shapefile格 ...
- js 用下标获取map值_js map方法处理返回数据,获取指定数据简写方法
map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...
最新文章
- 计算机在线作业题,中医大计算机在线作业及答案-20210412090026.docx-原创力文档
- 影像采集-拍照 (用自己的插件 )简单逻辑
- Java集合篇:Map总结
- kvm直通sata_基于KVM的SRIOV直通配置及性能测试
- Springboot——HelloWorld
- python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...
- 愚蠢的怪胎技巧:通过命令行管理SkyDrive
- win10远程桌面 CredSSP加密Oracle修正的解决办法
- solver.prototxt参数解析
- 一个奇妙、离奇的算法题
- 我的世界java版游戏图标_minecraftpe JAVA版游戏包mod
- 移动硬盘计算机无法打开硬盘,移动硬盘无法访问,详细教您移动硬盘无法访问怎么办...
- matlab里面box on啥意思,image – Matlab图片中的Box on和axis坐标
- 一些STM32核心板选择的稳压芯片
- 大数据全样而非抽样原理_大数据思维原理,你了解多少?
- 帝国CMS 批量修改信息标题方法
- multiple definition of `_start'
- c语言程序设计竞赛策划书,C语言程序设计策划书
- ios图标和启动图制作工具
- Windows下Putty使用ssh密钥对远程连接阿里云服务器