历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

Gespac Inc公司的发展小趣事

对于快速充电IC(bq2002)电路,网友可能还会有多种问题,以下是一些常见问题及其回答:

一、电路设计相关问题

  1. BQ2002的BAT引脚如何正确接入电池电压?
    • 回答:BQ2002的BAT引脚用于接收电池电压的取样信号。通常,电池电压会经过一个电阻分压网络后接入BAT引脚,以确保BQ2002能够正确检测电池电压。电阻分压网络的输入电阻不应小于200kΩ,以避免对电池电压造成过大影响。
  2. 如何设置BQ2002的充电速率?
    • 回答:BQ2002的充电速率可以通过TM引脚进行设置。当TM引脚接地时,充电速率为1C(即电池容量的1倍)。此外,根据数据手册,TM引脚的不同电平还可能对应不同的充电速率,如C/2或2C,但具体设置需参考具体的数据手册或应用指南。
  3. BQ2002的CC引脚如何控制充电电流?
    • 回答:BQ2002的CC引脚用于控制充电电流的开关,而不是直接调节充电电流的大小。CC引脚有两种状态:高阻态和接地态。当CC引脚为高阻态时,充电电流可以流动;当CC引脚接地时,充电电流被抑制。充电电流的大小通常由外部恒流源(如LM317等)的电阻设置决定,与CC引脚的状态无关。

二、功能实现与调试问题

  1. 为什么BQ2002没有进入快速充电模式?
    • 回答:BQ2002没有进入快速充电模式可能由多种原因造成,如电池电压或温度不符合快速充电条件、TS引脚电压不在正常范围内、或外部电路设计问题等。建议检查电池电压和温度是否满足快速充电条件,同时检查TS引脚电压是否介于0.25VCC和0.4VCC之间(或1.25V和2.0V之间),并确认外部电路设计无误。
  2. BQ2002在充电过程中突然停止充电怎么办?
    • 回答:BQ2002在充电过程中突然停止充电可能是由于电池过热、电池电压过高或外部电路故障等原因造成的。建议检查电池温度是否过高,电池电压是否超出BQ2002的承受范围,并检查外部电路是否有短路或断路等故障。如果问题依旧存在,可能需要更换BQ2002芯片或重新设计外部电路。
  3. 如何调整BQ2002的充电截止电压?
    • 回答:BQ2002的充电截止电压通常是通过外部电路设计来调整的。具体方法可能因电路设计而异,但一般可以通过调整与BAT引脚相连的分压电阻的阻值来改变BQ2002检测到的电池电压值,从而调整充电截止电压。需要注意的是,在调整充电截止电压时,应确保电池不会因过充而损坏。

三、其他常见问题

  1. BQ2002支持哪些类型的电池?
    • 回答:BQ2002通常支持多种类型的可充电电池,如镍氢电池、锂离子电池等。但具体支持的电池类型可能因BQ2002的版本或制造商而有所不同。因此,在使用BQ2002进行电池充电时,应参考具体的数据手册或应用指南以了解支持的电池类型。
  2. BQ2002的功耗如何?
    • 回答:BQ2002的功耗通常较低,但具体功耗值可能因工作条件(如输入电压、输出电流、环境温度等)的不同而有所变化。在设计电路时,应充分考虑BQ2002的功耗对系统整体性能的影响,并采取相应的措施来降低功耗。

以上是针对快速充电IC(bq2002)电路的一些常见问题及其回答。需要注意的是,由于BQ2002的具体应用可能因电路设计、电池类型等因素而有所不同,因此在实际应用中应参考具体的数据手册或应用指南以获取准确的信息。

Cristek Interconnects Inc公司的发展小趣事

随着市场竞争的加剧,Cristek Interconnects Inc公司意识到质量管理的重要性。于是,公司投入大量资源,建立了一套完善的质量管理体系,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把关。这种严谨的质量管理态度,使得Cristek的产品在行业中享有良好的声誉,赢得了客户的信赖。

AEM [ American Electronic Materials]公司的发展小趣事

在追求经济效益的同时,AEM始终关注环境保护和可持续发展。公司积极响应全球环保倡议,采用环保材料和生产工艺,减少生产过程中的废弃物排放和能源消耗。同时,AEM还投入大量资源研发节能环保的电子元器件产品,为客户提供更加绿色、高效的解决方案。

