【STM32平衡小车】PC端上位机协议及代码

最新更新时间:1970-01-01来源: eefocus关键字:STM32  平衡小车  PC端 手机看文章 扫描二维码
随时随地手机看文章

一、代码再现

DataScope_DP.c


#include "DataScope_DP.h"

unsigned char DataScope_OutPut_Buffer[42] = {0};    //串口发送缓冲区



//函数说明:将单精度浮点数据转成4字节数据并存入指定地址 

//附加说明:用户无需直接操作此函数 

//target:目标单精度数据

//buf:待写入数组

//beg:指定从数组第几个元素开始写入

//函数无返回 

void Float2Byte(float *target,unsigned char *buf,unsigned char beg)

{

    unsigned char *point;

    point = (unsigned char*)target;   //得到float的地址

    buf[beg]   = point[0];//同时也也可以看出STM32是小端模式

    buf[beg+1] = point[1];

    buf[beg+2] = point[2];

    buf[beg+3] = point[3];

}

 

 

//函数说明:将待发送通道的单精度浮点数据写入发送缓冲区

//Data:通道数据

//Channel:选择通道(1-10)

//函数无返回 

void DataScope_Get_Channel_Data(float Data,unsigned char Channel)

{

if ( (Channel > 10) || (Channel == 0) ) return;  //通道个数大于10或等于0,直接跳出,不执行函数

else

{

switch (Channel)

{

case 1:  Float2Byte(&Data,DataScope_OutPut_Buffer,1); break;

case 2:  Float2Byte(&Data,DataScope_OutPut_Buffer,5); break;

case 3:  Float2Byte(&Data,DataScope_OutPut_Buffer,9); break;

case 4:  Float2Byte(&Data,DataScope_OutPut_Buffer,13); break;

case 5:  Float2Byte(&Data,DataScope_OutPut_Buffer,17); break;

case 6:  Float2Byte(&Data,DataScope_OutPut_Buffer,21); break;

case 7:  Float2Byte(&Data,DataScope_OutPut_Buffer,25); break;

case 8:  Float2Byte(&Data,DataScope_OutPut_Buffer,29); break;

case 9:  Float2Byte(&Data,DataScope_OutPut_Buffer,33); break;

case 10: Float2Byte(&Data,DataScope_OutPut_Buffer,37); break;

}

}  

}



//函数说明:生成 DataScopeV1.0 能正确识别的帧格式

//Channel_Number,需要发送的通道个数

//返回发送缓冲区数据个数

//返回0表示帧格式生成失败 

unsigned char DataScope_Data_Generate(unsigned char Channel_Number)

{

if ( (Channel_Number > 10) || (Channel_Number == 0) ) { return 0; }  //通道个数大于10或等于0,直接跳出,不执行函数

else

{

DataScope_OutPut_Buffer[0] = '$';  //帧头


switch(Channel_Number)   

case 1:   DataScope_OutPut_Buffer[5]  =  5; return  6;  

case 2:   DataScope_OutPut_Buffer[9]  =  9; return 10;

case 3:   DataScope_OutPut_Buffer[13] = 13; return 14; 

case 4:   DataScope_OutPut_Buffer[17] = 17; return 18;

case 5:   DataScope_OutPut_Buffer[21] = 21; return 22;  

case 6:   DataScope_OutPut_Buffer[25] = 25; return 26;

case 7:   DataScope_OutPut_Buffer[29] = 29; return 30; 

case 8:   DataScope_OutPut_Buffer[33] = 33; return 34; 

case 9:   DataScope_OutPut_Buffer[37] = 37; return 38;

case 10:  DataScope_OutPut_Buffer[41] = 41; return 42; 

}  

}

return 0;

}


DataScope_DP.h


#ifndef __DATA_PRTOCOL_H

#define __DATA_PRTOCOL_H

 

extern unsigned char DataScope_OutPut_Buffer[42];    //待发送帧数据缓存区


void DataScope_Get_Channel_Data(float Data,unsigned char Channel);    // 写通道数据至 待发送帧数据缓存区

unsigned char DataScope_Data_Generate(unsigned char Channel_Number);  // 发送帧数据生成函数 

 

#endif 


Minibalance.c


#include "sys.h"

#include "DataScope_DP.h"


