接着《AGV项目底层总结一》这篇博客,就AGV项目底层的代码设计技巧来进行讲解。

串口数据接收处理

串口指令的接收所用中断的方式,同时在中断里进行数据帧的识别,接收完整一帧数据后标志位置1,在main函数中通过标志位的判断来进行接收到指令的相应处理。

//串口1中断服务程序
void USART1_IRQHandler(void)
{u8 Res;static u8 reci_step = 0;                               //数据接收状态机static u8 length = 0,i = 0;                              //指令长度计数指针if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断{Res = USART1->DR;                              //(USART1->DR);  //读取接收到的数据switch(reci_step){case 0:                                     //接收判断帧头0xcdif(Res == 0xcd){reci_step = 1;USART1_RX_STA = 1;                    //开始接收数据帧状态}else reci_step = 0;break;case 1:                                       //接收判断帧头0xaaif(Res == 0xaa) reci_step = 2;else reci_step = 0;break;case 2:                                      //接收判断帧头0x55if(Res == 0x55) reci_step = 3;else reci_step = 0;break;case 3:                                      //接收指令长度length = Res;i = 0;USART1_RX_BUF[i++] = Res;reci_step = 4;break;case 4:                                       //接收完整数据USART1_RX_BUF[i++] = Res;if(i > length){reci_step = 0;USART1_RX_STA = 2;                   //数据帧接收完成状态}break;default:reci_step = 0;break;}}
}

数据总汇—结构体

在嵌入式的项目中,往往离不开许多数据的采集,本项目中数据采集后需要将数据通过串口进行传递,问题在于我们采集出来的数据大都是以变量的形式单独存。那么再批量发送之前,我们首先要做的就是将采集到的所有数据进行总汇。在项目中我们定义了一个结构体用来存放采集的所有数据,然后将此结构体的数据转移至数组中以便统一发送。话不多说,直接上代码。

//.h文件
#define SENSOR_DLEN 23typedef struct {int status;       //小车状态float power;      //电源电压float theta;      //方位角int encoder_ppr;  //旋转一圈脉冲数int encoder_delta_r;//右轮编码器int encoder_delta_l;int encoder_delta_car;//两车轮中心位移float omga_r;       //右轮转速float omga_l;float distance1;  //第一个超声波距离值float distance2;float distance3;float distance4;float IMU[9];    //9轴数据unsigned int time_stamp;//时间戳
}UPLOAD_STATUS;extern UPLOAD_STATUS SENSOR_DATA;
//.c文件
UPLOAD_STATUS SENSOR_DATA;
u8 SendBuff[119]; //发送缓存数组
void SEND_SENSOR_DATA(void)
{//调用DMA控制发送数据int i;static int j = 0;SendBuff[0] = 0xcd;SendBuff[1] = 0xeb;SendBuff[2] = 0xd7;SendBuff[3] = sizeof(SENSOR_DATA)/4*5;for(i = 0; i < SENSOR_DLEN; i++){SendBuff[4+i*5] = *(((u8 *)(&SENSOR_DATA))+i*4+0); SendBuff[5+i*5] = *(((u8 *)(&SENSOR_DATA))+i*4+1); SendBuff[6+i*5] = *(((u8 *)(&SENSOR_DATA))+i*4+2); SendBuff[7+i*5] = *(((u8 *)(&SENSOR_DATA))+i*4+3); SendBuff[8+i*5] =  0x20;}USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能串口1的DMA发送MYDMA_Enable(DMA1_Channel4,119);//搬运一次串口数据SENSOR_DATA.time_stamp++;//每发送一次时间戳加1
}

多字节数据的串口发送

总所周知,串口一次发送最多1个字节(8bit),当遇到多字节的数据需要通过其发送时,应该先对数据进行字节提取,然后按字节将数据进行串口发送。那么如何进行字节提取呢?现在介绍两种多字节数据的字节提取方式,直接上代码。

uint32_t rd_state;
abh_receive[3] = *(((uint8_t *)(&rd_state))+3);  //可适用于浮点型
abh_receive[4] = *(((uint8_t *)(&rd_state))+2);
abh_receive[5] = *(((uint8_t *)(&rd_state))+1);
abh_receive[6] = *(((uint8_t *)(&rd_state))+0); abh_receive[7] =  last_pulse1 >>24;             //只适用于整形
abh_receive[8] =  last_pulse1 >>16;
abh_receive[9] =  last_pulse1 >>8 ;
abh_receive[10] = last_pulse1        ;

