機器人數據協議解析


#include "algorithm.h"


unsigned char xueya_init[6]={0xfd,0,0,0,0,0};

/**********在一個字符串中判斷是否有另外一個字符串******/
/*************/
/*     arr1[]:被查詢的大數組      length1:大數組的長度                    */
/*     arr2[]:要查找的小數組      length1:小數組的長度               		 */
/*     返回值 : -1 表示沒找到																						 */
/*							 其他值表示找到了,放回index															 */
///////////////////////////////////////////////
int find_arr(unsigned char *arr1, int length1,unsigned char *arr2, int length2)
{
	int i = 0, j = 0;
	
	if(length1<length2)
	{
		return -1 ;
	}
	for (j = 0; j < length2; )
	{
		if (arr1[i] == arr2[j])
		{
			j++;
			i++;
			if (i > length1)
				return -1;
		}
		else
		{
			j = 0;
			i++;
		}
	}
	return i - length2;
}

/**********拷貝一個字符串到obj數組中******/
/*************/
/*     source[]:被拷貝的大數組      length1:大數組的長度                  */
/*     arr2[]:要拷貝存放的小數組    length:要拷貝的長度               		 */
/*     返回值 : -1 表示沒找到																						 */
/*							 其他值表示找到了,返回index															 */
///////////////////////////////////////////////
int str_copy(unsigned char *source ,unsigned char *obj , int length)
{
		int i=0 ;
		for(i=0;i<length;i++)
		{
			obj[i]=source[i];
		}
		return 1 ;
}
//
//
//  獲取的數字無效
struct Health_DATA health_data = { 0 }; //定義一個健康數據結構
struct Leida_Distance_DATA leida_distance={0};


// arr1:被解析的字符串   length:被解析的字符串長度                 */
//                         數據獲取和解析函數                       */
//                         生物雷數據獲取                           */
//                         超聲波雷達數據獲取                       */
//返回值:return : -1 表示數據握手失敗                             */
//										 其他,數據接收成功                            */

int data_Read(unsigned char *arr1, int length)
{
	int index = -1;
	unsigned char*arr = arr1;
	unsigned char data_header[2] = { 0x66,0xcc };//起始包頭
	if (length < 3)
	{
		return -1;
	}
	index = find_arr(arr, length, data_header, 2);//找到數組中的包頭
	if (index != -1) 
	{
		printf("握手成功!\r\n");
	}
	else
	{
		printf("握手失敗!\r\n");
		return -1 ;
	}
	arr = arr+index;//數據地址偏移
	
	int package_length = arr[index + 2];
	if (length < 3 + package_length + 1)//數據包不完整,接收的數據出錯
	{
		return -1;
	}
	int package_ID = arr[3];
	if (package_ID == 0x01) //生物雷達數據
	{
		health_data.heartBeat = arr[4];
		health_data.breath = arr[5];
		health_data.temperature = arr[6] * 256 + arr[7] * 0.1;
		health_data.bloodPressure_H = arr[8];
		health_data.bloodPressure_L = arr[9];
		health_data.bloodOxygen = arr[10];
		printf("生物雷達數據更新成功!\r\n");
		printf("%d %d %d %d %d %d \r\n", health_data.heartBeat, health_data.breath, 
		health_data.temperature, health_data.bloodPressure_H, health_data.bloodPressure_L, health_data.bloodOxygen);
	}
	else if(package_ID==0x02) //超聲波數據
	{
		leida_distance.dis_Left =arr[4]*256+arr[5];
		leida_distance.dis_Right=arr[6]*256+arr[7];
		leida_distance.dis_Ahead=arr[8]*256+arr[9];
		leida_distance.dis_Back	=arr[10]*256+arr[11];
		printf("超聲波雷達數據更新成功");
		printf("%d %d %d %d \r\n",leida_distance.dis_Left,leida_distance.dis_Right,leida_distance.dis_Ahead,leida_distance.dis_Back);
	}
	return 1;
}

.h文件

#ifndef __ALGORITHM_H
#define __ALGORITHM_H

#include "stm32f1xx_hal.h"
#include "uart.h"

struct Health_DATA
{
	uint8_t heartBeat ;
	uint8_t breath		;
	uint16_t temperature;
	uint8_t bloodPressure_H;
	uint8_t bloodPressure_L;
	uint8_t bloodOxygen;
};
struct Leida_Distance_DATA
{
	uint16_t dis_Left;
	uint16_t dis_Right;
	uint16_t dis_Ahead;
	uint16_t dis_Back;
};

extern unsigned char xueya_init[6] ;

extern struct Health_DATA health_data ; //定義一個健康數據結構
extern struct Leida_Distance_DATA leida_distance;//定義一個超聲波數據結構


int find_arr(unsigned char *arr1, int length1, unsigned char *arr2, int length2);
int str_copy(unsigned char *source ,unsigned char *obj , int length);
int data_Read(unsigned char *arr1, int length);

#endif



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章