string_fuc.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. /** ******************************************************************************
  2. * @file String.c
  3. * @author 度云未来 DOIOT
  4. * @brief 针对公司模块AT指令的处理库
  5. ******************************************************************************
  6. * @attention
  7. * <h2><center>&copy; Copyright (c) 2019 成都度云未来
  8. * All rights reserved.</center></h2>
  9. * 注意:本程序针对cubemx 生成的hal库程序快速开发
  10. * 环境:keil5.0
  11. * STM32Cube FW_F1 V1.8.0
  12. * 文件版本:1.3 更新时间2020/10/15 降低了关联文件之间的耦合度
  13. ********************************************************************************/
  14. #include "includes.h"
  15. #include "string_fuc.h"
  16. #include "stdarg.h"
  17. #include "string.h"
  18. #include "stdio.h"
  19. #include "stdlib.h"
  20. //#include "AT_Module.h" /*AT指令相关的头文件*/
  21. /*--------------------------------裁剪功能[针对低容量设计,使能后会自动生成一个全局实例]----------------------------------------------*/
  22. #define config_String_process 1
  23. #define config_Array_process 1
  24. /*--------------------------------[string字符串类的处理函数]----------------------------------------------
  25. 尽管 char str[],uint8_t arry[]本质是一样的,但是本文件根据理解不同,来分成string字符串和arry数组
  26. 如果 使用的是其字符串成分,就使用srr函数,如果使用其数据成分,就使用arry函数。
  27. char str[]="32323232" ---> uint8_t arry={0x32,0x32,0x32,0x32};
  28. 【string 数据按16进制理解,两两转化成 8位数组 arry】
  29. str_2_hex_arry;
  30. char str[]="32323232" ---> uint8_t arry={32,32,32,32};
  31. 【string 数据按10进制理解,两两转化成 8位数组 arry】
  32. str_2_dec_arry;
  33. char "3" char "2" ---> uint8_t i=0x32;
  34. 【两个字符按十六进制理解组合成一个8位的十六进制变量】
  35. char_2_hex
  36. char "3" char "2" ---> uint8_t i=32;
  37. 【两个字符按十进制理解,组合成一个8位的十进制变量】
  38. char_2_dec
  39. char str[]="stm32f103" ---> char str[]="73746D33326631"
  40. 【string 数据按ascii理解,单个单个的转化成十六进制表示的string】
  41. AsciiStr_2_HexStr;
  42. *----------------------------------[arry字符串类的处理函数]----------------------------------------------*/
  43. /*
  44. Arry
  45. uint8_t arry={0x32,0x32,0x,32,0x32}; "32323232"
  46. 【8位数组每八位一组的转化成16进制表示的string】
  47. arry_2_hexstr;
  48. ---------------------------------------------------------------------------------*/
  49. /*string类的句柄*/
  50. #if(config_String_process)
  51. STR Str;
  52. #endif
  53. #if(config_Array_process)
  54. Array array;
  55. #endif
  56. #if(config_String_process)
  57. /**@brief AsciiStr_2_HexStr : string 按ascii理解,单个单个的转变成 hex 字符串
  58. * @param ascii_str : 字符串或数组,是数组的情况下需要保证有结束位
  59. * @param hex_str : 生成的新字符串
  60. * 例子: "stm32f103" "73746D33326631"
  61. */
  62. uint8_t AsciiStr_2_HexStr(char *ascii_str,char hex_str[])
  63. {
  64. uint16_t i;
  65. char hex[3]={0};
  66. memset(hex,0,3);
  67. for(i=0;i<strlen(ascii_str);i++)
  68. {
  69. sprintf(hex,"%02x",ascii_str[i]);
  70. strcat(hex_str,hex);
  71. }
  72. return 1;
  73. }
  74. /**@brief str_2_dec_arry:【string 数据按10进制理解,两两转化成 8位数组 arry】
  75. * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串
  76. * return 会返回长度
  77. * 例子: char s[]="32323232" ---> uint8_t arry={32,32,32,32};
  78. */
  79. uint16_t str_2_dec_arry(char ascii_str[],uint8_t dex_arry[])
  80. {
  81. uint16_t len=strlen(ascii_str)*2;
  82. char hex_str[len+2];
  83. char hex[3]={0};
  84. uint16_t i;
  85. uint16_t n;
  86. memset(hex_str,0,len);
  87. memset(hex,0,3);
  88. for(i=0;i<len/2;i++)
  89. {
  90. hex[0]=ascii_str[i*2];
  91. hex[1]=ascii_str[i*2+1];
  92. n=atoi(hex);
  93. dex_arry[i]=n;
  94. }
  95. return i+1;
  96. }
  97. /**@brief str_2_hex_arry:【string 数据按10进制理解,两两转化成 8位数组 arry】
  98. * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串
  99. * return 会返回长度
  100. * 例子: char s[]="32323232" ---> uint8_t arry={0x32,0x32,0x32,0x32};
  101. */
  102. uint16_t str_2_hex_arry(char ascii_str[],uint8_t hex_arry[])
  103. {
  104. uint16_t len=strlen(ascii_str)*2;
  105. char hex[3]={0};
  106. char hex_str[len+2];
  107. uint16_t i;
  108. uint16_t n;
  109. memset(hex_str,0,len);
  110. memset(hex,0,3);
  111. for(i=0;i<len/2;i++)
  112. {
  113. hex[0]=ascii_str[i*2];
  114. hex[1]=ascii_str[i*2+1];
  115. n=strtol(hex, NULL, 16);
  116. hex_arry[i]=n;
  117. }
  118. return i+1;
  119. }
  120. /**@brief char_2_hex:两个字符按16进制理解转换成一个十六进制,return返回
  121. * 例子: char c1='1' char c2='1' uint8_t a=11;
  122. */
  123. uint8_t char_2_hex(char c1,char c2)
  124. {
  125. char hex[3]={0};
  126. uint16_t i;
  127. hex[0]=c1;
  128. hex[1]=c2;
  129. i = strtol(hex, NULL, 16);
  130. return i;
  131. }
  132. /**@brief char_2_dec两个字符按10进制理解转换成一个十进制,return返回
  133. * 例子: char c1='1' char c2='1' uint8_t a=0x11;
  134. */
  135. uint8_t char_2_dec(char c1,char c2)
  136. {
  137. char hex[3]={0};
  138. hex[0]=c1;
  139. hex[1]=c2;
  140. return atoi(hex);
  141. }
  142. /**@brief R_CUT:右靠裁剪len长至buff,str为原数据,之所以选择加一个buff是为了保护原数据
  143. */
  144. uint8_t R_CUT(char *str,char buff[],uint8_t len)
  145. {
  146. uint16_t length=strlen(str);
  147. if(length>=len)
  148. {
  149. strncpy(buff,str+(length-len),len);
  150. return 1;
  151. }
  152. return 0;
  153. }
  154. /**@brief L_CUT:左靠裁剪len长至buff,str为原数据,之所以选择加一个buff是为了保护原数据
  155. */
  156. uint8_t L_CUT(char *str,char buff[],uint8_t len)
  157. {
  158. uint16_t length=strlen(str);
  159. if(length>=len)
  160. {
  161. strncpy(buff,str,len);
  162. return 1;
  163. }
  164. return 0;
  165. }
  166. /**@brief AsciiStr_convert_HexStr:ascii字符数组转hex字符数组
  167. * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串
  168. * 例子: "stm32f103" "73746D33326631"
  169. */
  170. uint8_t AsciiStr_convert_HexStr(uint8_t ascii_str[])
  171. {
  172. uint16_t len=strlen((char*)ascii_str);
  173. char hex_str[len*2+2];
  174. memset(hex_str,'\0',len*2+2);
  175. char hex[3]={0};
  176. uint16_t i;
  177. for(i=0;i<len;i++)
  178. {
  179. sprintf(hex,"%02x",ascii_str[i]);
  180. strcat(hex_str,hex);
  181. }
  182. strcpy((char*)ascii_str,hex_str);
  183. return 1;
  184. }
  185. /**@brief AsciiStr_convert_HexStr:ascii字符数组转hex字符数组
  186. * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串
  187. * 例子: "73746D33326631" "stm32f103"
  188. */
  189. uint8_t HexStr_convert_AsciiStr(uint8_t ascii_str[])
  190. {
  191. uint16_t len=strlen((char*)ascii_str);
  192. char hex_str[len/2+2];
  193. memset(hex_str,'\0',len/2+2);
  194. char hex[3]={0};
  195. char ascii[2]={0};
  196. uint16_t i;
  197. int vlue=0;
  198. for(i=0;i<len;i+=2)
  199. {
  200. hex[0]=ascii_str[i];
  201. hex[1]=ascii_str[i+1];
  202. vlue= strtol(hex, NULL, 16);
  203. sprintf(ascii,"%c",vlue);
  204. strcat(hex_str,ascii);
  205. }
  206. strcpy((char*)ascii_str,hex_str);
  207. return 1;
  208. }
  209. /**@brief str_2_dec_arry:【string 数据按10进制理解,两两转化成 8位数组 arry】
  210. * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串
  211. * return 会返回长度
  212. * 例子: char s[]="32323232" ---> uint8_t arry={32,32,32,32};
  213. */
  214. uint16_t str_convert_dec_arry(uint8_t ascii_str[])
  215. {
  216. uint8_t fifo[500];
  217. uint16_t len=strlen((char*)ascii_str)*2;
  218. char hex_str[len+2];
  219. memset(hex_str,0,len);
  220. char hex[3]={0};
  221. memset(hex,0,3);
  222. uint16_t i;
  223. uint16_t n;
  224. for(i=0;i<len/2;i++)
  225. {
  226. hex[0]=ascii_str[i*2];
  227. hex[1]=ascii_str[i*2+1];
  228. n=atoi(hex);
  229. fifo[i]=n;
  230. }
  231. memcpy(ascii_str,fifo,i);
  232. return i+1;
  233. }
  234. /**@brief str_2_hex_arry:【string 数据按10进制理解,两两转化成 8位数组 arry】
  235. * @param ascii_str : 字符串或数组,导入后自身会被转化成hex的字符串
  236. * return 会返回长度
  237. * 例子: char s[]="32323232" ---> uint8_t arry={0x32,0x32,0x32,0x32};
  238. */
  239. uint16_t str_convert_hex_arry(uint8_t ascii_str[])
  240. {
  241. uint8_t fifo[500];
  242. uint16_t len=strlen((char*)ascii_str)*2;
  243. char hex_str[len+2];
  244. memset(hex_str,0,len);
  245. char hex[3]={0};
  246. memset(hex,0,3);
  247. uint16_t i;
  248. uint16_t n;
  249. for(i=0;i<len/2;i++)
  250. {
  251. hex[0]=ascii_str[i*2];
  252. hex[1]=ascii_str[i*2+1];
  253. n=strtol(hex, NULL, 16);
  254. fifo[i]=n;
  255. }
  256. memcpy(ascii_str,fifo,i);
  257. return i+1;
  258. }
  259. /**@brief R_CUT:右靠裁剪len长至buff,直接改变原数据
  260. */
  261. uint8_t Convert_R_CUT(char *str,uint8_t len)
  262. {
  263. uint16_t length=strlen(str);
  264. char buff[length];
  265. if(length>=len)
  266. {
  267. strncpy(buff,str+(length-len),len);
  268. memset(str,0,length);
  269. strcpy(str,buff);
  270. return 1;
  271. }
  272. return 0;
  273. }
  274. /**@brief L_CUT:左靠裁剪len长至buff,直接改变原数据
  275. */
  276. uint8_t Convert_L_CUT(char *str,uint8_t len)
  277. {
  278. uint16_t length=strlen(str);
  279. char buff[length];
  280. if(length>=len)
  281. {
  282. strncpy(buff,str,len);
  283. strcpy(str,buff);
  284. return 1;
  285. }
  286. return 0;
  287. }
  288. /**@brief Shift_left:字符串左移,相当于裁剪左边的几位
  289. */
  290. uint8_t Shift_left(char *str,uint8_t len)
  291. {
  292. int lengtth=strlen(str);
  293. int i=0;
  294. for(i=0;i<(lengtth);i++)
  295. {
  296. *(str+i)=*(str+len+i);
  297. if(i>=(lengtth-len))*(str+i)=0;
  298. }
  299. return 1;
  300. }
  301. #endif
  302. /*----------------------------------------------------------------------------------*/
  303. #if(config_Array_process)
  304. /**@brief Arry_2_hexstr : 8位数组按数据理解转换成16进制表示的字符串
  305. * @param arry : 输入数组
  306. * @param hex_str : 生成的字符串
  307. [注:导出数组外部需清0]
  308. * 例子: uint8_t arry={0x32,0x32,0x32,0x32}; ---> "32323232"
  309. */
  310. uint8_t Arry_2_hexstr(uint8_t arry[],char hex_str[],uint16_t len)
  311. {
  312. uint16_t i;
  313. char hex[3]={0};
  314. memset(hex_str,0,len*2);
  315. for(i=0;i<len;i++)
  316. {
  317. sprintf(hex,"%02x",arry[i]);
  318. strcat(hex_str,hex);
  319. }
  320. return 1;
  321. }
  322. /**@brief Arry_2_decstr : 8位数组按数据理解转换成16进制表示的字符串
  323. * @param arry : 输入数组
  324. * @param hex_str : 生成的字符串
  325. * 例子: uint8_t arry={0x32,0x32,0x32,0x32}; ---> "32323232"
  326. */
  327. uint8_t Arry_2_decstr(uint8_t arry[],char dec_str[],uint16_t len)
  328. {
  329. uint16_t i;
  330. char hex[3]={0};
  331. for(i=0;i<len;i++)
  332. {
  333. sprintf(hex,"%02d",arry[i]);
  334. strcat(dec_str,hex);
  335. }
  336. return 1;
  337. }
  338. /**@brief Arry_2_decstr : 8位数组按数据理解转换成16进制表示的字符串
  339. * @param arry : 输入数组
  340. * @param hex_str : 生成的字符串
  341. * 例子: uint8_t arry={0x32,0x32,0x32,0x32}; ---> "2222"
  342. */
  343. uint8_t Arry_2_AsciiStr(uint8_t arry[],char dec_str[],uint16_t len)
  344. {
  345. uint16_t i;
  346. char hex[3]={0};
  347. for(i=0;i<len;i++)
  348. {
  349. sprintf(hex,"%c",arry[i]);
  350. strcat(dec_str,hex);
  351. }
  352. return 1;
  353. }
  354. /**@brief R_CUT:右靠裁剪len长至buff,str为原数据,之所以选择加一个buff是为了保护原数据
  355. */
  356. uint8_t Arry_R_CUT(uint8_t arry[],uint8_t arry_len,uint8_t cut_len)
  357. {
  358. uint8_t buff[512]={0};
  359. if(arry_len>=cut_len)
  360. {
  361. uint16_t i;
  362. for(i=cut_len;i<arry_len;i++)
  363. {
  364. buff[i]=arry[i];
  365. }
  366. memcpy(arry,buff,arry_len);
  367. return 1;
  368. }
  369. return 0;
  370. }
  371. /**@brief L_CUT:左靠裁剪len长至buff,str为原数据,之所以选择加一个buff是为了保护原数据
  372. */
  373. uint8_t Arry_L_CUT(uint8_t arry[],uint8_t arry_len,uint8_t len)
  374. {
  375. if(arry_len>=len)
  376. {
  377. uint16_t i;
  378. for(i=len;i<arry_len;i++)
  379. {
  380. arry[i]=0;
  381. }
  382. return 1;
  383. }
  384. return 0;
  385. }
  386. #endif
  387. #if(config_String_process)
  388. void STR_init(STR * st)
  389. {
  390. st->to.Hex_str=AsciiStr_2_HexStr;
  391. st->to.dec_arry=str_2_dec_arry;
  392. st->to.hex_arry=str_2_hex_arry;
  393. st->to.char_2_dec=char_2_dec;
  394. st->to.char_2_hex=char_2_hex;
  395. st->to.L_CUT=L_CUT;
  396. st->to.R_CUT=R_CUT;
  397. st->convert.Hex_Str=AsciiStr_convert_HexStr;
  398. st->convert.Ascii_Str= HexStr_convert_AsciiStr;
  399. st->convert.dec_arry=str_convert_dec_arry;
  400. st->convert.hex_arry=str_convert_hex_arry;
  401. st->convert.L_CUT=Convert_R_CUT;
  402. st->convert.R_CUT=Convert_R_CUT;
  403. st->convert.L_Shift=Shift_left;
  404. }
  405. #endif
  406. #if(config_Array_process)
  407. void Array_init(Array *ar)
  408. {
  409. ar->hexStr=Arry_2_hexstr;
  410. ar->decStr=Arry_2_decstr;
  411. ar->R_CUT=Arry_R_CUT;
  412. ar->L_CUT=Arry_L_CUT;
  413. ar->asciiStr=Arry_2_AsciiStr;
  414. }
  415. #endif