usart.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. #include "usart.h"
  2. #include "mmodbus.h"
  3. #include "dlt645.h"
  4. #include "gateway_message.h"
  5. #include "tcp_server.h"
  6. #include "timer.h"
  7. #include "updata.h"
  8. uint8_t rxByte;
  9. uint8_t rx_232_Buffer[RX_BUFFER_SIZE];
  10. uint8_t recv_232_done;
  11. unsigned int rxIndex = 0;
  12. uint8_t UART6_RX_BUF[BUFF_SIZE];
  13. uint8_t UART6_RX_STAT=0;
  14. uint32_t UART6_RX_NUM = 0;
  15. UART_HandleTypeDef USART_InitStruct_485;
  16. UART_HandleTypeDef USART_InitStruct_232;
  17. UART_HandleTypeDef USART_InitStruct_DEBUG;
  18. DMA_HandleTypeDef DMA_DEBUG_RX;
  19. //重定向c库函数printf到串口,重定向后可使用printf函数
  20. int fputc(int ch, FILE *f)
  21. {
  22. /* 发送一个字节数据到串口 */
  23. USART_232->DR = (ch & (uint16_t)0x01FF);
  24. /* 等待发送完毕 */
  25. while (__HAL_UART_GET_FLAG(&USART_InitStruct_232, USART_FLAG_TXE) == RESET);
  26. return (ch);
  27. }
  28. /* 232串口配置 */
  29. void USART_232_config(void)
  30. {
  31. __HAL_RCC_GPIOA_CLK_ENABLE();
  32. __HAL_RCC_USART1_CLK_ENABLE();
  33. GPIO_InitTypeDef GPIO_InitStruct = {0};
  34. GPIO_InitStruct.Pin = USART_232_TX_PIN | USART_232_RX_PIN;
  35. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  36. GPIO_InitStruct.Pull = GPIO_PULLUP;
  37. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  38. GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  39. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  40. USART_InitStruct_232.Instance = USART_232;
  41. USART_InitStruct_232.Init.BaudRate = USART_232_BAUDRATE;
  42. USART_InitStruct_232.Init.WordLength = UART_WORDLENGTH_8B;
  43. USART_InitStruct_232.Init.StopBits = UART_STOPBITS_1;
  44. USART_InitStruct_232.Init.Parity = UART_PARITY_NONE;
  45. USART_InitStruct_232.Init.Mode = UART_MODE_TX_RX;
  46. USART_InitStruct_232.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  47. USART_InitStruct_232.Init.OverSampling = UART_OVERSAMPLING_8;
  48. HAL_UART_Init(&USART_InitStruct_232);
  49. HAL_NVIC_SetPriority(USART_232_IRQ, 1, 0);
  50. HAL_NVIC_EnableIRQ(USART_232_IRQ);
  51. // HAL_UART_Receive_IT(&USART_InitStruct_232, &rxByte, 1);
  52. __HAL_UART_ENABLE_IT(&USART_InitStruct_232, UART_IT_RXNE); // 使能接收中断
  53. __HAL_UART_ENABLE_IT(&USART_InitStruct_232, UART_IT_IDLE); // 使能空闲中断
  54. }
  55. void USART_232_IRQHandler(void){
  56. // HAL_UART_IRQHandler(&USART_InitStruct_232);
  57. if(__HAL_UART_GET_FLAG(&USART_InitStruct_232, UART_FLAG_RXNE) && __HAL_UART_GET_IT_SOURCE(&USART_InitStruct_232, UART_IT_RXNE))
  58. {
  59. rx_232_Buffer[rxIndex] = USART_InitStruct_232.Instance->DR;
  60. rxIndex++;
  61. }
  62. if (RESET != __HAL_UART_GET_FLAG(&USART_InitStruct_232, USART_FLAG_IDLE) && __HAL_UART_GET_IT_SOURCE(&USART_InitStruct_232, UART_IT_IDLE))
  63. {
  64. uint8_t i;
  65. i = USART_InitStruct_232.Instance->SR;
  66. i = USART_InitStruct_232.Instance->DR;
  67. rxIndex = 0;
  68. recv_232_done = 1;
  69. return;
  70. }
  71. USART1->DR;
  72. }
  73. void USART_232_Send(uint8_t *message,uint16_t size)
  74. {
  75. recv_232_done = 0;
  76. HAL_UART_Transmit(&USART_InitStruct_232, message,size,HAL_MAX_DELAY);
  77. }
  78. /* 485串口配置 */
  79. void USART_485_DE_init()
  80. {
  81. __HAL_RCC_GPIOC_CLK_ENABLE();
  82. GPIO_InitTypeDef GPIO_InitStruct = {0};
  83. GPIO_InitStruct.Pin = USART_485_DE_PIN;
  84. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  85. GPIO_InitStruct.Pull = GPIO_PULLUP;
  86. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  87. HAL_GPIO_Init(USART_485_DE_GPIO_PORT, &GPIO_InitStruct);
  88. }
  89. void USART_485_DE_TX()
  90. {
  91. HAL_GPIO_WritePin(USART_485_DE_GPIO_PORT,USART_485_DE_PIN,1);
  92. }
  93. void USART_485_DE_RX()
  94. {
  95. HAL_GPIO_WritePin(USART_485_DE_GPIO_PORT,USART_485_DE_PIN,0);
  96. }
  97. // 485发送数据
  98. void USART_485_Send(uint8_t *message,uint16_t size)
  99. {
  100. uint16_t i=0;
  101. USART_485_DE_TX();
  102. HAL_UART_Transmit(&USART_InitStruct_485, message, size, HAL_MAX_DELAY);
  103. USART_485_DE_RX();
  104. }
  105. // USART_485 初始化
  106. void USART_485_config()
  107. {
  108. USART_485_DE_init();
  109. __HAL_RCC_USART3_CLK_ENABLE();
  110. __HAL_RCC_GPIOC_CLK_ENABLE();
  111. GPIO_InitTypeDef GPIO_InitStruct = {0};
  112. // 配置 GPIOC Pin 11 和 10 分别作为 USART3 的 RX 和 TX 引脚
  113. GPIO_InitStruct.Pin = USART_485_RX_PIN | USART_485_TX_PIN;
  114. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  115. GPIO_InitStruct.Pull = GPIO_PULLUP;
  116. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  117. GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  118. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  119. USART_InitStruct_485.Instance = USART_485;
  120. USART_InitStruct_485.Init.BaudRate = USART_485_BAUDRATE;
  121. USART_InitStruct_485.Init.WordLength = UART_WORDLENGTH_8B;
  122. USART_InitStruct_485.Init.StopBits = UART_STOPBITS_1;
  123. USART_InitStruct_485.Init.Parity = UART_PARITY_NONE;
  124. USART_InitStruct_485.Init.Mode = UART_MODE_TX_RX; // 既支持发送也支持接收
  125. USART_InitStruct_485.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  126. USART_InitStruct_485.Init.OverSampling = UART_OVERSAMPLING_16;
  127. HAL_UART_Init(&USART_InitStruct_485);
  128. HAL_NVIC_SetPriority(USART_485_IRQ, 0, 0);
  129. HAL_NVIC_EnableIRQ(USART_485_IRQ);
  130. // 初始化 DE 引脚 接收数据
  131. HAL_GPIO_WritePin(USART_485_DE_GPIO_PORT,USART_485_DE_PIN,GPIO_PIN_RESET);
  132. // HAL_UART_Receive_IT(&USART_InitStruct_485, &rxByte, 1);
  133. __HAL_UART_ENABLE_IT(&USART_InitStruct_485, UART_IT_RXNE); // 使能接收中断
  134. __HAL_UART_ENABLE_IT(&USART_InitStruct_485, UART_IT_IDLE); // 使能空闲中断
  135. }
  136. /*
  137. * 函数名:void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint8_t parity, uint8_t flowcontrol)
  138. * 输入参数:baudrate,databits,stopbits,parity,flowcontol 串口的配置参数
  139. * 输出参数:无
  140. * 返回值:无
  141. * 函数作用:根据输入参数进行配置485串口参数
  142. */
  143. void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint8_t parity, uint8_t flowcontrol)
  144. {
  145. uint8_t wordLength;
  146. if(parity!=0)
  147. {
  148. wordLength=databits+1;
  149. }else wordLength=databits;
  150. __HAL_RCC_USART3_CLK_ENABLE();
  151. __HAL_RCC_GPIOC_CLK_ENABLE();
  152. GPIO_InitTypeDef GPIO_InitStruct = {0};
  153. // 配置 GPIOC Pin 11 和 10 分别作为 USART3 的 RX 和 TX 引脚
  154. GPIO_InitStruct.Pin = USART_485_RX_PIN | USART_485_TX_PIN;
  155. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  156. GPIO_InitStruct.Pull = GPIO_PULLUP;
  157. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  158. GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  159. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  160. USART_InitStruct_485.Instance = USART_485;
  161. USART_InitStruct_485.Init.BaudRate = USART_485_BAUDRATE;
  162. USART_InitStruct_485.Init.WordLength = UART_WORDLENGTH_8B;
  163. USART_InitStruct_485.Init.StopBits = UART_STOPBITS_1;
  164. USART_InitStruct_485.Init.Parity = UART_PARITY_NONE;
  165. USART_InitStruct_485.Init.Mode = UART_MODE_TX_RX; // 既支持发送也支持接收
  166. USART_InitStruct_485.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  167. USART_InitStruct_485.Init.OverSampling = UART_OVERSAMPLING_16;
  168. HAL_UART_Init(&USART_InitStruct_485);
  169. HAL_NVIC_SetPriority(USART_485_IRQ, 0, 0);
  170. HAL_NVIC_EnableIRQ(USART_485_IRQ);
  171. // 初始化 DE 引脚 接收数据
  172. HAL_GPIO_WritePin(USART_485_DE_GPIO_PORT,USART_485_DE_PIN,GPIO_PIN_RESET);
  173. // HAL_UART_Receive_IT(&USART_InitStruct_485, &rxByte, 1);
  174. __HAL_UART_ENABLE_IT(&USART_InitStruct_485, UART_IT_RXNE); // 使能接收中断
  175. __HAL_UART_ENABLE_IT(&USART_InitStruct_485, UART_IT_IDLE); // 使能空闲中断
  176. }
  177. void USART_485_IRQHandler(void){
  178. GATEWAY_PARAMS *get;
  179. get= get_gateway_config_params();
  180. if(get->device_params->protocol == 3)
  181. mmodbus_callback(&USART_InitStruct_485);
  182. else if(get->device_params->protocol == 1 || get->device_params->protocol == 2)
  183. dlt_callback(&USART_InitStruct_485);
  184. }
  185. void DEBUG_USART_Config(void)
  186. {
  187. GPIO_InitTypeDef GPIO_InitStruct = {0};
  188. // Enable USART6 clock
  189. __HAL_RCC_USART6_CLK_ENABLE();
  190. // Enable GPIOC clock
  191. __HAL_RCC_GPIOC_CLK_ENABLE();
  192. // Configure USART6 pins
  193. GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN | DEBUG_USART_TX_PIN;
  194. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  195. GPIO_InitStruct.Pull = GPIO_PULLUP;
  196. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  197. GPIO_InitStruct.Alternate = GPIO_AF8_USART6;// Connect USART6 pins to AF8
  198. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  199. // Configure USART6
  200. USART_InitStruct_DEBUG.Instance = DEBUG_USART;
  201. USART_InitStruct_DEBUG.Init.BaudRate = DEBUG_USART_BAUDRATE;
  202. USART_InitStruct_DEBUG.Init.WordLength = UART_WORDLENGTH_8B;
  203. USART_InitStruct_DEBUG.Init.StopBits = UART_STOPBITS_1;
  204. USART_InitStruct_DEBUG.Init.Parity = UART_PARITY_NONE;
  205. USART_InitStruct_DEBUG.Init.Mode = UART_MODE_TX_RX; // 既支持发送也支持接收
  206. USART_InitStruct_DEBUG.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  207. USART_InitStruct_DEBUG.Init.OverSampling = UART_OVERSAMPLING_16;
  208. HAL_UART_Init(&USART_InitStruct_DEBUG);
  209. HAL_NVIC_SetPriority(DEBUG_USART_IRQ, 2, 1);
  210. HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ);
  211. // Enable USART6
  212. __HAL_UART_ENABLE_IT(&USART_InitStruct_DEBUG, UART_IT_IDLE); // 使能空闲中断
  213. // __HAL_UART_ENABLE_IT(&USART_InitStruct_DEBUG, UART_IT_RXNE); // 使能接收中断
  214. __HAL_DMA_ENABLE(&DMA_DEBUG_RX); //使能DMA
  215. __HAL_UART_ENABLE(&USART_InitStruct_DEBUG);
  216. // __HAL_UART_CLEAR_FLAG(&USART_InitStruct_DEBUG, USART_FLAG_TC);
  217. }
  218. void DEBUG_USART_IRQHandler(void)
  219. {
  220. uint16_t clear;
  221. if(RESET != __HAL_UART_GET_FLAG(&USART_InitStruct_DEBUG, UART_FLAG_IDLE)) // 判断是否是空闲中断
  222. {
  223. __HAL_UART_CLEAR_IDLEFLAG(&USART_InitStruct_DEBUG); //清空空闲中断标志位
  224. //关闭DMA
  225. __HAL_DMA_DISABLE(&DMA_DEBUG_RX);
  226. // HAL_UART_DMAStop(&USART_InitStruct_DEBUG);
  227. UART6_RX_NUM = BUFF_SIZE - __HAL_DMA_GET_COUNTER(&DMA_DEBUG_RX);
  228. //清除DMA中断
  229. __HAL_DMA_CLEAR_FLAG(&DMA_DEBUG_RX,DMA_FLAG_TCIF1_5);
  230. __HAL_DMA_ENABLE(&DMA_DEBUG_RX);
  231. //接收状态置位
  232. UART6_RX_STAT=1;
  233. }
  234. }
  235. void USART_DMA_Config(void)
  236. {
  237. // 使能串口和DMA时钟
  238. __HAL_RCC_USART6_CLK_ENABLE();
  239. __HAL_RCC_DMA2_CLK_ENABLE();
  240. DMA_DEBUG_RX.Instance = DEBUG_USART_DMA_STREAM;
  241. DMA_DEBUG_RX.Init.Channel = DEBUG_USART_DMA_CHANNEL;
  242. /*方向:从外设到内存*/
  243. DMA_DEBUG_RX.Init.Direction = DMA_PERIPH_TO_MEMORY;
  244. /*外设地址不增*/
  245. DMA_DEBUG_RX.Init.PeriphInc = DMA_PINC_DISABLE;
  246. /*内存地址自增*/
  247. DMA_DEBUG_RX.Init.MemInc = DMA_MINC_ENABLE;
  248. /*外设数据单位*/
  249. DMA_DEBUG_RX.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  250. /*内存数据单位 8bit*/
  251. DMA_DEBUG_RX.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  252. /*DMA模式:不断循环*/
  253. DMA_DEBUG_RX.Init.Mode = DMA_NORMAL;
  254. /*优先级:中*/
  255. DMA_DEBUG_RX.Init.Priority = DMA_PRIORITY_MEDIUM;
  256. /*禁用FIFO*/
  257. DMA_DEBUG_RX.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  258. DMA_DEBUG_RX.Init.FIFOThreshold= DMA_FIFO_THRESHOLD_FULL;
  259. HAL_DMA_Init(&DMA_DEBUG_RX);
  260. __HAL_LINKDMA(&USART_InitStruct_DEBUG, hdmarx, DMA_DEBUG_RX);
  261. SET_BIT(USART_InitStruct_DEBUG.Instance->CR3, USART_CR3_DMAR);
  262. HAL_DMA_Start(&DMA_DEBUG_RX,DEBUG_USART_DR_BASE, (uint32_t)UART6_RX_BUF, BUFF_SIZE);
  263. __HAL_DMA_ENABLE_IT(&DMA_DEBUG_RX,DMA_IT_TC);
  264. HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 2, 2);
  265. HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
  266. }
  267. void DMA2_Stream1_IRQHandler() {
  268. if (__HAL_DMA_GET_IT_SOURCE(&DMA_DEBUG_RX,DMA_IT_TC))
  269. {
  270. __HAL_DMA_CLEAR_FLAG(&DMA_DEBUG_RX,DMA_IT_TC);
  271. }
  272. }
  273. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *husart)
  274. {
  275. // USART 232
  276. if(husart->Instance == USART_232)
  277. {
  278. if (rxIndex < RX_BUFFER_SIZE)
  279. {
  280. // 将接收到的数据存储在缓冲区中
  281. rx_232_Buffer[rxIndex] = rxByte;
  282. rxIndex++;
  283. }
  284. HAL_UART_Transmit(husart, rx_232_Buffer,rxIndex,HAL_MAX_DELAY);
  285. memset(rx_232_Buffer, 0, rxIndex);
  286. rxIndex = 0;
  287. HAL_UART_Receive_IT(husart, &rxByte, 1);
  288. }
  289. // USART 485
  290. if(husart->Instance == USART_485)
  291. {
  292. if (rxIndex < RX_BUFFER_SIZE)
  293. {
  294. // 将接收到的数据存储在缓冲区中
  295. rx_232_Buffer[rxIndex] = rxByte;
  296. rxIndex++;
  297. }
  298. memset(rx_232_Buffer, 0, rxIndex);
  299. rxIndex = 0;
  300. HAL_UART_Receive_IT(husart, &rxByte, 1);
  301. }
  302. if(husart->Instance == USART6)
  303. {
  304. }
  305. }
  306. /* 上位机功能 */
  307. // 储存上位机发送的config数据,并返回上位机操作结果
  308. void save_config_232(uint8_t* buf)
  309. {
  310. char* saveData = mymalloc(SRAMEX,20 * 1024);//(RECV_BUF_SIZE);// 存储config数据 最大20K,暂定3K
  311. if(saveData == NULL)
  312. LogPrint(LOG_ERROR,__FILE__,__FUNCTION__,__LINE__,"recv buf malloc fail");
  313. memset(saveData,0,strlen(saveData));
  314. // 插入tcp_config标志位,后续不通过http获取默认配置数据
  315. sprintf(saveData, "tcp_config");
  316. sprintf(saveData + strlen(saveData),"%s",buf);
  317. DeleteDirFile("device.txt");
  318. write_file("device.txt",saveData,strlen(saveData));// 储存到flash 不用判断失败
  319. myfree(SRAMEX, saveData);
  320. char* retMsg = mymalloc(SRAMEX,32);
  321. memset(retMsg, 0, strlen(retMsg));
  322. retMsg = "{\"write_config\":\"success\"}";
  323. USART_232_Send((uint8_t*)retMsg, strlen(retMsg));
  324. myfree(SRAMEX ,retMsg);
  325. }
  326. void read_device_params(char* device_params)
  327. {
  328. GATEWAY_PARAMS *get;
  329. get= get_gateway_config_params();
  330. DEVICE_PARAMS *current_device=get->device_params;
  331. sprintf(device_params, "{\"read_config\":\"success\",\"baudrate\":%d,\"checkBit\":%d,\"commandTopic\":\"%s\",\"dataBit\":%d,\
  332. \"deviceId\":\"%s\",\"host\":\"%s\",\"inboundTime\":%d,\"messageTopic\":\"%s\",\"port\":%d,\"stopBit\":%d,\"deviceList\":[",get->baudrate,
  333. get->checkBit,get->commandTopic,get->dataBits,get->deviceId,get->host,get->inboundTime,get->messageTopic,get->port,get->stopBit);
  334. while(current_device != NULL)
  335. {
  336. sprintf(device_params + strlen(device_params),"{\"protocol\":%d,\"bigLittleFormat\":%d,\"deviceId\":\"%s\",\"sensorData\":[",
  337. current_device->protocol,current_device->MDBbigLittleFormat,current_device->deviceID);
  338. GATEWAY_READ_DLT645_COMMAND *read_dlt645_command = current_device->params->gateway_read_dlt645_command;
  339. GATEWAY_READ_MODBUS_COMMAND *read_modbus_command = current_device->params->gateway_read_modbus_command;
  340. GATEWAY_WRITE_MODBUS_COMMAND *write_modbus_command = current_device->params->gateway_write_modbus_command;
  341. // dlt645 read
  342. while(read_dlt645_command != NULL)
  343. {
  344. sprintf(device_params + strlen(device_params),"{\"identifier645\":%d,\"identifier\":\"%s\",\"deviceID645\":\"%s\"},",
  345. read_dlt645_command->Identification,read_dlt645_command->keyword,read_dlt645_command->deviceID645);
  346. read_dlt645_command = read_dlt645_command->nextParams;
  347. }
  348. // modbus read
  349. while(read_modbus_command != NULL)
  350. {
  351. sprintf(device_params + strlen(device_params),"{\"rFunctionCode\":%d,\"registerAddress\":%d,\"slaveAddress\":%d,\"registerByteNum\":%d,\"identifier\":\"%s\",\"precise\":%d},",
  352. read_modbus_command->functionCode, read_modbus_command->registerAddress,read_modbus_command->slaveAddress,
  353. read_modbus_command->registerByteNum,read_modbus_command->keyword,read_modbus_command->decimalPoint);
  354. read_modbus_command = read_modbus_command->nextParams;
  355. }
  356. // modbus write
  357. sprintf(device_params + strlen(device_params)-1,"], \"commandData\":[");//sensorData:[
  358. while(write_modbus_command != NULL)
  359. {
  360. sprintf(device_params + strlen(device_params),"{\"registerAddress\":%d,\"slaveAddress\":%d,\"wFunctionCode\":%d,\"registerByteNum\":%d},",
  361. write_modbus_command->registerAddress,write_modbus_command->slaveAddress,write_modbus_command->functionCode,write_modbus_command->registerByteNum);
  362. write_modbus_command = write_modbus_command->nextParams;
  363. }
  364. sprintf(device_params + strlen(device_params)-1,"]},");// commandData:[
  365. current_device = current_device->nextDevice;
  366. }
  367. sprintf(device_params + strlen(device_params) -1 ,"]}");
  368. }
  369. void read_config_232(void)
  370. {
  371. GATEWAY_PARAMS *get;
  372. get= get_gateway_config_params();
  373. char* device_params = mymalloc(SRAMEX, 3 * 1024);
  374. memset(device_params,0,3 * 1024);
  375. if(get->device_params == NULL)
  376. {
  377. sprintf(device_params, "{\"read_config\":\"error\"}");
  378. USART_232_Send((uint8_t*)device_params, strlen(device_params));
  379. }
  380. else
  381. {
  382. read_device_params(device_params);
  383. USART_232_Send((uint8_t*)device_params, strlen(device_params));
  384. }
  385. myfree(SRAMEX, device_params);
  386. }
  387. // 设备嗅探
  388. void find_device_232(void)
  389. {
  390. char deviceId[50];// 发送设备名
  391. GATEWAY_PARAMS *get;
  392. get= get_gateway_config_params();
  393. if(get->device_params == NULL)
  394. {
  395. // sprintf(deviceId, "{\"find_device\":\"%s\"}", gatewayId);
  396. sprintf(deviceId, "{\"find_device\":\"error\"}");
  397. USART_232_Send((uint8_t*)deviceId, strlen(deviceId));
  398. }
  399. else
  400. {
  401. sprintf(deviceId, "{\"find_device\":\"%s\"}", get->deviceId);
  402. USART_232_Send((uint8_t*)deviceId, strlen(deviceId));
  403. }
  404. memset(deviceId, 0, 50);
  405. }
  406. // 储存上位机发送的config_add数据,并返回上位机操作结果
  407. void add_config_232(uint8_t* dataBuf)
  408. {
  409. GATEWAY_PARAMS *get;
  410. get= get_gateway_config_params();
  411. DEVICE_PARAMS *device=get->device_params;
  412. char* retMsg = mymalloc(SRAMEX,32);
  413. memset(retMsg, 0, strlen(retMsg));
  414. while(device != NULL)// 一直轮询到当前为NULL
  415. {
  416. device = device->nextDevice;
  417. }
  418. addDevice((char*)dataBuf);
  419. // 再检查更新后的deviceId是否为NULL
  420. if(device == NULL)// error
  421. {
  422. retMsg = "{\"write_config\":\"error\"}";
  423. USART_232_Send((uint8_t*)retMsg, strlen(retMsg));
  424. }
  425. else// success
  426. {
  427. retMsg = "{\"write_config\":\"success\"}";
  428. USART_232_Send((uint8_t*)retMsg, strlen(retMsg));
  429. }
  430. myfree(SRAMEX, retMsg);
  431. }
  432. // 切换工作模式
  433. void work_mode_232(uint8_t* buf)
  434. {
  435. /* 用标志位开关data_task任务中,发送数据的方式 */
  436. // 内置协议模式
  437. if(strstr((char*)buf,"protocolsMode") != NULL)
  438. {
  439. ProtocolsModeFlag = 1;// 开启内置协议模式
  440. TransparentModeFlag = 0; // 关闭透明传输模式
  441. LogPrint(LOG_INFO,__FILE__,__FUNCTION__,__LINE__,"ProtocolsMode");
  442. }
  443. // 透明传输模式
  444. if(strstr((char*)buf,"TransparentMode") != NULL)
  445. {
  446. ProtocolsModeFlag = 0;// 关闭内置协议模式
  447. TransparentModeFlag = 1; // 开启透明传输模式
  448. LogPrint(LOG_INFO,__FILE__,__FUNCTION__,__LINE__,"TransparentModeFlag");
  449. }
  450. }
  451. // 更新OTA数据
  452. void updata_232(void)
  453. {
  454. int recv_size, i;
  455. uint16_t crc;
  456. uint8_t databuf[1024];// 保存包数据
  457. uint16_t packId = 0x01;
  458. uint8_t stx = 0x02,eot = 0x04,ack = 0x06,nak = 0x15,C = 0x43;
  459. // 向上位机发送就绪信号
  460. char* retMsg = mymalloc(SRAMEX,32);
  461. memset(retMsg, 0, strlen(retMsg));
  462. retMsg = "{\"software_update\":\"ready\"}";
  463. USART_232_Send((uint8_t*)retMsg, strlen(retMsg));
  464. myfree(SRAMEX, retMsg);
  465. memset(rx_232_Buffer, 0, strlen(rx_232_Buffer));
  466. delay_ms(300);
  467. // 发送第一个C
  468. USART_232_Send(&C, 1);
  469. delay_ms(300);
  470. __start:
  471. i = 0;
  472. //等待接收到消息,最长等待3S
  473. while(recv_232_done == 0 && i < 3000)
  474. {
  475. delay_ms(1);
  476. i++;
  477. }
  478. if(recv_232_done == 0) USART_232_Send(&C, 1);//如果还没接收到消息,再发送一个C
  479. do{
  480. // 接收到结束信号,反馈ack
  481. if(rx_232_Buffer[0] == eot)
  482. {
  483. USART_232_Send(&ack, 1);
  484. delay_ms(300);
  485. break;
  486. }
  487. // 检测头标志
  488. if(rx_232_Buffer[0] != stx)
  489. {
  490. USART_232_Send(&nak, 1);
  491. delay_ms(300);
  492. goto __start;
  493. }
  494. // 检测包序列
  495. if(rx_232_Buffer[1] != packId)
  496. {
  497. USART_232_Send(&nak, 1);
  498. delay_ms(300);
  499. goto __start;
  500. }
  501. // 检测包号反码
  502. if(rx_232_Buffer[2] !=(~packId & 0xff))
  503. {
  504. USART_232_Send(&nak, 1);
  505. delay_ms(300);
  506. goto __start;
  507. }
  508. // 提取数据包
  509. for(int i = 0; i < 1024; i++)
  510. {
  511. databuf[i] = rx_232_Buffer[3 + i];
  512. }
  513. crc = Checkcrc16(databuf, 1024);
  514. // 检测数据包的校验码
  515. if (((crc & 0x00FF) != rx_232_Buffer[1028]) || (((crc & 0xFF00) >> 8) != rx_232_Buffer[1027]))
  516. {
  517. USART_232_Send(&nak, 1);
  518. delay_ms(300);
  519. goto __start;
  520. }
  521. // 对数据包进行操作
  522. /* */
  523. memset(databuf, 0, sizeof(databuf));
  524. // 准备接收下一包数据
  525. USART_232_Send(&ack, 1);
  526. delay_ms(300);
  527. packId += 1;
  528. }while(recv_232_done);
  529. // 所有数据包接受完成,准备重启
  530. __set_PRIMASK(1);
  531. NVIC_SystemReset();
  532. }
  533. void USART_232_task(void const * argument)
  534. {
  535. int j;
  536. char* recv_cmd[] = {"\"cmd\":\"write_config\"","\"cmd\":\"write_config_add\"",
  537. "\"cmd\":\"read_config\"","\"cmd\":\"find_device\"",
  538. "\"cmd\":\"ip_config\"","\"cmd\":\"toggle_work_mode\"",
  539. "\"cmd\":\"software_update\"","\"cmd\":\"reboot\"",
  540. "\"cmd\":\"cmd error\"" };
  541. while(1)
  542. {
  543. j = 0;
  544. for(int i = 0; i < sizeof(recv_cmd)/sizeof(recv_cmd[0]); i++)
  545. {
  546. if(strstr((char*)rx_232_Buffer,recv_cmd[i]) != NULL)
  547. {
  548. i = sizeof(recv_cmd)/sizeof(recv_cmd[0]);
  549. }
  550. j++;
  551. }
  552. if (ProtocolsModeFlag) {
  553. switch (j) {
  554. case WRITE_CONFIG:
  555. save_config_232(rx_232_Buffer);
  556. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "write config");
  557. __set_PRIMASK(1);
  558. NVIC_SystemReset();
  559. break;
  560. case WRITE_CONFIG_ADD:
  561. add_config_232(rx_232_Buffer);
  562. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "write config add");
  563. break;
  564. case READ_CONFIG:
  565. read_config_232();
  566. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "read config");
  567. break;
  568. case FIND_DEVICE:
  569. find_device_232();
  570. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "find device");
  571. break;
  572. case TOGGLE_MODE:
  573. work_mode_232(rx_232_Buffer);
  574. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "toggle work mode");
  575. break;
  576. case UPDATE:
  577. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "update");
  578. updata_232();
  579. break;
  580. case REBOOT:
  581. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "reboot");
  582. __set_PRIMASK(1);
  583. NVIC_SystemReset();
  584. break;
  585. case CMD_ERROR:
  586. goto __exit;
  587. }
  588. } else {
  589. switch (j) {
  590. case FIND_DEVICE:
  591. find_device_232();
  592. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "find device");
  593. break;
  594. case TOGGLE_MODE:
  595. work_mode_232(rx_232_Buffer);
  596. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "toggle work mode");
  597. break;
  598. case UPDATE:
  599. updata_232();
  600. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "update");
  601. break;
  602. case REBOOT:
  603. LogPrint(LOG_INFO, __FILE__, __FUNCTION__, __LINE__, "reboot");
  604. __set_PRIMASK(1);
  605. NVIC_SystemReset();
  606. break;
  607. case CMD_ERROR:
  608. goto __exit;
  609. }
  610. }
  611. memset(rx_232_Buffer, 0, strlen(rx_232_Buffer));
  612. __exit:
  613. vTaskDelay(500);
  614. }
  615. }
  616. void USART_232_task_creat()
  617. {
  618. osThreadDef(USART_task, USART_232_task, osPriorityNormal, 0, configMINIMAL_STACK_SIZE*4);
  619. osThreadCreate(osThread(USART_task), NULL);
  620. }
  621. /*********************************************END OF FILE**********************/