利用串口远程蓝牙调参

利用串口远程蓝牙调参

一、顶层逻辑

上位机通过串口发送特定格式的字符串,下位机将接收到的字符串按照特定格式分解出用于获取每个变量值的字符段,最后将这些字符段转为浮点型变量。

二、发送特定格式的字符串

@:112.32 123.34 123.23

  • “@:” 这两个字符为首校验符

  • 回车符号为尾校验符(输入最后要敲上回车)

  • 初步规定发送3个整数位2个小数位的浮点型变量,如:“123.34”,“005.30”,

    一个变量占用的字符串长度规定为6,要求按上述格式发送,每个变量字符串用空格隔开

三、分解出每个变量对应的字符段

  • 定义接收变量的个数以及解析出变量所占用的字符串长度

    #define VAR_NUM  3 			// 每次接收变量的个数
    #define Var_STR_LEN 6 		// 接收字符串变量的长度(三位整数一个浮点两位小数)
    
    char Var_Str_Rec[VAR_NUM][Var_STR_LEN]; // 存放分配给各变量的字符串(来自蓝牙接收)
    
  • 把解析每个变量的字符段分解出来

    for(i= 0; i< VAR_NUM; i++)
    {
    	substr(Var_Str_Rec[i], UsartRecData, i*(Var_STR_LEN+1), Var_STR_LEN);	// UsartRecData是串口一次接收到的字符串的首地址
    }
    
    
    // 从第start位开始提取src里len个字符到dst里面
    int substr(char dst[],char src[],int start,int len)
    {
    	char* p = src + start;   //定义指针变量指向需要提取的字符的地址
    	int n = strlen(p);       //求字符串长度
    	int i = 0;
    	if(n < len)
    	{
    		len = n;
    	}
    	while(len != 0)
    	{
    		dst[i] = src[i+start];
    		len --;
    		i++;
    	}                        //复制字符串到dst中
    	dst[i] = '\0';
    	return 0;
    }
    

四、将所有解析出来的字符段转化为浮点型数据交给变量

void Var_Update(void)
{
	DataBlueRec.kp = (float)atof(Var_Str_Rec[0]);
	DataBlueRec.ki = (float)atof(Var_Str_Rec[1]);
	DataBlueRec.kd = (float)atof(Var_Str_Rec[2]);
}

五、全代码

#define VAR_NUM  3 			// 每次接收变量的个数
#define Var_STR_LEN 6 		// 接收字符串变量的长度(三位整数两位小数)

typedef struct DATASTRUCT3	// 用来获取蓝牙接收的变量
{
	float kp;
	float ki;
	float kd;
}DataStruct3;

DataStruct3 DataBlueRec;				// 用来分离出蓝牙获取的字符串给变量
char Var_Str_Rec[VAR_NUM][Var_STR_LEN]; // 存放分配给各变量的字符串(来自蓝牙接收)

void UART_GetEveryVar(void);
int substr(char dst[],char src[],int start,int len);
void Var_Update(void);

/* 主函数 */
void UART_GetEveryVar()
{
	int i = 0;
	if(UsartRecData[0] != '\0')	// UsartRecData是蓝牙一次接收到的字符串的首地址
	{
		/*在这里以字符形式取出所有接收变量*/
		for(i= 0; i< VAR_NUM; i++)
		{
			substr(Var_Str_Rec[i], UsartRecData, i*(Var_STR_LEN+1), Var_STR_LEN);
		}
		
		substr(Var_Str_Rec[1], UsartRecData, 7, 6);
		substr(Var_Str_Rec[2], UsartRecData, 14, 6);
		Var_Update();	// 接收目的变量的更新
		
		LED0 = !LED0;
		delay_ms(10);
		LED0 = !LED0;
		memset(UsartRecData, 0, sizeof(UsartRecData)); // 将接收的数据清空
	}
}


// 从第start位开始提取src里len个字符到dst里面
int substr(char dst[],char src[],int start,int len)
{
	char* p = src + start;   //定义指针变量指向需要提取的字符的地址
	int n = strlen(p);       //求字符串长度
	int i = 0;
	if(n < len)
	{
		len = n;
	}
	while(len != 0)
	{
		dst[i] = src[i+start];
		len --;
		i++;
	}                        //复制字符串到dst中
	dst[i] = '\0';
	return 0;
}


// 接收目的变量的更新
void Var_Update(void)
{
	DataBlueRec.kp = (float)atof(Var_Str_Rec[0]);
	DataBlueRec.ki = (float)atof(Var_Str_Rec[1]);
	DataBlueRec.kd = (float)atof(Var_Str_Rec[2]);
}
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值