Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

685 rindas
18 KiB

  1. #include "stm32f4xx.h"
  2. #include "ucos_ii.h"
  3. #include "os.h"
  4. #include "string.h"
  5. #include "modbus.h"
  6. uint8_t ModbusErr;
  7. /*0x270F + 1 = K10000 */
  8. uint8_t ModbusCoil[1250]; /*10000/8=1250*/
  9. uint16_t ModbusReg[10000];
  10. /*附加功能:页寄存器*/
  11. uint16_t ModbusExtPage[1] = {0}; /*设置地址为0xFFFE*/
  12. uint16_t ModbusExtReg[1]; /*地址映射为0x10000*/
  13. /*附加功能:读取所有单数个寄存器*/
  14. uint16_t ModbusExtOdd[1] = {0}; /*设置地址为0xFFFF*/
  15. uint8_t ModbusRxBuf[MODBUS_RX_BUF_SIZE]; /*接收数组*/
  16. uint16_t ModbusRxLen = 0; /*接收数据长度*/
  17. uint8_t ModbusTxBuf[MODBUS_TX_BUF_SIZE]; /*发送数组*/
  18. uint16_t ModbusTxLen = 0; /*发送数据长度*/
  19. uint8_t ModbusErrReply(uint8_t func, uint8_t err);
  20. uint16_t Crc16(const uint8_t *data, uint16_t length);
  21. void AddCrc16(uint8_t *data, uint16_t length);
  22. int8_t ChcekCrc16(uint16_t recCrc16, uint8_t *data, uint16_t length);
  23. uint8_t ModbusReadCoils(uint16_t addres, uint16_t num);
  24. uint8_t ModbusWriteCoils(uint16_t addres, uint16_t num, uint8_t *data);
  25. uint8_t ModbusReadRegs(uint16_t addres, uint16_t num);
  26. uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data);
  27. uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data);
  28. uint8_t ModbusWriteCoil(uint16_t addres, uint8_t *data);
  29. uint8_t ModbusExtReadOdd(uint16_t num);
  30. /*USART接收空闲中断*/
  31. void USART1_IRQHandler(void)
  32. {
  33. OSIntEnter(); /*进入中断*/
  34. uint32_t temp;
  35. uint16_t rxLenRemain;
  36. if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
  37. {
  38. /*在计算数据长度之前先关闭DMA接收通道,防止计算过程中DMA继续转运数据*/
  39. DMA_Cmd(DMA2_Stream2, DISABLE);
  40. /*清除IDLE中断标志位*/
  41. temp = USART1->SR;
  42. temp = USART1->DR;
  43. (void)temp;
  44. /*清除传输已经完成TCIF2、传输已经完成一半HTIF2标志位*/
  45. DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2);
  46. /*计算数据长度*/
  47. rxLenRemain = DMA_GetCurrDataCounter(DMA2_Stream2);
  48. ModbusRxLen = MODBUS_RX_BUF_SIZE - rxLenRemain;
  49. /*释放接收到数据帧信号量,唤醒帧解析任务*/
  50. if(ModbusRxLen != 0)
  51. {
  52. OSSemPost(ModbusReceived);
  53. }
  54. /*重新指定接收地址*/
  55. DMA_MemoryTargetConfig(DMA2_Stream2, (uint32_t)ModbusRxBuf, DMA_Memory_0);
  56. /*重启DMA*/
  57. DMA_SetCurrDataCounter(DMA2_Stream2, MODBUS_RX_BUF_SIZE);
  58. DMA_Cmd(DMA2_Stream2, ENABLE);
  59. }
  60. OSIntExit(); /*退出中断*/
  61. }
  62. /*modbus响应帧发送*/
  63. void ModbusSend(uint8_t *txBuf, uint16_t len)
  64. {
  65. if(DMA_GetCmdStatus(DMA2_Stream7) == ENABLE)
  66. {
  67. /*等待DMA发送完成*/
  68. while(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
  69. }
  70. /*先关闭DMA发送通道*/
  71. DMA_Cmd(DMA2_Stream7, DISABLE);
  72. /*等待DMA关闭*/
  73. while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE);
  74. /*清除传输已经完成TCIF7、传输已经完成一半HTIF7、FIFO错误FEIF7标志位*/
  75. DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_FEIF7 | DMA_FLAG_HTIF7 | DMA_FLAG_TCIF7);
  76. /*配置发送地址和长度*/
  77. DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0);
  78. DMA_SetCurrDataCounter(DMA2_Stream7, len);
  79. /*等待串口发送完成*/
  80. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  81. /*启动 DMA 发送*/
  82. DMA_Cmd(DMA2_Stream7, ENABLE);
  83. }
  84. /*modbus协议帧解析任务*/
  85. void AppTaskModbusParse (void *p_arg)
  86. {
  87. OS_ERR err;
  88. MODBUS_FRAME frame;
  89. uint16_t rxLen;
  90. uint8_t rxBuf[256];
  91. while(1)
  92. {
  93. /*无限期等待接收到数据帧信号量*/
  94. OSSemPend(ModbusReceived, 0, &err);
  95. /*数据接收,防止下一帧覆盖*/
  96. rxLen = ModbusRxLen;
  97. memcpy(rxBuf, ModbusRxBuf, rxLen);
  98. /*拼接crc校验码(高前低后),接收到的数据帧crc校验码是低前高后*/
  99. frame.crc = ((uint16_t)(rxBuf[rxLen - 2])) | ((uint16_t)rxBuf[rxLen - 1] << 8);
  100. if(ChcekCrc16(frame.crc, rxBuf, rxLen) != 0)
  101. {
  102. /*crc校验错误,直接丢弃*/
  103. ModbusErr = ERR_CRC;
  104. continue;
  105. }
  106. frame.slaveAddres = rxBuf[0];
  107. if(frame.slaveAddres != SLAVE_ADDRES)
  108. {
  109. /*从机地址错误,直接丢弃*/
  110. ModbusErr = ERR_SLAVE_ADDRES;
  111. continue;
  112. }
  113. frame.func = rxBuf[1];
  114. frame.opeAddres = ((uint16_t)rxBuf[2] << 8) | ((uint16_t)rxBuf[3]);
  115. frame.opeNum = ((uint16_t)rxBuf[4] << 8) | ((uint16_t)rxBuf[5]);
  116. /*功能码分类*/
  117. switch(frame.func)
  118. {
  119. case 0x01:/*读线圈*/
  120. ModbusErr = ModbusReadCoils(frame.opeAddres, frame.opeNum);
  121. break;
  122. case 0x03:/*读寄存器*/
  123. ModbusErr = ModbusReadRegs(frame.opeAddres, frame.opeNum);
  124. break;
  125. case 0x0F:/*写多个线圈*/
  126. frame.wNum = rxBuf[6];
  127. memcpy(frame.wData, &rxBuf[7], frame.wNum);
  128. ModbusErr = ModbusWriteCoils(frame.opeAddres, frame.opeNum, frame.wData);
  129. break;
  130. case 0x10:/*写多个寄存器*/
  131. frame.wNum = rxBuf[6];
  132. memcpy(frame.wData, &rxBuf[7], frame.wNum);
  133. ModbusErr = ModbusWriteRegs(frame.opeAddres, frame.opeNum, frame.wData);
  134. break;
  135. case 0x05:/*写单个线圈*/
  136. memcpy(frame.wData, &rxBuf[4], 2);
  137. ModbusErr = ModbusWriteCoil(frame.opeAddres, frame.wData);
  138. break;
  139. case 0x06:/*写单个寄存器*/
  140. memcpy(frame.wData, &rxBuf[4], 2);
  141. ModbusErr = ModbusWriteReg(frame.opeAddres, frame.wData);
  142. break;
  143. default:/*功能码错误*/
  144. ModbusErr = ERR_FUNC;
  145. ModbusErr = ModbusErrReply(frame.func, ERR_FUNC);
  146. break;
  147. }
  148. /*实现附加功能时不在这里启动发送*/
  149. if(frame.func == 0x03 && frame.opeAddres == 0XFFFF)
  150. {
  151. ;
  152. }
  153. else
  154. {
  155. /*启动发送*/
  156. ModbusSend(ModbusTxBuf, ModbusTxLen);
  157. }
  158. }
  159. }
  160. uint8_t ModbusReadCoils(uint16_t addres, uint16_t num)
  161. {
  162. uint16_t byteIndI; /*字节索引*/
  163. uint8_t bitIndI; /*位索引*/
  164. uint16_t byteIndO;
  165. uint8_t bitIndO;
  166. uint8_t dataLen; /*响应帧返回字节数*/
  167. uint8_t index; /*发送数组索引*/
  168. uint8_t readVal; /*读取到的形式值*/
  169. uint8_t writeVal; /*写入的形式值*/
  170. if(ModbusRxLen < 8)
  171. {
  172. return ModbusErrReply(0x01, ERR_DATA);
  173. }
  174. /*操作地址超限*/
  175. if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
  176. {
  177. return ModbusErrReply(0x01, ERR_OPE_ADDRES);
  178. }
  179. /*操作数量超限*/
  180. if(num == 0 || num > 2000)
  181. {
  182. return ModbusErrReply(0x01, ERR_DATA);
  183. }
  184. /*不能num/8+1,当为8的整数时会多一个*/
  185. dataLen = (num + 7) / 8;
  186. /*清零发送数组*/
  187. memset(&ModbusTxBuf[3], 0, 253);
  188. for(uint16_t i = 0; i < num; i++)
  189. {
  190. byteIndO = i / 8;
  191. bitIndO = i % 8;
  192. byteIndI = (addres + i) / 8;
  193. bitIndI = (addres + i) % 8;
  194. /*位掩码读取线圈值*/
  195. readVal = ModbusCoil[byteIndI] & ((uint8_t)1 << bitIndI);
  196. /*读取到的值为0则不进行操作*/
  197. if(readVal != 0)
  198. {
  199. index = 3 + byteIndO;
  200. /*将读取到的值移位到要写入的位*/
  201. writeVal = (uint8_t)1u << bitIndO;
  202. ModbusTxBuf[index] |= writeVal;
  203. }
  204. }
  205. ModbusTxBuf[0] = SLAVE_ADDRES; /*从机地址*/
  206. ModbusTxBuf[1] = 0x01; /*功能码*/
  207. ModbusTxBuf[2] = dataLen; /*响应帧返回数据字节数*/
  208. AddCrc16(ModbusTxBuf, 3 + dataLen);
  209. ModbusTxLen = 5 + dataLen;
  210. return 0;
  211. }
  212. uint8_t ModbusWriteCoils(uint16_t addres, uint16_t num, uint8_t *data)
  213. {
  214. uint16_t byteIndI;
  215. uint8_t bitIndI;
  216. uint16_t byteIndO;
  217. uint8_t bitIndO;
  218. uint8_t readVal;
  219. uint8_t writeVal;
  220. if(ModbusRxLen < 10)
  221. {
  222. return ModbusErrReply(0x0F, ERR_DATA);
  223. }
  224. /*操作地址超限*/
  225. if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
  226. {
  227. return ModbusErrReply(0x0F, ERR_OPE_ADDRES);
  228. }
  229. /*操作数量超限*/
  230. if(num == 0 || num > 1968)
  231. {
  232. return ModbusErrReply(0x0F, ERR_DATA);
  233. }
  234. for(uint16_t i = 0; i < num; i++)
  235. {
  236. byteIndI = (addres + i) / 8;
  237. bitIndI = (addres + i) % 8;
  238. byteIndO = i / 8;
  239. bitIndO = i % 8;
  240. /*位掩码读取要写入的值*/
  241. readVal = data[byteIndO] | ((uint8_t)1 << bitIndO);
  242. /*将写入值移位到要写入的位*/
  243. writeVal = (uint8_t)1 << bitIndI;
  244. /*对应位写入1*/
  245. if(readVal != 0)
  246. {
  247. ModbusCoil[byteIndI] |= writeVal;
  248. }
  249. /*对应位写入0*/
  250. else
  251. {
  252. ModbusCoil[byteIndI] &= (~writeVal);
  253. }
  254. }
  255. ModbusTxBuf[0] = SLAVE_ADDRES;
  256. ModbusTxBuf[1] = 0x0F;
  257. /*操作地址*/
  258. ModbusTxBuf[2] = (uint8_t)(addres >> 8);
  259. ModbusTxBuf[3] = (uint8_t)(addres & 0x00FF);
  260. /*成功写入的数量*/
  261. ModbusTxBuf[4] = (uint8_t)(num >> 8);
  262. ModbusTxBuf[5] = (uint8_t)(num & 0x00FF);
  263. AddCrc16(ModbusTxBuf, 6);
  264. ModbusTxLen = 8;
  265. return 0;
  266. }
  267. uint8_t ModbusReadRegs(uint16_t addres, uint16_t num)
  268. {
  269. uint8_t index;
  270. uint8_t readValH;
  271. uint8_t readValL;
  272. uint8_t dataLen;
  273. if(ModbusRxLen < 8)
  274. {
  275. return ModbusErrReply(0x13, ERR_DATA);
  276. }
  277. /*操作地址超限*/
  278. if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
  279. {
  280. if(addres == 0xFFFF && num == 1)
  281. {
  282. ;
  283. }
  284. else
  285. {
  286. return ModbusErrReply(0x03, ERR_OPE_ADDRES);
  287. }
  288. }
  289. /*操作数量超限*/
  290. if(num == 0 || num > 125)
  291. {
  292. return ModbusErrReply(0x03, ERR_DATA);
  293. }
  294. dataLen = num * 2;
  295. /*附加功能:读取0x10000寄存器*/
  296. if(ModbusExtPage[0] == 1 && addres == 0x0000)
  297. {
  298. /*将16位寄存器值拆分为两个8位*/
  299. readValH = (uint8_t)(ModbusExtReg[0] >> 8);
  300. readValL = (uint8_t)(ModbusExtReg[0] & 0x00FF);
  301. ModbusTxBuf[3] = readValH;
  302. ModbusTxBuf[4] = readValL;
  303. }
  304. /*附加功能:读取大量奇数寄存器*/
  305. else if(addres == 0xFFFF && num == 1)
  306. {
  307. return ModbusExtReadOdd(ModbusExtOdd[0]);
  308. }
  309. else
  310. {
  311. for(uint16_t i = 0; i < num; i++)
  312. {
  313. index = 3 + (i * 2);
  314. /*将16位寄存器值拆分为两个8位*/
  315. readValH = (uint8_t)(ModbusReg[addres + i] >> 8);
  316. readValL = (uint8_t)(ModbusReg[addres + i] & 0x00FF);
  317. ModbusTxBuf[index] = readValH;
  318. ModbusTxBuf[index + 1] = readValL;
  319. }
  320. }
  321. ModbusTxBuf[0] = SLAVE_ADDRES;
  322. ModbusTxBuf[1] = 0x03;
  323. ModbusTxBuf[2] = dataLen;
  324. AddCrc16(ModbusTxBuf, 3 + dataLen);
  325. ModbusTxLen = 5 + dataLen;
  326. return 0;
  327. }
  328. uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data)
  329. {
  330. uint8_t index;
  331. uint8_t writeValH;
  332. uint8_t writeValL;
  333. uint16_t writeVal;
  334. if(ModbusRxLen < 11)
  335. {
  336. return ModbusErrReply(0x10, ERR_DATA);
  337. }
  338. /*操作地址超限*/
  339. if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
  340. {
  341. if((addres == 0xFFFE || addres == 0xFFFF) && num == 1)
  342. {
  343. ;
  344. }
  345. else
  346. {
  347. return ModbusErrReply(0x10, ERR_OPE_ADDRES);
  348. }
  349. }
  350. /*操作数量超限*/
  351. if(num == 0 || num > 123)
  352. {
  353. return ModbusErrReply(0x10, ERR_DATA);
  354. }
  355. /*附加功能:读取0x10000寄存器*/
  356. if(addres == 0xFFFE && num == 1)
  357. {
  358. writeValH = data[0];
  359. writeValL = data[1];
  360. /*将要写入两个8位值拼接为16位*/
  361. writeVal = ((uint16_t)writeValH << 8) | ((uint16_t)writeValL & 0x00FF);
  362. ModbusExtPage[0] = writeVal;
  363. }
  364. /*附加功能:读取大量奇数寄存器*/
  365. else if(addres == 0xFFFF && num == 1)
  366. {
  367. writeValH = data[0];
  368. writeValL = data[1];
  369. /*将要写入两个8位值拼接为16位*/
  370. writeVal = ((uint16_t)writeValH << 8) | ((uint16_t)writeValL & 0x00FF);
  371. ModbusExtOdd[0] = writeVal;
  372. }
  373. /*正常功能*/
  374. else
  375. {
  376. for(uint16_t i = 0; i < num; i++)
  377. {
  378. index = i * 2;
  379. writeValH = data[index];
  380. writeValL = data[index + 1];
  381. /*将要写入两个8位值拼接为16位*/
  382. writeVal = ((uint16_t)writeValH << 8) | ((uint16_t)writeValL & 0x00FF);
  383. ModbusReg[addres + i] = writeVal;
  384. }
  385. }
  386. ModbusTxBuf[0] = SLAVE_ADDRES;
  387. ModbusTxBuf[1] = 0x10;
  388. /*操作地址*/
  389. ModbusTxBuf[2] = (uint8_t)(addres >> 8);
  390. ModbusTxBuf[3] = (uint8_t)(addres & 0x00FF);
  391. /*成功写入数量*/
  392. ModbusTxBuf[4] = (uint8_t)(num >> 8);
  393. ModbusTxBuf[5] = (uint8_t)(num & 0x00FF);
  394. AddCrc16(ModbusTxBuf, 6);
  395. ModbusTxLen = 8;
  396. return 0;
  397. }
  398. uint8_t ModbusWriteCoil(uint16_t addres, uint8_t *data)
  399. {
  400. uint16_t byteIndI;
  401. uint8_t bitIndI;
  402. uint16_t readVal;
  403. uint8_t writeVal;
  404. /*操作地址超限*/
  405. if(addres > 0x270F)
  406. {
  407. return ModbusErrReply(0x0F, ERR_OPE_ADDRES);
  408. }
  409. byteIndI = addres / 8;
  410. bitIndI = addres % 8;
  411. /*位掩码读取要写入的值*/
  412. readVal = ((uint16_t)data[0] << 8) | ((uint16_t)data[1] & 0x00FF);
  413. /*将写入值移位到要写入的位*/
  414. writeVal = (uint8_t)1 << bitIndI;
  415. /*置on*/
  416. if(readVal == 0xFF00)
  417. {
  418. ModbusCoil[byteIndI] |= writeVal;
  419. }
  420. /*置off*/
  421. else if(readVal == 0x0000)
  422. {
  423. ModbusCoil[byteIndI] &= (~writeVal);
  424. }
  425. else
  426. {
  427. return ModbusErrReply(0x05, ERR_DATA);
  428. }
  429. ModbusTxBuf[0] = SLAVE_ADDRES;
  430. ModbusTxBuf[1] = 0x0F;
  431. /*操作地址*/
  432. ModbusTxBuf[2] = (uint8_t)(addres >> 8);
  433. ModbusTxBuf[3] = (uint8_t)(addres & 0x00FF);
  434. /*成功写入*/
  435. ModbusTxBuf[4] = data[0];
  436. ModbusTxBuf[5] = data[1];
  437. AddCrc16(ModbusTxBuf, 6);
  438. ModbusTxLen = 8;
  439. return 0;
  440. }
  441. uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data)
  442. {
  443. uint8_t writeValH;
  444. uint8_t writeValL;
  445. uint16_t writeVal;
  446. /*操作地址超限*/
  447. if(addres > 0x270F)
  448. {
  449. return ModbusErrReply(0x10, ERR_OPE_ADDRES);
  450. }
  451. writeValH = data[0];
  452. writeValL = data[1];
  453. /*将要写入两个8位值拼接为16位*/
  454. writeVal = ((uint16_t)writeValH << 8) | ((uint16_t)writeValL & 0x00FF);
  455. ModbusReg[addres] = writeVal;
  456. ModbusTxBuf[0] = SLAVE_ADDRES;
  457. ModbusTxBuf[1] = 0x10;
  458. /*操作地址*/
  459. ModbusTxBuf[2] = (uint8_t)(addres >> 8);
  460. ModbusTxBuf[3] = (uint8_t)(addres & 0x00FF);
  461. /*成功写入*/
  462. ModbusTxBuf[4] = writeValH;
  463. ModbusTxBuf[5] = writeValL;
  464. AddCrc16(ModbusTxBuf, 6);
  465. ModbusTxLen = 8;
  466. return 0;
  467. }
  468. uint8_t ModbusExtReadOdd(uint16_t num)
  469. {
  470. uint8_t i = 0;
  471. uint8_t numJ = (num + 124) / 125;
  472. uint8_t numI = num % 125;
  473. uint8_t index;
  474. uint16_t indexR;
  475. uint8_t readValH;
  476. uint8_t readValL;
  477. uint8_t dataLen;
  478. for(uint16_t j = 0; j < numJ; j++)
  479. {
  480. if(j == numJ - 1)
  481. {
  482. for(i = 0; i < numI; i++)
  483. {
  484. index = 3 + (i * 2);
  485. indexR = j * 250 + 2 * i + 1;
  486. /*将16位寄存器值拆分为两个8位*/
  487. readValH = (uint8_t)(ModbusReg[indexR] >> 8);
  488. readValL = (uint8_t)(ModbusReg[indexR] & 0x00FF);
  489. ModbusTxBuf[index] = readValH;
  490. ModbusTxBuf[index + 1] = readValL;
  491. }
  492. dataLen = 2 * numI;
  493. ModbusTxBuf[0] = SLAVE_ADDRES;
  494. ModbusTxBuf[1] = 0x03;
  495. ModbusTxBuf[2] = dataLen;
  496. AddCrc16(ModbusTxBuf, 3 + dataLen);
  497. ModbusTxLen = 5 + dataLen;
  498. }
  499. else
  500. {
  501. for(i = 0; i < 125; i++)
  502. {
  503. index = 3 + (i * 2);
  504. indexR = j * 250 + 2 * i + 1;
  505. /*将16位寄存器值拆分为两个8位*/
  506. readValH = (uint8_t)(ModbusReg[indexR] >> 8);
  507. readValL = (uint8_t)(ModbusReg[indexR] & 0x00FF);
  508. ModbusTxBuf[index] = readValH;
  509. ModbusTxBuf[index + 1] = readValL;
  510. }
  511. dataLen = 250;
  512. ModbusTxBuf[0] = SLAVE_ADDRES;
  513. ModbusTxBuf[1] = 0x03;
  514. ModbusTxBuf[2] = dataLen;
  515. AddCrc16(ModbusTxBuf, 3 + dataLen);
  516. ModbusTxLen = 5 + dataLen;
  517. }
  518. OSTimeDlyHMSM(0, 0, 0, 10);
  519. ModbusSend(ModbusTxBuf, ModbusTxLen);
  520. }
  521. return 0;
  522. }
  523. uint8_t ModbusErrReply(uint8_t func, uint8_t err)
  524. {
  525. ModbusTxBuf[0] = SLAVE_ADDRES;
  526. ModbusTxBuf[1] = func;
  527. ModbusTxBuf[2] = err;
  528. AddCrc16(ModbusTxBuf, 3);
  529. ModbusTxLen = 5;
  530. return err;
  531. }
  532. void AddCrc16(uint8_t *data, uint16_t length)
  533. {
  534. uint8_t *dataT = data;
  535. uint16_t crc16 = Crc16(data, length);
  536. /*低前高后*/
  537. dataT[length] = (uint8_t)(crc16 & 0x00FF);
  538. dataT[length + 1] = (uint8_t)(crc16 >> 8);
  539. }
  540. /*crc16校验*/
  541. uint16_t Crc16(const uint8_t *data, uint16_t length)
  542. {
  543. uint16_t crc;
  544. uint16_t byteInd;
  545. uint8_t bitInd;
  546. crc = 0xFFFFu;
  547. for (byteInd = 0u; byteInd < length; byteInd++)
  548. {
  549. crc ^= (uint16_t)data[byteInd];
  550. for (bitInd = 0u; bitInd < 8u; bitInd++)
  551. {
  552. if ((crc & 0x0001u) != 0u)
  553. {
  554. crc >>= 1;
  555. crc ^= 0xA001u;
  556. }
  557. else
  558. {
  559. crc >>= 1;
  560. }
  561. }
  562. }
  563. return crc;
  564. }
  565. /*crc16检查*/
  566. int8_t ChcekCrc16(uint16_t recCrc16, uint8_t *data, uint16_t length)
  567. {
  568. uint16_t crc16 = Crc16(data, (length - 2));
  569. if(recCrc16 == crc16)
  570. {
  571. return 0;
  572. }
  573. else
  574. {
  575. return -1;
  576. }
  577. }