/** ****************************************************************************** * @file String.c * @author 度云未来 DOIOT * @brief 针对公司模块AT指令的处理库 ****************************************************************************** * @attention *

© Copyright (c) 2019 成都度云未来 * All rights reserved.

* 注意:本程序针对cubemx 生成的hal库程序快速开发 * 环境:keil5.0 * STM32Cube FW_F1 V1.8.0 * 文件版本:1.3 更新时间2020/10/15 降低了关联文件之间的耦合度 ********************************************************************************/ #include "includes.h" #include "string_fuc.h" #include "stdarg.h" #include "string.h" #include "stdio.h" #include "stdlib.h" //#include "AT_Module.h" /*AT指令相关的头文件*/ /*--------------------------------裁剪功能[针对低容量设计,使能后会自动生成一个全局实例]----------------------------------------------*/ #define config_String_process 1 #define config_Array_process 1 /*--------------------------------[string字符串类的处理函数]---------------------------------------------- 尽管 char str[],uint8_t arry[]本质是一样的,但是本文件根据理解不同,来分成string字符串和arry数组 如果 使用的是其字符串成分,就使用srr函数,如果使用其数据成分,就使用arry函数。 char str[]="32323232" ---> uint8_t arry={0x32,0x32,0x32,0x32}; 【string 数据按16进制理解,两两转化成 8位数组 arry】 str_2_hex_arry; char str[]="32323232" ---> uint8_t arry={32,32,32,32}; 【string 数据按10进制理解,两两转化成 8位数组 arry】 str_2_dec_arry; char "3" char "2" ---> uint8_t i=0x32; 【两个字符按十六进制理解组合成一个8位的十六进制变量】 char_2_hex char "3" char "2" ---> uint8_t i=32; 【两个字符按十进制理解,组合成一个8位的十进制变量】 char_2_dec char str[]="stm32f103" ---> char str[]="73746D33326631" 【string 数据按ascii理解,单个单个的转化成十六进制表示的string】 AsciiStr_2_HexStr; *----------------------------------[arry字符串类的处理函数]----------------------------------------------*/ /* Arry uint8_t arry={0x32,0x32,0x,32,0x32}; "32323232" 【8位数组每八位一组的转化成16进制表示的string】 arry_2_hexstr; ---------------------------------------------------------------------------------*/ /*string类的句柄*/ #if(config_String_process) STR Str; #endif #if(config_Array_process) Array array; #endif #if(config_String_process) /**@brief AsciiStr_2_HexStr : string 按ascii理解,单个单个的转变成 hex 字符串 * @param ascii_str : 字符串或数组,是数组的情况下需要保证有结束位 * @param hex_str : 生成的新字符串 * 例子: "stm32f103" "73746D33326631" */ uint8_t AsciiStr_2_HexStr(char *ascii_str,char hex_str[]) { uint16_t i; char hex[3]={0}; memset(hex,0,3); for(i=0;i uint8_t arry={32,32,32,32}; */ uint16_t str_2_dec_arry(char ascii_str[],uint8_t dex_arry[]) { uint16_t len=strlen(ascii_str)*2; char hex_str[len+2]; char hex[3]={0}; uint16_t i; uint16_t n; memset(hex_str,0,len); memset(hex,0,3); for(i=0;i uint8_t arry={0x32,0x32,0x32,0x32}; */ uint16_t str_2_hex_arry(char ascii_str[],uint8_t hex_arry[]) { uint16_t len=strlen(ascii_str)*2; char hex[3]={0}; char hex_str[len+2]; uint16_t i; uint16_t n; memset(hex_str,0,len); memset(hex,0,3); for(i=0;i=len) { strncpy(buff,str+(length-len),len); return 1; } return 0; } /**@brief L_CUT:左靠裁剪len长至buff,str为原数据,之所以选择加一个buff是为了保护原数据 */ uint8_t L_CUT(char *str,char buff[],uint8_t len) { uint16_t length=strlen(str); if(length>=len) { strncpy(buff,str,len); return 1; } return 0; } /**@brief AsciiStr_convert_HexStr:ascii字符数组转hex字符数组 * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串 * 例子: "stm32f103" "73746D33326631" */ uint8_t AsciiStr_convert_HexStr(uint8_t ascii_str[]) { uint16_t len=strlen((char*)ascii_str); char hex_str[len*2+2]; memset(hex_str,'\0',len*2+2); char hex[3]={0}; uint16_t i; for(i=0;i uint8_t arry={32,32,32,32}; */ uint16_t str_convert_dec_arry(uint8_t ascii_str[]) { uint8_t fifo[500]; uint16_t len=strlen((char*)ascii_str)*2; char hex_str[len+2]; memset(hex_str,0,len); char hex[3]={0}; memset(hex,0,3); uint16_t i; uint16_t n; for(i=0;i uint8_t arry={0x32,0x32,0x32,0x32}; */ uint16_t str_convert_hex_arry(uint8_t ascii_str[]) { uint8_t fifo[500]; uint16_t len=strlen((char*)ascii_str)*2; char hex_str[len+2]; memset(hex_str,0,len); char hex[3]={0}; memset(hex,0,3); uint16_t i; uint16_t n; for(i=0;i=len) { strncpy(buff,str+(length-len),len); memset(str,0,length); strcpy(str,buff); return 1; } return 0; } /**@brief L_CUT:左靠裁剪len长至buff,直接改变原数据 */ uint8_t Convert_L_CUT(char *str,uint8_t len) { uint16_t length=strlen(str); char buff[length]; if(length>=len) { strncpy(buff,str,len); strcpy(str,buff); return 1; } return 0; } /**@brief Shift_left:字符串左移,相当于裁剪左边的几位 */ uint8_t Shift_left(char *str,uint8_t len) { int lengtth=strlen(str); int i=0; for(i=0;i<(lengtth);i++) { *(str+i)=*(str+len+i); if(i>=(lengtth-len))*(str+i)=0; } return 1; } #endif /*----------------------------------------------------------------------------------*/ #if(config_Array_process) /**@brief Arry_2_hexstr : 8位数组按数据理解转换成16进制表示的字符串 * @param arry : 输入数组 * @param hex_str : 生成的字符串 [注:导出数组外部需清0] * 例子: uint8_t arry={0x32,0x32,0x32,0x32}; ---> "32323232" */ uint8_t Arry_2_hexstr(uint8_t arry[],char hex_str[],uint16_t len) { uint16_t i; char hex[3]={0}; memset(hex_str,0,len*2); for(i=0;i "32323232" */ uint8_t Arry_2_decstr(uint8_t arry[],char dec_str[],uint16_t len) { uint16_t i; char hex[3]={0}; for(i=0;i "2222" */ uint8_t Arry_2_AsciiStr(uint8_t arry[],char dec_str[],uint16_t len) { uint16_t i; char hex[3]={0}; for(i=0;i=cut_len) { uint16_t i; for(i=cut_len;i=len) { uint16_t i; for(i=len;ito.Hex_str=AsciiStr_2_HexStr; st->to.dec_arry=str_2_dec_arry; st->to.hex_arry=str_2_hex_arry; st->to.char_2_dec=char_2_dec; st->to.char_2_hex=char_2_hex; st->to.L_CUT=L_CUT; st->to.R_CUT=R_CUT; st->convert.Hex_Str=AsciiStr_convert_HexStr; st->convert.Ascii_Str= HexStr_convert_AsciiStr; st->convert.dec_arry=str_convert_dec_arry; st->convert.hex_arry=str_convert_hex_arry; st->convert.L_CUT=Convert_R_CUT; st->convert.R_CUT=Convert_R_CUT; st->convert.L_Shift=Shift_left; } #endif #if(config_Array_process) void Array_init(Array *ar) { ar->hexStr=Arry_2_hexstr; ar->decStr=Arry_2_decstr; ar->R_CUT=Arry_R_CUT; ar->L_CUT=Arry_L_CUT; ar->asciiStr=Arry_2_AsciiStr; } #endif