匿名上位机调PID总结

使用高级收码方式实现PID调试

数据格式:

帧头+功能字+长度+数据+校验
帧头+FUN+LEN+DATA+SUM

  • FUN可以是 0xA1到0xAA,共10个,也就是说最多可以接受十个用户自定义的数据类型。(图一)
  • LEN为DATA的长度(不包括帧头、FUN、LEN、SUM),只是数据的字节长度和。比如该帧数据内容为3个int16型数据,那么LEN等于6
  • SUM是帧头一直到DATA最后一字节的所有字节的和,是内容的和,不是长度的和。uint8格式。(只保留低八位,高位舍去)。
  • 数据可以是uint8、int16、uint16、int32、float这几个常用格式,多字节数据高位在前。
  • 有20个数据存储器,每个存储器的数据可以分别设置为来自10个自定义帧的30个数据。(图二)

上位机格式设置

在这里插入图片描述
一共10个帧,用哪个便使能哪个,然后自定义数据类型。

在这里插入图片描述下面的数据容器设置中,数据位置和通道设置为一样。上面是通道几,下面的数据位置就设为多少。
在这里插入图片描述
根据自己定义的数据包的大小,其实就是数组的长度,最多可以发送20个数据。

#include “ANO_TC.c”

#include "ANO_TC.h"
#include "usart.h"
#include "control.h"


u8 send_flag;

u8 data_to_send[50] = {0};



//移植时,用户应根据自身应用的情况,根据使用的通信方式,实现此函数,这里就采用有线连接,发送至串口2了
void ANO_DT_Send_Data(uint8_t *dataToSend , uint8_t length)
{
	HAL_UART_Transmit(&huart1, (u8 *)dataToSend,length,1000);
	 while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET); //等待发送结束

}

//通信协议函数
void ANO_DT_SendtoUSER(uint16_t data1, uint16_t data2, uint16_t data3,uint16_t data4)	
{
  u8 _cnt=0,sum = 0,i;
	data_to_send[_cnt++]=0xAA;
	data_to_send[_cnt++]=0xAA;
	data_to_send[_cnt++]=0xF1; //自定义帧1
	data_to_send[_cnt++]=0;    //这是len位,后面 _cnt-4来赋值

	data_to_send[_cnt++]=BYTE1(data1);
	data_to_send[_cnt++]=BYTE0(data1);//数据部分
		
	data_to_send[_cnt++]=BYTE1(data2);
	data_to_send[_cnt++]=BYTE0(data2);//数据部分
	
	data_to_send[_cnt++]=BYTE1(data3);
	data_to_send[_cnt++]=BYTE0(data3);//数据部分
	
	data_to_send[_cnt++]=BYTE1(data4);
	data_to_send[_cnt++]=BYTE0(data4);//数据部分
	
	data_to_send[3] = _cnt-4;//长度位
	
	for(i=0;i<_cnt;i++)
		sum += data_to_send[i];
	
	data_to_send[_cnt++]=sum;//校验位
	
	ANO_DT_Send_Data(data_to_send, _cnt);
}


//结合定时器,设置各个数据发送标志位,可以定期发送各种数据到上位机。
//Data_Exchange函数处理各种数据发送请求,比如想实现每5ms发送一次传感器数据至上位机,即在此函数内实现
//此函数每1ms调用一次
void ANO_DT_Data_Exchange(void)
{
	static uint8_t cnt 	= 0;
	cnt++;
	if(cnt>=10)//10MS
	{
		cnt = 0;
		send_flag = 1;
	}	
	
		HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
	if(send_flag)
	{
		send_flag = 0;
	 // ANO_DT_SendtoUSER(Servo_pid.x_curr_posi,Servo_pid.y_curr_posi,Servo_pid.x_curr_angle,Servo_pid.y_curr_angle);
	
		ANO_DT_SendtoUSER(Position_y[0],Position_y[1],Position_y[2],Position_y[3]);
	}
}


#include “ANO_TC.h”

#ifndef __ANO_TC_H__
#define __ANO_TC_H__

#include "main.h"


//数据拆分宏定义,在发送大于1字节的数据类型时,比如int16、float等,需要把数据拆分成单独字节进行发送
#define BYTE0(dwTemp)       ( *( (char *)(&dwTemp)	  ) )
#define BYTE1(dwTemp)       ( *( (char *)(&dwTemp) + 1) )
#define BYTE2(dwTemp)       ( *( (char *)(&dwTemp) + 2) )
#define BYTE3(dwTemp)       ( *( (char *)(&dwTemp) + 3) )


void ANO_DT_Send_Data(uint8_t *dataToSend , uint8_t length);
void ANO_DT_SendtoUSER(uint16_t data1, uint16_t data2, uint16_t data3,uint16_t data4);
void ANO_DT_Data_Exchange(void);


#endif


  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32是一种广泛应用于嵌入式系统中的微控制器,它具有强大的计算和控制能力。匿名上位机是一种可以通过串口通信与STM32进行数据交互的工具。在工程项目中,参是一个常见的任务,它涉及到优化系统参数,以实现系统性能的最大化。 作为一个匿名上位机参的例子,我们可以考虑一个温度控制系统。假设我们想要通过STM32控制一个恒温箱的温度,以确保箱内温度始终保持在设定的值附近。下面是一个匿名上位机参的步骤: 1. 连接STM32和上位机:首先,通过串口连接STM32和上位机。确保连接正确并建立通信。 2. 设定初始参数:在上位机中,设置一些初始参数,如设定温度值、控制算法等。将这些参数通过串口发送给STM32。 3. 监测系统状态:STM32通过传感器监测恒温箱的温度,并将温度数据传输给上位机。上位机接收到数据后,可以实时显示在界面上,以便进行实时监测和分析。 4. 整参数:根据实时监测到的温度数据,上位机可以分析系统的性能,并根据需要整参数。上位机可以通过串口将新的参数发送给STM32。 5. 实时反馈:为了实现更精确的控制,上位机可以提供实时反馈。上位机可以计算出控制器的输出,然后将输出数据传输给STM32,以实时整恒温箱的工作状态。 通过以上步骤,上位机可以与STM32进行实时交互,实现对温度控制系统参数的整。上位机不仅可以监测和整参数,还可以提供实时反馈,以确保系统性能的最优化。这样,我们可以通过匿名上位机参,实现更精确的温度控制,提高恒温箱的工作效率和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值