unsigned char i;          //计数变量

unsigned char Send_Count; //串口需要发送的数据个数

static float a;


int main(void)

Stm32_Clock_Init(9);            //系统时钟设置

delay_init(72);                 //延时初始化

uart_init(72,128000);           //初始化串口1

while(1)

{

a+=0.1;

if(a>3.14)  a=-3.14; 

DataScope_Get_Channel_Data(500*sin(a), 1 );

DataScope_Get_Channel_Data(500*tan(a), 2 );

DataScope_Get_Channel_Data(500*cos(a), 3 ); 

DataScope_Get_Channel_Data(100*a , 4 );   

DataScope_Get_Channel_Data(0, 5 );

DataScope_Get_Channel_Data(0, 6 );

DataScope_Get_Channel_Data(0, 7 );

DataScope_Get_Channel_Data(0, 8 ); 

DataScope_Get_Channel_Data(0, 9 );  

DataScope_Get_Channel_Data(0, 10);

Send_Count = DataScope_Data_Generate(10);

for( i = 0 ; i < Send_Count; i++) 

{

while((USART1->SR&0X40)==0);  

USART1->DR = DataScope_OutPut_Buffer[i]; 

}

delay_ms(50); //20HZ

}


二、快速上手

波特率 128000

代码:

①处对应10个通道要显示的数据。


②处对应要显示的总共通道数!


三、代码解读

协议:


上位机通信的数据帧长度固定为 4*N+1,帧数据字节之间传输延时不可超过 1ms,否则将认为当前帧结束,UI 刷新没有限制显示延时。


串口发送缓冲区一共开了42个字节,其实用到的只有41个。每个channel占用4个,共10个channel,再加一个帧头$。 然后用哪个通道,就不断哪个通道对应的4字节就行。比如我一直用4通道(1~10),那么对应的串口发送缓冲区的位置是13-16!


知道上面两条,以上的代码就很好理解了!


平台是基于STM32F103C8T6,资料可从这里下载链接:链接,提取码:qskh

关键字:STM32  平衡小车  PC端 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic548610.html

上一篇:【STM32基础学习】八种GPIO模式总结
下一篇:【STM32平衡小车】APP调试协议及代码分析

推荐阅读

