Data_deal.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  1. #include "Data_deal.h"
  2. //note: 2021-2-23 新加入BCDtoHEX相互转的几个函数 ---- Daiyf。
  3. union Tmp
  4. {
  5. float value; //浮点运算联合体
  6. unsigned char array[4];
  7. };
  8. union Tmp1
  9. {
  10. signed short value; //S16运算联合体 -32768-32767
  11. unsigned char array[2];
  12. };
  13. union Tmp2
  14. {
  15. signed long value; //S32运算联合体 -2147483648--2147483647 存放18位AD值 -131072-131071
  16. unsigned char array[4];
  17. };
  18. union Tmp3
  19. {
  20. unsigned long value; //U32运算联合体 存放18位AD值0x00000-0x3FFFF
  21. unsigned char array[4];
  22. };
  23. /*
  24. // C prototype : void StrToHex(BYTE *pbDest, BYTE *pbSrc, int nLen)
  25. // parameter(s): [OUT] pbDest - 输出缓冲区
  26. // [IN] pbSrc - 字符串
  27. // [IN] nLen - 16进制数的字节数(字符串的长度/2)
  28. // return value:
  29. // remarks : 字符串转成16进制数
  30. */
  31. void StrToHex(uint8_t *pbDest, uint8_t *pbSrc, int nLen)
  32. {
  33. char h1,h2;
  34. uint8_t s1,s2;
  35. int i;
  36. for (i=0; i<nLen; i++)
  37. {
  38. h1 = pbSrc[2*i];
  39. h2 = pbSrc[2*i+1];
  40. s1 = toupper(h1) - 0x30;
  41. if (s1 > 9)
  42. s1 -= 7;
  43. s2 = toupper(h2) - 0x30;
  44. if (s2 > 9)
  45. s2 -= 7;
  46. pbDest[i] = s1*16 + s2;
  47. }
  48. }
  49. /*
  50. // C prototype : void HexToStr(BYTE *pbDest, BYTE *pbSrc, int nLen)
  51. // parameter(s): [OUT] pbDest - 存放在目标字符串中
  52. // [IN] pbSrc - 输入16进制的起始地址
  53. // [IN] nLen - 16进制的字节数
  54. // return value:
  55. // remarks : 16进制转换成字符串
  56. */
  57. void HexToStr(uint8_t *pbDest, uint8_t *pbSrc, int nLen)
  58. {
  59. char ddl,ddh;
  60. int i;
  61. for (i=0; i<nLen; i++)
  62. {
  63. ddh = 48 + pbSrc[i] / 16;
  64. ddl = 48 + pbSrc[i] % 16;
  65. if (ddh > 57) ddh = ddh + 7;
  66. if (ddl > 57) ddl = ddl + 7;
  67. pbDest[i*2] = ddh;
  68. pbDest[i*2+1] = ddl;
  69. }
  70. pbDest[nLen*2] = '\0';
  71. }
  72. /*******************************************************************************
  73. * Function Name : Switch_U32_To_AD7691BYTE4
  74. * Description : 将32位无符号整数转成4字节数组存储
  75. * Input : temp_U32_data--要转换的U32变量 data--转换后的4字节存储
  76. * Output : None
  77. * Return : None
  78. *******************************************************************************/
  79. void Switch_U32_To_BYTE4(unsigned long temp_U32_data, unsigned char*data)
  80. {
  81. union Tmp3 U32Tmp;
  82. unsigned char i = 0;
  83. U32Tmp.value = temp_U32_data;
  84. for(i = 0; i < 4; i++)
  85. {
  86. data[i] = U32Tmp.array[i]; //将U32转换成四字节
  87. }
  88. }
  89. /*******************************************************************************
  90. * Function Name : Switch_BYTE4_To_U32
  91. * Description : 将U32的4字节数组转成32位无符号整数
  92. * Input : data--转换前四字节数组 temp_U32_data--要转换的U32变量
  93. * Output : None
  94. * Return : None
  95. *******************************************************************************/
  96. unsigned long Switch_BYTE4_To_U32(unsigned char*data)
  97. {
  98. union Tmp3 U32Tmp;
  99. unsigned char i = 0;
  100. unsigned long temp_U32_data = 0;
  101. for(i = 0; i < 4; i++)
  102. {
  103. U32Tmp.array[i] = *(data + i); //4字节数据暂存
  104. }
  105. temp_U32_data = U32Tmp.value; //4字节转换的U32有符号整数
  106. return(temp_U32_data);
  107. }
  108. /*******************************************************************************
  109. * Function Name : Switch_S32_to_ASCII
  110. * Description : 将32位有符号整数转成ASCII字符串显示
  111. * Input : S32
  112. * Output : ASCII字符串
  113. * Return : None
  114. *******************************************************************************/
  115. void Switch_S32_to_ASCII(signed long data, unsigned char*str)
  116. {
  117. unsigned short i; //u16
  118. signed long temp, tempoten; //s32
  119. unsigned char temp_length, temp_str[12] = {0};
  120. if(data < 0)
  121. {
  122. str[0] = '-'; //1.确定符号位
  123. data = -data;
  124. }
  125. else str[0] = '+';
  126. temp = data;
  127. i = 0;
  128. tempoten = temp / 10;
  129. while(tempoten != 0) //由低到高存储ASCII码
  130. {
  131. temp_str[i] = temp - 10 * tempoten + 48; //to ascii code
  132. temp = tempoten;
  133. tempoten = temp / 10;
  134. i++;
  135. }
  136. temp_str[i] = temp + 48;
  137. temp_length = i + 1;
  138. for(i = 0; i < temp_length; i++)
  139. {
  140. str[i + 1] = temp_str[temp_length - 1 - i]; //由高到低存储ASCII码
  141. }
  142. }
  143. /*******************************************************************************
  144. * Function Name : S32_to_u8
  145. * Description : 将32位数转换成8位数组
  146. * Input : data--要转变量 str--转换后的字节数组
  147. * Output : None
  148. * Return : None
  149. *******************************************************************************/
  150. void S32_to_u8(signed long data,unsigned char*str)
  151. {
  152. // int i;
  153. str[0] = data>>24;
  154. str[1] = data>>16;
  155. str[2] = data>>8;
  156. str[3] = data;
  157. // for(i=3;i>0;i--)
  158. // {
  159. // str[i]=(data>>(i*8))& 0xFF;
  160. // }
  161. }
  162. /*******************************************************************************
  163. * Function Name : Switch_Float_To_ASCII 注:小数点有效数字3位
  164. * Description : 将浮点数转成ASCII字符串
  165. * Input : temp_float_data--要转换的float变量 str--转换后的字节数组
  166. * Output : None
  167. * Return : None
  168. *******************************************************************************/
  169. void Switch_Float_To_ASCII(float temp_float_data, unsigned char*str)
  170. {
  171. unsigned short i, j, k;
  172. signed long temp, tempoten;
  173. unsigned char intpart[20], data[20];
  174. if(temp_float_data < 0)
  175. {
  176. str[0] = '-';
  177. temp_float_data = -temp_float_data;
  178. }
  179. else str[0] = '+';
  180. temp = (signed long)temp_float_data;
  181. i = 0;
  182. tempoten = temp / 10;
  183. while(tempoten != 0)
  184. {
  185. intpart[i] = temp - 10 * tempoten + 48; //to ASCII code
  186. temp = tempoten;
  187. tempoten = temp / 10;
  188. i++;
  189. }
  190. intpart[i] = temp + 48;
  191. for(k = 1; k <= i + 1; k++) str[k] = intpart[i + 1 - k];
  192. for(j = 0; j < 20; j++)
  193. {
  194. data[j] = 0;
  195. }
  196. temp = (temp_float_data * 1000) - ((signed long)(temp_float_data)) * 1000; //取小数
  197. if(temp)
  198. {
  199. Switch_S32_to_ASCII(temp, data);
  200. str[i + 2] = '.';
  201. str[i + 3] = data[1]; //第1位肯定不为0
  202. if(data[2] != '0')
  203. {
  204. str[i + 4] = data[2]; //取2位
  205. }
  206. else
  207. {
  208. str[i + 4] = 0;
  209. }
  210. if(data[3] != '0')
  211. {
  212. str[i + 5] = data[3]; //取3位
  213. }
  214. else
  215. {
  216. str[i + 5] = 0;
  217. }
  218. str[i + 6] = 0;
  219. }
  220. else
  221. {
  222. str[i + 3] = 0;
  223. }
  224. }
  225. /*******************************************************************************
  226. * Function Name : Switch_S16_To_Byte2
  227. * Description : 将有符号整数转成2字节数组存储
  228. * Input : temp_S16_data--要转换的S16变量 data--转换后的2字节数组
  229. * Output : None
  230. * Return : None
  231. *******************************************************************************/
  232. void Switch_S16_To_Byte2(signed short temp_S16_data, unsigned char*data)
  233. {
  234. union Tmp1 S16Tmp;
  235. unsigned char i = 0;
  236. S16Tmp.value = temp_S16_data; //将S16转存
  237. for(i = 0; i < 2; i++)
  238. {
  239. data[i] = S16Tmp.array[i]; //将S16转换成2字节
  240. }
  241. }
  242. /*******************************************************************************
  243. * Function Name : Switch_Byte2_To_S16
  244. * Description : 2字节数组转成有符号整数
  245. * Input : data--转换前的2字节数组
  246. * Output : None
  247. * Return : 转换后的有符号整数
  248. *******************************************************************************/
  249. signed short Switch_Byte2_To_S16(unsigned char*data)
  250. {
  251. union Tmp1 S16Tmp;
  252. unsigned char i = 0;
  253. signed short temp_S16_data = 0;
  254. for(i = 0; i < 2; i++)
  255. {
  256. S16Tmp.array[i] = data[i]; //2字节数据暂存
  257. }
  258. temp_S16_data = S16Tmp.value; //2字节转换的S16有符号整数
  259. return(temp_S16_data);
  260. }
  261. /*******************************************************************************
  262. * Function Name : Switch_Byte4_To_Float
  263. * Description : 四字节数组转成浮点数
  264. * Input : data--转换前的四字节数组
  265. * Output : None
  266. * Return : 转换后的浮点数
  267. *******************************************************************************/
  268. float Switch_Byte4_To_Float(unsigned char*data)
  269. {
  270. union Tmp floatTmp;
  271. unsigned char i = 0;
  272. float temp_float_data = 0;
  273. for(i = 0; i < 4; i++)
  274. {
  275. floatTmp.array[i] = data[i]; //四字节数据暂存
  276. }
  277. temp_float_data = floatTmp.value; //四字节转换的浮点数
  278. return(temp_float_data);
  279. }
  280. /*******************************************************************************
  281. * Function Name : Switch_Float_To_Byte4
  282. * Description : 将浮点数转成四字节数组存储
  283. * Input : temp_float_data--要转换的float变量 data--转换后的四字节数组
  284. * Output : None
  285. * Return : None
  286. *******************************************************************************/
  287. void Switch_Float_To_Byte4(float temp_float_data, unsigned char*data)
  288. {
  289. union Tmp floatTmp;
  290. unsigned char i = 0;
  291. floatTmp.value = temp_float_data; //将浮点数转存
  292. for(i = 0; i < 4; i++)
  293. {
  294. data[i] = floatTmp.array[i]; //将浮点数转换成四字节
  295. }
  296. }
  297. /******************************************************************************
  298. //4字节数存放到数组中 数组起始地址存放高字节
  299. //输入:uint16_t *buf数组起始地址, uint32_t data32存放数
  300. //返回:无
  301. ******************************************************************************/
  302. void Data32ToBuf(uint16_t *buf, uint32_t data32)
  303. {
  304. *buf++ = data32>>16;
  305. *buf = data32;
  306. }
  307. /******************************************************************************
  308. //2字节数组组成一个32位数 数组起始地址存放高字节
  309. //输入:uint16_t *buf数组起始地址, int32_t data32存放数
  310. //返回:32位数
  311. ******************************************************************************/
  312. int32_t BufToData32(uint16_t *buf)
  313. {
  314. uint8_t i;
  315. int32_t temp=0;
  316. int32_t data32=0 ;
  317. for(i=0;i<2;i++)
  318. {
  319. temp = *buf++;
  320. data32 = (data32<<16) + (temp&0xffff);
  321. }
  322. return data32;
  323. }
  324. /*******************************************************************************
  325. * Function Name : Calc_LRC
  326. * Description : LRC校验
  327. * Input : data--要校验的数组 data_len--校验的长度
  328. * Output : None
  329. * Return : lrc 校验后的值
  330. *******************************************************************************/
  331. uint16_t Calc_LRC(uint8_t* data, int data_len)
  332. {
  333. int i;
  334. uint16_t lrc = 0;
  335. for ( i = 0; i < data_len; i++)
  336. {
  337. lrc ^= data[i];
  338. }
  339. return lrc;
  340. }
  341. /*******************************************************************************
  342. * Function Name : LRC_Check
  343. * Description : LRC校验
  344. * Input : data--要校验的数组
  345. * Output : None
  346. * Return : result 校验后的值
  347. *******************************************************************************/
  348. uint16_t LRC_Check(uint8_t *data)
  349. {
  350. uint8_t i;
  351. int k;
  352. uint16_t result;
  353. uint16_t lrcdata[12];
  354. for (i = 1;i < 12 + 1;i++)
  355. {
  356. if (data[i]>0x40)
  357. lrcdata[i - 1] = data[i] - 0x41 + 10;
  358. else
  359. lrcdata[i - 1] = data[i] - 0x30;
  360. }
  361. k = 0;
  362. for (i = 0;i<12 / 2;i++)
  363. {
  364. k += (lrcdata[2 * i] * 16 + lrcdata[2 * i + 1]);
  365. }
  366. k = k % 256;
  367. k = 256 - k;
  368. result = k % 256;
  369. return result;
  370. }
  371. //单字节BCD转为HEX子程序
  372. unsigned char BCDtoHEX(unsigned char bcd_data)
  373. {
  374. unsigned char temp;
  375. temp=(bcd_data/16*10 + bcd_data%16);
  376. return temp;
  377. }
  378. //单字节HEX转为BCD子程序
  379. unsigned char HEXtoBCD(unsigned char hex_data)
  380. {
  381. unsigned char temp;
  382. temp=(hex_data/10*16 + hex_data%10);
  383. return temp;
  384. }
  385. /********** BCD to HEX **********/
  386. //双字节数值范围:0~9999
  387. uint16_t BCD2HEX(uint16_t bcd)
  388. {
  389. uint16_t temp;
  390. temp = (((bcd>>12) & 0x000f) * 1000)
  391. + (((bcd>>8) & 0x000f) * 100)
  392. + (((bcd>>4) & 0x000f) * 10)
  393. + (bcd& 0x000f);
  394. return temp;
  395. }
  396. /********** BCD to HEX **********/
  397. //双字节数值范围:0~9999
  398. uint16_t HEX2BCD(uint16_t hex)
  399. {
  400. uint16_t bcd;
  401. bcd = ((HEXtoBCD((hex/100))) << 8);
  402. bcd += HEXtoBCD(hex%100);
  403. return bcd;
  404. }
  405. /*******************************************************************************
  406. * Function Name : MODBUS_ASCII_AsciiToFloat
  407. * Description : 将目标中的8个字节转化为一个浮点数
  408. * Input : pbDest--要转化的数组
  409. * Output : None
  410. * Return : float 转化后的值
  411. *******************************************************************************/
  412. float MODBUS_ASCII_AsciiToFlaot(uint8_t *pbDest)
  413. {
  414. union Tmp floatTmp;
  415. unsigned char data[8];
  416. unsigned char i = 0;
  417. float temp_float_data = 0;
  418. for(i = 0; i < 4; i++)
  419. {
  420. data[i] = MODBUS_ASCII_AsciiToHex(pbDest+i*2); //一个字节一个转
  421. floatTmp.array[3-i] = data[i]; //四字节数据暂存
  422. }
  423. temp_float_data = floatTmp.value; //四字节转换的浮点数
  424. return(temp_float_data);
  425. }
  426. /*******************************************************************************
  427. * Function Name : MODBUS_Float_to_ASCII
  428. * Description : float数据转换为8个字节的ASCII数据
  429. * Input : data32--要转换的数据
  430. * Output : pAsciiBuf 转换后的数组
  431. * Return :
  432. *******************************************************************************/
  433. void MODBUS_Float_to_ASCII(float data32 ,uint8_t *pAsciiBuf )
  434. {
  435. uint8_t i;
  436. union Tmp2 a32Tmp;
  437. union Tmp floatTmp;
  438. floatTmp.value = data32;
  439. for(i=0;i<4;i++)a32Tmp.array[i]=floatTmp.array[i];
  440. for(i=0;i<8;i++)
  441. {
  442. pAsciiBuf[i] = (a32Tmp.value>>(28-i*4))&0x0F;
  443. if(pAsciiBuf[i]<=0x09)
  444. pAsciiBuf[i] = pAsciiBuf[i]+0x30;
  445. else
  446. {
  447. pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
  448. }
  449. }
  450. }
  451. /*******************************************************************************
  452. * Function Name : MODBUS_ASCII_AsciiToHex
  453. * Description : 转化为16进制
  454. * Input : pbDest--要转化的数组
  455. * Output : None
  456. * Return : s1*16 + s2 转化后的值
  457. *******************************************************************************/
  458. uint8_t MODBUS_ASCII_AsciiToHex(uint8_t *pbDest)
  459. {
  460. char h1,h2;
  461. uint8_t s1,s2;
  462. h1 = pbDest[0];
  463. h2 = pbDest[1];
  464. s1 = toupper(h1) - 0x30;
  465. if (s1 > 9)
  466. s1 -= 7;
  467. s2 = toupper(h2) - 0x30;
  468. if (s2 > 9)
  469. s2 -= 7;
  470. return (s1*16 + s2);
  471. }
  472. uint8_t MODBUS_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen)
  473. {
  474. uint8_t i;
  475. uint8_t cyLrcVal;
  476. //cyLen /= 2;
  477. cyLrcVal = 0;
  478. for (i = 0; i < cyLen; i++)
  479. {
  480. cyLrcVal += *(pCyAsciiBuf + i);
  481. }
  482. cyLrcVal = ~cyLrcVal;
  483. cyLrcVal += 1;
  484. return (cyLrcVal);
  485. }
  486. /*******************************************************************************
  487. * Function Name : MODBUS_ASCII_GetLrc
  488. * Description : LRC校验
  489. * Input : pCyAsciiBuf--要校验的数组 cyLen--长度
  490. * Output : None
  491. * Return : cyLrcVal 校验后的值
  492. *******************************************************************************/
  493. uint8_t MODBUS_ASCII_GetLrc(uint8_t *pCyAsciiBuf, uint16_t cyLen)
  494. {
  495. uint16_t i;
  496. uint8_t cyLrcVal;
  497. if (1 == (cyLen % 2) )
  498. {
  499. return 0;
  500. }
  501. cyLen /= 2;
  502. cyLrcVal = 0;
  503. for (i = 0; i < cyLen; i++)
  504. {
  505. cyLrcVal += MODBUS_ASCII_AsciiToHex(pCyAsciiBuf + i * 2);
  506. }
  507. cyLrcVal = ~cyLrcVal;
  508. cyLrcVal += 1;
  509. return (cyLrcVal);
  510. }
  511. /*******************************************************************************
  512. * Function Name : MODBUS_Hex_GetLrc
  513. * Description : LRC校验
  514. * Input : pCyAsciiBuf--要校验的数组 cyLen--长度
  515. * Output : None
  516. * Return : cyLrcVal 校验后的值
  517. *******************************************************************************/
  518. uint8_t MODBUS_Hex_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen)
  519. {
  520. uint8_t i;
  521. uint8_t cyLrcVal;
  522. // if (1 == (cyLen % 2) )
  523. // {
  524. // return 0;
  525. // }
  526. // cyLen /= 2;
  527. cyLrcVal = 0;
  528. for (i = 0; i < cyLen; i++)
  529. {
  530. cyLrcVal += *(pCyAsciiBuf + i * 1);
  531. }
  532. cyLrcVal = ~cyLrcVal;
  533. cyLrcVal += 1;
  534. return (cyLrcVal);
  535. }
  536. /*******************************************************************************
  537. * Function Name : MODBUS_S32_to_ASCII
  538. * Description : 32位数据转换为单个8位数据
  539. * Input : data32--要转换的数据
  540. * Output : pAsciiBuf 转换后的数组
  541. * Return :
  542. *******************************************************************************/
  543. void MODBUS_S32_to_ASCII(int32_t data32 ,uint8_t *pAsciiBuf )
  544. {
  545. uint8_t i;
  546. for(i=0;i<8;i++)
  547. {
  548. pAsciiBuf[i] = (data32>>(28-i*4))&0x0F;
  549. if(pAsciiBuf[i]<=0x09)
  550. pAsciiBuf[i] = pAsciiBuf[i]+0x30;
  551. else
  552. {
  553. pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
  554. }
  555. }
  556. }
  557. /*******************************************************************************
  558. * Function Name : MODBUS_S16_to_ASCII
  559. * Description : 16为数据转换为ASCII数据
  560. * Input : data16--要转换的数据
  561. * Output : pAsciiBuf 转换后的数组
  562. * Return :
  563. *******************************************************************************/
  564. void MODBUS_S16_to_ASCII(int16_t data16 ,uint8_t *pAsciiBuf )
  565. {
  566. uint8_t i;
  567. for(i=0;i<4;i++)
  568. {
  569. pAsciiBuf[i] = (data16>>(12-i*4))&0x0F;
  570. if(pAsciiBuf[i]<=0x09)//if((pAsciiBuf[i]>=0x00)&&(pAsciiBuf[i]<=0x09))
  571. pAsciiBuf[i] = pAsciiBuf[i]+0x30;
  572. else
  573. {
  574. pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
  575. }
  576. }
  577. }
  578. /*******************************************************************************
  579. * Function Name : MODBUS_S8_to_ASCII
  580. * Description : 8为数据转换为ASCII数据
  581. * Input : data8--要转换的数据
  582. * Output : pAsciiBuf 转换后的数组
  583. * Return :
  584. *******************************************************************************/
  585. void MODBUS_S8_to_ASCII(int8_t data8 ,uint8_t *pAsciiBuf )
  586. {
  587. uint8_t i;
  588. for(i=0;i<2;i++)
  589. {
  590. pAsciiBuf[i] = (data8>>(4-i*4))&0x0F;
  591. if(pAsciiBuf[i]<=0x09)//if((pAsciiBuf[i]>=0x00)&&(pAsciiBuf[i]<=0x09))
  592. pAsciiBuf[i] = pAsciiBuf[i]+0x30;
  593. else
  594. {
  595. pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
  596. }
  597. }
  598. }
  599. ////将一个8位数高低4位交换
  600. //static inline unsigned char bswap_8(unsigned char v)
  601. //{
  602. // return ((v & 0xff) << 4) | (v >> 4) ; //将参数(v & 0xff) << 4 相当于放到高位, v >> 4 位相当于放在低位
  603. //} //以下两个代码分析雷同
  604. ////将一个16位数高低8位交换
  605. //static inline unsigned short bswap_16(unsigned short v)
  606. //{
  607. // return ((v & 0xff) << 8) | (v >> 8);
  608. //}
  609. ////将一个32位数高低16位交换
  610. //static inline unsigned int bswap_32(unsigned int v)
  611. //{
  612. // return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
  613. // ((v & 0xff0000) >> 8) | (v >> 24);
  614. //}
  615. /*******************************************************************************
  616. * Function Name : CRC16
  617. * Description : CRC16校验
  618. * Input : pBuf--要校验的数据 nLength--校验的长度
  619. * Output : ((wReturn & 0xff) << 8) | (wReturn >> 8) 校验后的数组
  620. * Return :
  621. *******************************************************************************/
  622. uint16_t CRC16(unsigned char *pBuf,int nLength)
  623. {
  624. uint16_t wReturn = 0xFFFF;
  625. int nDataLen=0;
  626. int nIndex=0;
  627. for(nDataLen=0;nDataLen<nLength;nDataLen++)
  628. {
  629. wReturn^=(unsigned short)(pBuf[nDataLen]);//(BYTE(pBuf[nDataLen]));
  630. for(nIndex=0;nIndex<8;nIndex++)
  631. {
  632. if(wReturn&0x0001)
  633. {
  634. wReturn>>=1;
  635. wReturn^=0xA001;
  636. }
  637. else
  638. {
  639. wReturn>>=1;
  640. }
  641. }
  642. }
  643. return ((wReturn & 0xff) << 8) | (wReturn >> 8);//高低互换
  644. // return wReturn;
  645. }
  646. static uint16_t const wCRC16Table[256] = {
  647. 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
  648. 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
  649. 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
  650. 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
  651. 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
  652. 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
  653. 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
  654. 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
  655. 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
  656. 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
  657. 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
  658. 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
  659. 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
  660. 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
  661. 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
  662. 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
  663. 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
  664. 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
  665. 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
  666. 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
  667. 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
  668. 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
  669. 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
  670. 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
  671. 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
  672. 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
  673. 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
  674. 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
  675. 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
  676. 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
  677. 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
  678. 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040};
  679. uint16_t Key_CRC16(const unsigned char* pDataIn, const unsigned char iLenIn)
  680. {
  681. uint16_t wResult = 0xFFFF;
  682. uint16_t wTableNo = 0;
  683. int i = 0;
  684. for( i = 0; i < iLenIn; i++)
  685. {
  686. wTableNo = ((wResult & 0xff) ^ (pDataIn[i] & 0xff));
  687. wResult = ((wResult >> 8) & 0xff) ^ wCRC16Table[wTableNo];
  688. }
  689. return wResult;
  690. }
  691. // crcValue=CRC16(SendBuf,4);
  692. // SendBuf[4]=(unsigned char)crcValue;
  693. // SendBuf[5]=(unsigned char)(crcValue>>8);
  694. void InvertUint8(unsigned char *dBuf, unsigned char *srcBuf)
  695. {
  696. int i;
  697. unsigned char tmp[4];
  698. tmp[0] = 0;
  699. for(i = 0; i < 8; i++)
  700. {
  701. if(srcBuf[0] & (1 << i))
  702. tmp[0] |= 1 << (7 - i);
  703. }
  704. dBuf[0] = tmp[0];
  705. }
  706. void InvertUint16(unsigned short *dBuf, unsigned short *srcBuf)
  707. {
  708. int i;
  709. unsigned short tmp[4];
  710. tmp[0] = 0;
  711. for (i = 0; i < 16; i++)
  712. {
  713. if(srcBuf[0] & (1 << i))
  714. tmp[0] |= 1 << (15 - i);
  715. }
  716. dBuf[0] = tmp[0];
  717. }
  718. unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen)
  719. {
  720. int i;
  721. unsigned short temp;
  722. unsigned short temp1;
  723. unsigned short wCRCin = 0xFFFF;
  724. unsigned short wCPoly = 0x8005;
  725. unsigned char wChar = 0;
  726. while(usDataLen--)
  727. {
  728. wChar = *(puchMsg++);
  729. InvertUint8(&wChar, &wChar);
  730. wCRCin ^= (wChar << 8);
  731. for(i = 0; i < 8; i++)
  732. {
  733. if(wCRCin & 0x8000)
  734. wCRCin = (wCRCin << 1)^wCPoly;
  735. else
  736. wCRCin = wCRCin << 1;
  737. }
  738. }
  739. InvertUint16(&wCRCin, &wCRCin);
  740. temp1=wCRCin>>8&0x00ff;
  741. temp=(temp1)+(wCRCin<<8);
  742. return(temp);
  743. }