AGV项目底层总结二相关推荐

  1. java 动态加载ztree_JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建...

    1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree( ...

  2. SSM米米商城项目笔笔记二(登录业务逻辑实现)

    米米商城项目笔笔记二(登录业务逻辑实现) Service层业务逻辑实现 由于在笔记一中已经完成了底层的搭建,所以可以直接上手service层代码的编写 在service包下创建AdminService ...

  3. vue 2.x项目 vue-qriously 生成二维码并下载、cliploard复制粘贴

    近日,重构项目某一老模块时,有一个功能是生成二维码并下载,还可以复制链接.列表每项都有二维码.下载二维码和复制链接和列表上方总的二维码. 老模块是用的qrocode中文文档,qrcode github ...

  4. 100个vc小项目开发:二、一步一点设计音乐播放器 [I]

    100个vc小项目开发:二.一步一点设计音乐播放器 [源码解读] 文章作者: July 软件来源:开源 ================== 1.有不正之处,恳请指正. 2.本文贴出的是关键实现代码部 ...

  5. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21 我要评论 这篇文章主要介绍了Android项 ...

  6. Android项目实战(二十二):启动另一个APP or 重启本APP

    Android项目实战(二十二):启动另一个APP or 重启本APP 原文:Android项目实战(二十二):启动另一个APP or 重启本APP 一.启动另一个APP 目前公司项目需求,一个主AP ...

  7. Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目

    文章目录 一.安装 Vue CLI 二.构建前端项目 2.1.创建一个基于 webpack 模板的项目 2.2. 安装图解 2.3. 项目结构总览 2.4. 运行项目 2.5. 浏览器验证 项目Git ...

  8. Oracle数据库12cR2(项目实战之二):Linux系统安装Oracle12.2

    oracle数据库12cR2(项目实战之二):linux系统安装Oracle12.2 一.课程主题: 风哥Oracle数据库教程12cR2(项目实战之二):在linux操作系统安装Oracle12.2 ...

  9. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  10. 【电商系统】—项目缺陷管理(二)

    [电商系统]-项目缺陷管理(二) 题目分析:如何做bug/缺陷管理? 答题思路 缺陷管理角色 bug处理流程图

最新文章

  1. 五、任意输入10个int类型数据,排序输出,再找出素数
  2. 007_Spring Data JPA JPQL
  3. php数据库图片读取不出来,图片显示不出来,但是数据库里有显示
  4. 手把手教你在ubuntu上安装LAMP
  5. alter procedure是什么意思_板上钉钉的意思
  6. php程序301重定向,php 301重定向的实现方法
  7. 修改Google toolbar for firefox的默认语言
  8. 简述 JPA 与 Spring Data JPA 与 Hibernate
  9. C++ STL unordered_map按照value排序
  10. 《软件需求十步走》阅读计划第三篇
  11. 非递归二叉树的序列打印
  12. vivado DEBUG使用说明
  13. 【教程】鼠标右键新建添加RTF文档
  14. Phaser 使用介绍
  15. .NET选择模板添加书签导出Word文档,Web导出至Excel。WordHelp类和ExcelHelp类
  16. 每日学习-Java基础(十)接口和继承10(内部类)
  17. Camtasia Studio2023非常好用的电脑录屏软件
  18. 做UI设计需要具备什么技能
  19. java 10.0.2 配置 bcprov-jdk-15
  20. js子窗口之间互相调用,top在捣乱

热门文章

  1. 太阳高度角与方位角计算
  2. 改ip 银河麒麟_PK体系银河麒麟云桌面和云平台
  3. NameNode中Fslmage镜像和Edits编辑日志详解
  4. 计算机信息系统的运行安全包括什么,计算机信息系统安全主要包括什么
  5. GNSS说第(四)讲---最新最全的IGS分析中心详情
  6. 使用excel2007做聚光灯
  7. 机器学习中的GPU硬件设备及共享访问
  8. 第三十八章 SQL命令 DROP TABLE
  9. 【算法学习笔记】4:贪心法,回溯法,分支限界法,解空间树剪枝
  10. tail关键字查询日志