STM32输入捕获--“PWM输入模式”(可拓展多路同时捕获)
前言博文基于STM32F103ZET6和标准固件库V3.5.0在MDK5环境下开发;本博文只讨论输入捕获的PWM输入模式,这个模式是STM32输入捕获检测脉宽和频率的一种硬件处理机制,说白了就是STM32芯片专门用来进行对PWM进行捕获的一个功能;此方法相比较于传统的PWM的捕获方法,大大减小了代码量,提高了检测效率,而实际上对于PWM信号的检测还有其他方法(下面我会介绍,就是原子教程提供的方法),并且关于繁琐的寄存器的介绍这里就不多说了,有兴趣的话可以直接去我的另外一个博客里去看: https://blog.csdn.net/wuyuzun/article/details/73135662 ;(备注:此链接里的博客里有一个配套
发表于 2021-11-26
<font color='red'>STM32</font>输入捕获--“PWM输入模式”(可拓展多路同时捕获)
STM32 程序卡死在启动文件startup_stm32fxxxx.s的SysTick_Handler中
出现的问题硬件调试的时候发现程序一直在启动文件下面箭头这行。显然是跟SysTick_Handler有关由于我使用了FreeRTOS,所以需要SysTick为系统时基单元,所以需要SysTick_Handler,但是我却没有定义此中断函数,所以导致上面的程序一直进入不了以SysTick_handler命名的中断函数;填上就好了;解决问题添加SysTick_Handler函数:
发表于 2021-11-26
<font color='red'>STM32</font> 程序卡死在启动文件startup_stm32fxxxx.s的SysTick_Handler中
STM32中断挂起和RTOS任务挂起的区别
中断挂起可以理解为:将中断设置为就绪状态,一旦符合条件,立即执行中断并进入中断函数;比如A和B的抢占优先级相同,A的响应优先级高于B,那么当产生A和B中断的事件发生时,先执行A,并同时将B挂起,一旦A执行完毕,立即执行B。RTOS的任务挂起以FreeROTS为例,因为某些原因不能立即执行的任务,可以将其挂起,这个挂起使得任务暂时无法参与任务调度。只有将任务唤醒之后才能继续参与;
发表于 2021-11-26
解决STM32 SD卡官方库移植时 获取不到SD Status寄存器值的问题
前言SD卡内部的SD Status寄存器和Card Status寄存器从名字上来看好像都是状态寄存器,但实际上所要呈现的工程是不同的,这一点要注意;本博文主要说内容是怎样正确的获取SD Status寄存器的值;如有不足之处,还请多多指教;问题SD Status寄存器表如下,我想获取其中的AU_SIZE的值([400:0]这段位域内没有信息,我这里忽略了)如下图,AU_SIZE的值本身应该在0x01~0x09之间,但是我用串口打印出来的值却是0;获取SD Status寄存器的函数代码如下:/**   * @brief SD Card Status   */typedef struct{ 
发表于 2021-11-25
解决<font color='red'>STM32</font> SD卡官方库移植时 获取不到SD Status寄存器值的问题
SD卡存储容量的计算过程
前言SD卡底层驱动代码量不小,功能稍微有点复杂,其他的功能不说了;本博文主要介绍SD卡V1.0和V2.0版本的SD卡的容量结算;在对SD卡进行FATFS文件系统(最新R0.13c版本)移植时,接口函数DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void *buff )会获取SD卡的三个重要信息作为f_fdisk和f_mkfs函数为整个SD卡分区和挂载文件系统的依据;下面的代码来自于STM32官方提供的固件库的SD卡例程,但是:例程里边有错误的地方需要修改,如果不修改有可能会影响到FatFS系统移植时分区的问题,在博文的最后有特别指出;CSD寄存器(Card-Specific Data
发表于 2021-11-25
SD卡存储容量的计算过程
STM32 HardFault_Handler 硬件错误 解决办法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。STM32出现硬件错误可能有以下原因:(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4)中断处理错误;遇到这种情况,可以通过以下2种方式来定位到出错代码段。方法1:1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR
发表于 2021-11-25
<font color='red'>STM32</font> HardFault_Handler 硬件错误 解决办法

推荐帖子

关于Vxworks的疑问
本人刚进公司,被分到做vxworks软件,原来没有接触过vxworks,所以也不是很了解,请各位帮忙讲解一下,主要是vxworks是做什么的,它的应用平台,当前形势,以及怎么去学,主要按那个方向去学习,如果将来想跳槽应该跳哪个方向的,谢谢哈^-^关于Vxworks的疑问
hoyden 实时操作系统RTOS
【求助】430 JTAG下载问题
小弟初次用430,下载不了程序,显示cannotloadprogrambecauseflashemulationtoolnotfound.检查线路没有问题!请教是什么问题!先谢了啊!【求助】430JTAG下载问题
ltby00 微控制器 MCU
多速率数字信号处理发展史上的开山之作----经典
R.E.CrochiereandL.R.Rabiner MultirateDigitalSignalProcessing Prentice-Hall,1983,ISBN0-13-605162-6. Thisbookistheonlyrealreferenceforfilterbanksandmultiratesystems,asopposedtobeingatutorial. PeterKootsookosnotes
analog010 DSP 与 ARM 处理器
CH554评测:三,跑一下HID
HID是HumanInterfaceDevice的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。 交换的数据存储在称为报表(report)的结构内,设备的固件必须支持HID报表的格式。主机在控制与中断传输中传送与要求报表,来传送与接收数据。报表的格式非常有弹性,可以处理任何类别的数据。 设备除了HID接口之外,它可能同时还包含有其他的USB接口。例如影像显示设备可能使用HID
ddllxxrr 单片机
基于DSPE1的硬件开发平台设计
基于DSPE1的硬件开发平台设计基于DSPE1的硬件开发平台设计
maker 单片机
现在是做JAVA开发的(计算机专业出身的),想转硬件开发,大家给我指一条学习路线吧,谢谢各位了。
现在是做JAVA开发的(计算机专业出身的),想转硬件开发,大家给我指一条学习路线吧,谢谢各位了。现在是做JAVA开发的(计算机专业出身的),想转硬件开发,大家给我指一条学习路线吧,谢谢各位了。
hzwwqq 嵌入式系统
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved