DR16

关于DR16数据的获取和处理

DR16&DT7

采用DBUS协议数据

  1. 波特率要调至100kbps
  2. 单位数据长度 8
  3. 奇偶校验位 偶校验
  4. 结束位 1
  5. 流控 无

注意!!!

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空闲中断接收

  1. cubemx配置

串口2接收配置

串口2 dma接收配置

串口1 发送到上位机配置

串口1 dma发送配置

因为我用的上位机内部函数有写好要用dma发送,所以才开了dma

  1. 串口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);}}
}
  1. 用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); //发送数据到上位机}}
}`

出现的问题

  1. 本来想外加queue.cqueue.h文件

    原因:对freertos的功能概念等不清,不明白队列的含义(这个会在关于freertos那张笔记进行介绍)

  2. 在接收回调函数里面把数据放到队列以后用memset()usart2_rx__buffer这个数组进行清零操作

    原因

    1. 没有考虑到这样子做由于传的是地址,清空会导致freertos在执行对数据进行解包的任务时,数据发生丢失。
    2. 下次写入数据时它本身便会对已有数据进行一个覆盖,根本就不需要清空

关于DR16数据的获取和处理相关推荐

  1. 通过聚合数据API获取微信精选文章

    思路 在聚合数据申请账号(https://www.juhe.cn/) 通过聚合数据api获取微信精选文章api 通过newspaper库提取相应的文本内容,关于newspaper库的使用方法可以参考这 ...

  2. python使用np.argsort对一维numpy概率值数据排序获取倒序索引、获取的top索引(例如top2、top5、top10)索引二维numpy数组中对应的原始数据:原始数据概率最大的头部数据

    python使用np.argsort对一维numpy概率值数据排序获取倒序索引.获取的top索引(例如top2.top5.top10)索引二维numpy数组中对应的原始数据:原始数据概率最大的头部数据 ...

  3. python使用np.argsort对一维numpy概率值数据排序获取升序索引、获取的top索引(例如top2、top5、top10)索引二维numpy数组中对应的原始数据:原始数据概率最小的头部数据

    python使用np.argsort对一维numpy概率值数据排序获取升序索引.获取的top索引(例如top2.top5.top10)索引二维numpy数组中对应的原始数据:原始数据概率最小的头部数据 ...

  4. Spark Machine Learning 03 Spark上数据的获取、处理与准备

    Chap 03 Spark上数据的获取处理 Spark上数据的获取.处理与准备 MovieStream,数据包括网站提供的电影数据.用户的服务信息数据以及行为数据. 这些数据涉及电影和相关内容(比如标 ...

  5. python量化投资必背代码-量化投资:用Python实现金融数据的获取与整理

    小编说:数据可以说是量化投资的根本,一切投资策略都是建立在数据基础上的.本文以优矿网为例,带领大家用Python实现金融数据的获取与整理. 本文选自<Python与量化投资:从基础到实战> ...

  6. Mybatis插入数据后获取主键的值

    Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...

  7. linux读取.data文件,[20121227]v$datafile访问是从数据文件获取信息吗.txt

    [20121227]v$datafile访问是从数据文件获取信息吗.txt 记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件. 虽然当时对方并 ...

  8. OSM数据的获取及格式转换

    转自 :http://blog.sina.com.cn/s/blog_72f0b6080102w39z.html 前言:本篇博文将介绍如何对OSM数据进行获取,以及格式的转换(转为shapefile格 ...

  9. js 用下标获取map值_js map方法处理返回数据,获取指定数据简写方法

    map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...

最新文章

  1. 计算机在线作业题,中医大计算机在线作业及答案-20210412090026.docx-原创力文档
  2. 影像采集-拍照 (用自己的插件 )简单逻辑
  3. Java集合篇:Map总结
  4. kvm直通sata_基于KVM的SRIOV直通配置及性能测试
  5. Springboot——HelloWorld
  6. python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...
  7. 愚蠢的怪胎技巧:通过命令行管理SkyDrive
  8. win10远程桌面 CredSSP加密Oracle修正的解决办法
  9. solver.prototxt参数解析
  10. 一个奇妙、离奇的算法题
  11. 我的世界java版游戏图标_minecraftpe JAVA版游戏包mod
  12. 移动硬盘计算机无法打开硬盘,移动硬盘无法访问,详细教您移动硬盘无法访问怎么办...
  13. matlab里面box on啥意思,image – Matlab图片中的Box on和axis坐标
  14. 一些STM32核心板选择的稳压芯片
  15. 大数据全样而非抽样原理_大数据思维原理,你了解多少?
  16. 帝国CMS 批量修改信息标题方法
  17. multiple definition of `_start'
  18. c语言程序设计竞赛策划书,C语言程序设计策划书
  19. ios图标和启动图制作工具
  20. Windows下Putty使用ssh密钥对远程连接阿里云服务器

热门文章

  1. 爬取微信文章,用70行代码爬取了搜狗上666篇文章
  2. pdfGPT|无需阅读,让 PDF 和自己对话
  3. 七阶拉丁方阵_java 拉丁方阵解析
  4. 旋转三维平面与某一坐标平面平行
  5. 基于PKS自主体系,中国电子云以可信安全聚焦央企等上云
  6. Thinkpad自动安装驱动
  7. 【Spark分布式内存计算框架——Spark Streaming】10. 应用案例:百度搜索风云榜(中)实时数据ETL存储
  8. 如何实现一个简单的课程网(源码+论文)
  9. 高中计算机做课件视频教程,怎么做ppt 制作过程视频教程电脑
  10. maven:mirror和repository