AGV项目底层总结二
接着《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项目底层总结二相关推荐
- java 动态加载ztree_JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建...
1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree( ...
- SSM米米商城项目笔笔记二(登录业务逻辑实现)
米米商城项目笔笔记二(登录业务逻辑实现) Service层业务逻辑实现 由于在笔记一中已经完成了底层的搭建,所以可以直接上手service层代码的编写 在service包下创建AdminService ...
- vue 2.x项目 vue-qriously 生成二维码并下载、cliploard复制粘贴
近日,重构项目某一老模块时,有一个功能是生成二维码并下载,还可以复制链接.列表每项都有二维码.下载二维码和复制链接和列表上方总的二维码. 老模块是用的qrocode中文文档,qrcode github ...
- 100个vc小项目开发:二、一步一点设计音乐播放器 [I]
100个vc小项目开发:二.一步一点设计音乐播放器 [源码解读] 文章作者: July 软件来源:开源 ================== 1.有不正之处,恳请指正. 2.本文贴出的是关键实现代码部 ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21 我要评论 这篇文章主要介绍了Android项 ...
- Android项目实战(二十二):启动另一个APP or 重启本APP
Android项目实战(二十二):启动另一个APP or 重启本APP 原文:Android项目实战(二十二):启动另一个APP or 重启本APP 一.启动另一个APP 目前公司项目需求,一个主AP ...
- Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目
文章目录 一.安装 Vue CLI 二.构建前端项目 2.1.创建一个基于 webpack 模板的项目 2.2. 安装图解 2.3. 项目结构总览 2.4. 运行项目 2.5. 浏览器验证 项目Git ...
- Oracle数据库12cR2(项目实战之二):Linux系统安装Oracle12.2
oracle数据库12cR2(项目实战之二):linux系统安装Oracle12.2 一.课程主题: 风哥Oracle数据库教程12cR2(项目实战之二):在linux操作系统安装Oracle12.2 ...
- 学习Coding-iOS开源项目日志(二)
继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...
- 【电商系统】—项目缺陷管理(二)
[电商系统]-项目缺陷管理(二) 题目分析:如何做bug/缺陷管理? 答题思路 缺陷管理角色 bug处理流程图
最新文章
- 五、任意输入10个int类型数据,排序输出,再找出素数
- 007_Spring Data JPA JPQL
- php数据库图片读取不出来,图片显示不出来,但是数据库里有显示
- 手把手教你在ubuntu上安装LAMP
- alter procedure是什么意思_板上钉钉的意思
- php程序301重定向,php 301重定向的实现方法
- 修改Google toolbar for firefox的默认语言
- 简述 JPA 与 Spring Data JPA 与 Hibernate
- C++ STL unordered_map按照value排序
- 《软件需求十步走》阅读计划第三篇
- 非递归二叉树的序列打印
- vivado DEBUG使用说明
- 【教程】鼠标右键新建添加RTF文档
- Phaser 使用介绍
- .NET选择模板添加书签导出Word文档,Web导出至Excel。WordHelp类和ExcelHelp类
- 每日学习-Java基础(十)接口和继承10(内部类)
- Camtasia Studio2023非常好用的电脑录屏软件
- 做UI设计需要具备什么技能
- java 10.0.2 配置 bcprov-jdk-15
- js子窗口之间互相调用,top在捣乱