sys_data.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "sys_data.h"
  2. #include "led.h"
  3. #include "usart.h"
  4. USART_MSG_t usartMsg;
  5. uint8_t result ;
  6. // 校验码
  7. unsigned char CheckXor(const uint8_t *strData,int len)
  8. {
  9. char checksum = 0;
  10. for (int i = 0;i < len;i++)
  11. {
  12. checksum = checksum ^ strData[i];
  13. }
  14. return (unsigned char)checksum;
  15. }
  16. void call_back()
  17. {
  18. // 检测发送完成标志位
  19. if (RESET != USART_GetFlagStatus(USART_232,USART_FLAG_RXNE))
  20. {
  21. if (usartMsg.rxIndex < _USART3_RXSIZE - 1){
  22. usartMsg.rxBuf[usartMsg.rxIndex] = USART_ReceiveData(USART_232);
  23. usartMsg.rxIndex++;
  24. }
  25. else
  26. USART_ReceiveData(USART_232);
  27. }
  28. // 检测空闲标志位
  29. if ((usartMsg.rxIndex > 0) && RESET != USART_GetFlagStatus(USART_232, USART_FLAG_IDLE))
  30. {
  31. uint8_t i;
  32. usartMsg.done = 1;
  33. // 清除空闲中断
  34. i = USART_232->SR; // 先读取SR寄存器
  35. i = USART_232->DR; // 再读取DR寄存器
  36. }
  37. else
  38. {
  39. uint8_t i;
  40. // 清除空闲中断
  41. i = USART_232->SR; // 先读取SR寄存器
  42. i = USART_232->DR; // 再读取DR寄存器
  43. }
  44. }
  45. // 发送回馈信息
  46. int sendCmd(uint8_t *data, uint16_t size)
  47. {
  48. while(usartMsg.txBusy == 1)
  49. {
  50. delay_ms(10);
  51. }
  52. usartMsg.txBusy = 1;
  53. memset(usartMsg.rxBuf, 0, _USART3_RXSIZE);
  54. usartMsg.rxIndex = 0;
  55. delay_ms(1);
  56. for (uint16_t i = 0; i < size; i++)
  57. {
  58. USART_SendData(USART_232,data[i]);
  59. while (USART_GetFlagStatus(USART_232, USART_FLAG_TXE) == RESET);
  60. }
  61. while (RESET == USART_GetFlagStatus(USART_232, USART_FLAG_TC));
  62. usartMsg.done=0;
  63. usartMsg.txBusy = 0;
  64. return 1;
  65. }
  66. // 文件更新升级
  67. uint8_t updata()
  68. {
  69. return 1;
  70. }
  71. void broad_to_host()
  72. {
  73. int i, j;
  74. result = 2;// 初始化为 2 表示操作失败(硬件故障或其他原因)
  75. // 反馈信息
  76. uint8_t txData[8];
  77. // 校验位验证信息
  78. uint8_t crc[1 + (4 * usartMsg.rxBuf[4])];
  79. // 判断帧头帧尾
  80. if(usartMsg.rxBuf[0] != 0xAA || usartMsg.rxBuf[1] != 0xFF || usartMsg.rxBuf[2] != 0x55 || usartMsg.rxBuf[3] != 0xCC|| usartMsg.rxBuf[10 + (4 * (usartMsg.rxBuf[4] - 1))] != 0xDD || usartMsg.rxBuf[11 + (4 * (usartMsg.rxBuf[4] - 1))] != 0xFF)
  81. {
  82. result = 0x04;//帧头/帧尾异常
  83. goto __feedback;
  84. }
  85. // 判断指令数
  86. if(usartMsg.rxBuf[4] < 1 || usartMsg.rxBuf[4] > 255)
  87. {
  88. result = 5;//帧内容异常(指令值超出范围等)
  89. goto __feedback;
  90. }
  91. // 判断校验位
  92. // 提取指令数
  93. crc[0] = usartMsg.rxBuf[4];
  94. // 提取指令码、channel、平台号、指令值
  95. for(j = 0; j < usartMsg.rxBuf[4] * 4;j += 4)
  96. {
  97. crc[1 + j] = usartMsg.rxBuf[5+ j];//指令码
  98. crc[2 + j] = usartMsg.rxBuf[6+ j];//channel
  99. crc[3 + j] = usartMsg.rxBuf[7+ j];//平台号
  100. crc[4 + j] = usartMsg.rxBuf[8+ j];//指令值
  101. }
  102. if((CheckXor(crc,1 + (4 * usartMsg.rxBuf[4])) != usartMsg.rxBuf[9 + (4 * (usartMsg.rxBuf[4] - 1))]))
  103. {
  104. result = 0x03;//校验位异常
  105. goto __feedback;
  106. }
  107. // 执行指令
  108. for(i = 0; i < usartMsg.rxBuf[4] * 4;i += 4)
  109. {
  110. // 判断指令码
  111. switch (usartMsg.rxBuf[5 + i])
  112. {
  113. case 0x01: // LED指令
  114. result = channel_LED(usartMsg.rxBuf[6 + i], i);
  115. if(result != 1) goto __feedback;
  116. break;
  117. case 0x02: // 12V BAT指令
  118. result = channel_12VBAT(usartMsg.rxBuf[6 + i], i);
  119. if(result != 1) goto __feedback;
  120. break;
  121. case 0x03: // 5V BAT指令 channel和平台号固定为0x00
  122. result = channel_5VBAT(usartMsg.rxBuf[8 + i]);
  123. if(result != 1)goto __feedback;
  124. break;
  125. case 0x04: // updata指令
  126. if(usartMsg.rxBuf[8] == 1)
  127. {
  128. result = updata();
  129. }
  130. break;
  131. default:
  132. result = 0x05;//帧内容异常(指令值超出范围等)
  133. goto __feedback;
  134. break;
  135. }
  136. }
  137. __feedback:
  138. txData[0] = 0xBB; // 帧头
  139. txData[1] = 0xFF; // 帧头
  140. txData[2] = 0x55; // 帧头
  141. txData[3] = 0xCC; // 帧头
  142. txData[4] = result; // 反馈值
  143. txData[5] = CheckXor(&txData[4], 1); // 校验位
  144. txData[6] = 0xEE; // 帧尾
  145. txData[7] = 0xFF; // 帧尾
  146. sendCmd(txData,8);
  147. }