历史上的今天
今天是:2024年09月22日(星期日)
2021年09月22日 | 【STM32平衡小车】PC端上位机协议及代码
2021-09-22 来源:eefocus
一、代码再现
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
史海拾趣
|
求助各位大侠:谁有或知道有单片机控制的TT50通信模块的C语言初始化程序和收发信息程序 求助各位TT50通信模块的初始化程序和短信收发的C语言程序,由单片机控制TT50,TT50的初始化程序,在接到单片机的控制指令时怎么发送消息?谢谢各位大侠!!!!… 查看全部问答> |
|
目前正在调SD卡(2.0的协议)驱动,它的读写速度特别慢,写200KB/s左右,读大概是写的2-3倍.目前用的通信模式是SD模式,传输方式为DMA传输,时钟频率调高来试过了,可是速度还是一个样慢.我测试用的SD卡是标准卡,本身速度 ...… 查看全部问答> |
|
外部引脚的时钟400M ,2分频生成200M脚本:create_generated_clock -name clk_200 -source clk_400 -divide_by 2为何DC显示:Error:Required argument \'source_objects\' was not found (CMD-007)… 查看全部问答> |
|
1 AMBA AHB字节选通的问题 比如我一个memory是32位宽的。ARM是字节对齐操作,通过地址低两位来选择哪个字节,也就是说我的控制器在接收ARM地址后先要右移两位来确定地址,因为最低两们并不代表实际地址。读的时候可以理解,不管你ARM要哪个字节, ...… 查看全部问答> |
|
用PADS 把器件的封装做好了,想打印出来实物比较下。 只会用CAM一层一层的打印,怎么才可以把焊盘和丝印打印在一起形成一个完整的封装 ...… 查看全部问答> |