此外,AEM还积极参与社会公益活动,关注社会责任。公司通过捐款、赞助等方式支持教育、文化等事业的发展,为社会的和谐与进步贡献了自己的力量。

Chemi-Con公司的发展小趣事

品质是Chemi-Con公司的生命线。公司始终坚持严格的质量管理体系,从原材料采购到生产制造,再到产品出厂,每一个环节都经过严格的把控。这种对品质的执着追求,使得Chemi-Con的产品在市场上获得了良好的口碑。同时,公司还积极拓展市场,与全球多家知名企业建立了稳定的合作关系,产品远销海外市场。

AMRI Enterprise Co Ltd公司的发展小趣事

面对国内市场的饱和竞争,AMRI Enterprise Co Ltd积极实施国际化战略,拓展海外市场。公司通过参加国际电子展会、建立海外销售渠道等方式,不断提升品牌知名度和产品影响力。同时,AMRI还针对不同国家和地区的市场需求,调整产品策略,提供定制化的解决方案。这一战略的实施,使得AMRI的产品成功打入多个国际市场,实现了业务的快速增长。

Bombardier Inc公司的发展小趣事

除了航空领域,庞巴迪公司在铁路运输方面也取得了重要进展。其生产的CITYFLO系列自动列车控制系统在全球范围内得到了广泛应用。该系统采用了先进的电子技术和算法,实现了列车的自动驾驶和精确控制,大大提高了铁路运输的安全性和效率。此外,庞巴迪还生产了各种铁路车辆和相关电子设备,为全球铁路运输业的发展做出了重要贡献。

以上五个故事展示了庞巴迪公司在电子行业发展中的关键历程和成就。从水上飞机到现代商用喷气客机,从航空电子系统到铁路运输控制系统,庞巴迪凭借其卓越的技术实力和创新能力,在电子行业中树立了杰出的品牌形象。

问答坊 | AI 解惑

12864液晶资料(非常详细)

希望对大家有帮助,欢迎一起学习讨论…

查看全部问答>

富士康 第十 大家如何看待

今天早晨看新闻有富士康的第十跳,觉得万般无奈,社会怎么了?人格怎么了?是变化太快还是无奈····…

查看全部问答>

求助各位大侠:谁有或知道有单片机控制的TT50通信模块的C语言初始化程序和收发信息程序

  求助各位TT50通信模块的初始化程序和短信收发的C语言程序,由单片机控制TT50,TT50的初始化程序,在接到单片机的控制指令时怎么发送消息?谢谢各位大侠!!!!…

查看全部问答>

蓝牙驱动选择问题

各位,目前我们的项目需要在一个WinCE板子上使用蓝牙功能,要求支持A2DP,DUN,SPP等功能。 目前就我所了解的主要提供蓝牙驱动的有widcomm,bluesoleil和windows自带的。 网上搜了一些文章,基本上说wincomm最稳定,想请教一下大家,windows自带的 ...…

查看全部问答>

linux下SD卡读写速度请教

目前正在调SD卡(2.0的协议)驱动,它的读写速度特别慢,写200KB/s左右,读大概是写的2-3倍.目前用的通信模式是SD模式,传输方式为DMA传输,时钟频率调高来试过了,可是速度还是一个样慢.我测试用的SD卡是标准卡,本身速度 ...…

查看全部问答>

关于DC脚本中时钟分频的处理

外部引脚的时钟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)…

查看全部问答>

AMBA AXI及WISHBONE的一些问题

1 AMBA AHB字节选通的问题 比如我一个memory是32位宽的。ARM是字节对齐操作,通过地址低两位来选择哪个字节,也就是说我的控制器在接收ARM地址后先要右移两位来确定地址,因为最低两们并不代表实际地址。读的时候可以理解,不管你ARM要哪个字节, ...…

查看全部问答>

PADS2004怎么将完整的PCB封装打印出来?

           用PADS 把器件的封装做好了,想打印出来实物比较下。         只会用CAM一层一层的打印,怎么才可以把焊盘和丝印打印在一起形成一个完整的封装 ...…

查看全部问答>