rs485.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-09-10 RuoFeng the first version
  9. */
  10. /*********************↓ define ↓************************/
  11. #define DBG_ENABLE
  12. #define DBG_COLOR
  13. #define DBG_TAG "rs"
  14. #define DBG_LEVEL DBG_LOG
  15. #include <rtdbg.h>
  16. #define LOG_INR 10 // 默认的log打印间隔(作用域在本文件)
  17. /*********************↑ define ↑************************/
  18. /**
  19. *
  20. *
  21. *
  22. *
  23. * */
  24. /*********************↓ include ↓************************/
  25. #include "rs485.h"
  26. // #include "test.h"
  27. #include "string.h"
  28. #include "control.h"
  29. #include <Work_SY2.h>
  30. #include <easyflash.h>
  31. /*********************↑ include ↑************************/
  32. /**
  33. *
  34. *
  35. *
  36. *
  37. * */
  38. /*********************↓ extern ↓************************/
  39. extern void HMI_WRITE(char *fmt, ...);
  40. extern uint8_t ef_cfged;
  41. extern Limit limit;
  42. extern Device_Status_typedef device_status;
  43. extern SYSCFG syscfg;
  44. extern void Get_SunTime(void);
  45. extern void CollFanSetPWM(uint8_t percent);
  46. /*********************↑ extern ↑************************/
  47. /**
  48. *
  49. *
  50. *
  51. *
  52. * */
  53. /********************↓ declaration ↓***********************/
  54. /********************↑ declaration ↑***********************/
  55. /**
  56. *
  57. *
  58. *
  59. *
  60. * */
  61. /*********************↓ global variables ↓************************/
  62. UART_HandleTypeDef huart5;
  63. uint8_t aRxBuffer[6] = {0};
  64. uint8_t rs_buf_cnt = 0;
  65. uint8_t rs_buf_fis = 0;
  66. uint8_t rs_buf[rs_buf_max] = {0};
  67. Sensor sensor[MAX_SENSOR_NUM] = {0};
  68. uint16_t Read_data[MAX_SENSOR_NUM * 2] = {0};
  69. volatile uint8_t sex_enread = 0;
  70. uint8_t up_time = 0;
  71. uint8_t up_limit = 0;
  72. /*********************↑ global variables ↑************************/
  73. /**
  74. *
  75. *
  76. *
  77. *
  78. * */
  79. /**
  80. * @brief 清缓存
  81. *
  82. */
  83. void clear_rsbuf(void)
  84. {
  85. rs_buf_fis = 0;
  86. rs_buf_cnt = 0;
  87. memset(rs_buf, 0, sizeof(rs_buf));
  88. }
  89. /**
  90. * @brief 纯手工crc16算法 冰冰凉 嘎嘎好使
  91. *
  92. * @param data 数据位
  93. * @param len 长度
  94. * @return unsigned int CRC
  95. */
  96. unsigned int ModBusCRC16(unsigned char *data, unsigned int len)
  97. {
  98. unsigned int i, j, tmp, CRC16;
  99. CRC16 = 0xFFFF; // CRC寄存器初始值
  100. for (i = 0; i < len; i++)
  101. {
  102. CRC16 ^= data[i];
  103. for (j = 0; j < 8; j++)
  104. {
  105. tmp = (unsigned int)(CRC16 & 0x0001);
  106. CRC16 >>= 1;
  107. if (tmp == 1)
  108. {
  109. CRC16 ^= 0xA001; // 异或多项式
  110. }
  111. }
  112. }
  113. i = (CRC16 & 0x00FF) << 8; // 反向
  114. CRC16 = (CRC16 & 0xFF00) >> 8;
  115. CRC16 |= i;
  116. return CRC16;
  117. }
  118. /*
  119. *********************************************************************************************************
  120. * 函 数 名: BEBufToUint16
  121. * 功能说明: 将2字节数组(大端Big Endian次序,高字节在前)转换为16位整数
  122. * 形 参: _pBuf : 数组
  123. * 返 回 值: 16位整数值
  124. *
  125. * 大端(Big Endian)与小端(Little Endian)
  126. *********************************************************************************************************
  127. */
  128. uint16_t BEBufToUint16(uint8_t *_pBuf)
  129. {
  130. return (((uint16_t)_pBuf[0] << 8) | _pBuf[1]);
  131. }
  132. /**
  133. * @brief 读03寄存器
  134. *
  135. * @param slaveAddr 地址
  136. * @param _reg 起始
  137. * @param _num 长度
  138. * @param sort 页码
  139. * @return Res_def 结果
  140. */
  141. Res_def MODH_ReadParam_03H(uint8_t slaveAddr, uint16_t _reg, uint16_t _num, uint8_t sort)
  142. {
  143. uint8_t buf[8] = {0};
  144. if (slaveAddr == 0 || slaveAddr > 255)
  145. {
  146. return res_Error;
  147. }
  148. buf[0] = slaveAddr;
  149. buf[1] = 0x03;
  150. buf[2] = (uint8_t)(_reg >> 8);
  151. buf[3] = (uint8_t)(_reg & 0xFF);
  152. buf[4] = (uint8_t)(_num >> 8);
  153. buf[5] = (uint8_t)(_num & 0xFF);
  154. buf[6] = (uint8_t)(ModBusCRC16(buf, 6) >> 8);
  155. buf[7] = (uint8_t)(ModBusCRC16(buf, 6) & 0xFF);
  156. RS485_SEND(buf, 8);
  157. rt_thread_mdelay(390);
  158. if (rs_buf_fis != 1 || rs_buf_cnt < 6)
  159. {
  160. clear_rsbuf();
  161. return res_Timeout;
  162. }
  163. uint16_t CRC16 = ModBusCRC16(rs_buf, rs_buf_cnt - 2);
  164. if (CRC16 != (uint16_t)(rs_buf[rs_buf_cnt - 2] << 8 | rs_buf[rs_buf_cnt - 1]))
  165. {
  166. clear_rsbuf();
  167. rt_kprintf("CRC Check faild > %04X %02X%02X", CRC16, rs_buf[rs_buf_cnt - 2], rs_buf[rs_buf_cnt - 1]);
  168. return res_Verifi;
  169. }
  170. if (rs_buf[0] != sensor[sort].sensor_addr)
  171. {
  172. clear_rsbuf();
  173. rt_kprintf("SAddr check failed > %d - %d\n", rs_buf[0], sensor[sort].sensor_addr);
  174. return res_Verifi;
  175. }
  176. uint8_t *p;
  177. p = &rs_buf[3];
  178. if (rs_buf[2] == sensor[sort].count * 2 || 1)
  179. {
  180. for (uint8_t a = 1; a <= rs_buf[2]; a++)
  181. {
  182. if (a % 2 == 0)
  183. {
  184. Read_data[(a / 2) - 1] = BEBufToUint16(p);
  185. p += 2;
  186. }
  187. }
  188. }
  189. else
  190. {
  191. rt_kprintf("Return cnt check fail > %d \n", rs_buf[2]);
  192. return res_Verifi;
  193. }
  194. clear_rsbuf();
  195. return res_OK;
  196. }
  197. /**
  198. * @brief 获取数值的位数
  199. *
  200. * @param val 数值
  201. * @return uint8_t 返回位数
  202. */
  203. uint8_t GetValueLen(int32_t val)
  204. {
  205. uint8_t cnt = 1;
  206. int32_t m = val;
  207. while (m > 9)
  208. {
  209. m /= 10;
  210. cnt++;
  211. }
  212. // rt_kprintf("%d is %d len\n",val , cnt);
  213. return cnt;
  214. }
  215. /**
  216. * @brief 给定val和factor 生成eval
  217. *
  218. * @param val 原始数据
  219. * @param factor 因数
  220. * @param eval eval的指针
  221. */
  222. void GenerateValue(int16_t val, int factor, char *eval)
  223. {
  224. // rt_kprintf("val %d \n", val);
  225. if (val == 0x7FFF)
  226. {
  227. rt_sprintf(eval, "-99.99");
  228. return;
  229. }
  230. if (factor > 0)
  231. {
  232. rt_sprintf((char *)eval, "%d", val * factor);
  233. }
  234. else if (factor < 0)
  235. {
  236. switch (GetValueLen(abs(factor)))
  237. {
  238. // 当负的单位数 不做处理
  239. case 1:
  240. {
  241. }
  242. break;
  243. // 当负的两位数 例如-10
  244. case 2:
  245. {
  246. if (val >= 0)
  247. {
  248. rt_sprintf((char *)eval, "%d.%01d", val / abs(factor), val % abs(factor));
  249. }
  250. else
  251. {
  252. rt_sprintf((char *)eval, "-%d.%01d", abs(val) / abs(factor), abs(val) % abs(factor));
  253. }
  254. }
  255. break;
  256. // 当负的三位数 例如-100
  257. case 3:
  258. {
  259. if (val >= 0)
  260. {
  261. rt_sprintf((char *)eval, "%d.%02d", val / abs(factor), val % abs(factor));
  262. }
  263. else
  264. {
  265. rt_sprintf((char *)eval, "-%d.%02d", abs(val) / abs(factor), abs(val) % abs(factor));
  266. }
  267. }
  268. break;
  269. // 当负的四位数 例如-1000 //flash不够了 4位小数先不考虑
  270. case 4:
  271. {
  272. if (val >= 0)
  273. {
  274. rt_sprintf((char *)eval, "%d.%03d", val / abs(factor), val % abs(factor));
  275. }
  276. else
  277. {
  278. rt_sprintf((char *)eval, "-%d.%03d", abs(val) / abs(factor), abs(val) % abs(factor));
  279. }
  280. }
  281. break;
  282. default:
  283. break;
  284. }
  285. }
  286. // 不对factor == 0的情况做处理
  287. // rt_kprintf("Gen %s\n",eval);
  288. }
  289. /**
  290. * @brief 给定val和factor 生成eval
  291. *
  292. * @param val 原始数据
  293. * @param factor 因数
  294. * @param eval eval的指针
  295. */
  296. void GenerateValue_32(int32_t val, int factor, char *eval)
  297. {
  298. // rt_kprintf("val %d \n", val);
  299. if (val == 0x7FFF)
  300. {
  301. rt_sprintf(eval, "-99.99");
  302. return;
  303. }
  304. if (factor > 0)
  305. {
  306. rt_sprintf((char *)eval, "%d", val * factor);
  307. }
  308. else if (factor < 0)
  309. {
  310. switch (GetValueLen(abs(factor)))
  311. {
  312. // 当负的单位数 不做处理
  313. case 1:
  314. {
  315. }
  316. break;
  317. // 当负的两位数 例如-10
  318. case 2:
  319. {
  320. if (val >= 0)
  321. {
  322. rt_sprintf((char *)eval, "%d.%01d", val / abs(factor), val % abs(factor));
  323. }
  324. else
  325. {
  326. rt_sprintf((char *)eval, "-%d.%01d", abs(val) / abs(factor), abs(val) % abs(factor));
  327. }
  328. }
  329. break;
  330. // 当负的三位数 例如-100
  331. case 3:
  332. {
  333. if (val >= 0)
  334. {
  335. rt_sprintf((char *)eval, "%d.%02d", val / abs(factor), val % abs(factor));
  336. }
  337. else
  338. {
  339. rt_sprintf((char *)eval, "-%d.%02d", abs(val) / abs(factor), abs(val) % abs(factor));
  340. }
  341. }
  342. break;
  343. // 当负的四位数 例如-1000 //flash不够了 4位小数先不考虑
  344. case 4:
  345. {
  346. if (val >= 0)
  347. {
  348. rt_sprintf((char *)eval, "%d.%03d", val / abs(factor), val % abs(factor));
  349. }
  350. else
  351. {
  352. rt_sprintf((char *)eval, "-%d.%03d", abs(val) / abs(factor), abs(val) % abs(factor));
  353. }
  354. }
  355. break;
  356. default:
  357. break;
  358. }
  359. }
  360. // 不对factor == 0的情况做处理
  361. // rt_kprintf("Gen %s\n",eval);
  362. }
  363. /**
  364. *
  365. *
  366. * READ_MODBUS_DATA_1()
  367. * 该函数可根据sensor中存放的传感器参数 自动进行解析和运算
  368. * 并将结果组包为字符串 存于sensor[a].eValue
  369. * 若读取失败 evalue使用 -99.99填充 平台显示N/A
  370. *
  371. *
  372. */
  373. int8_t READ_MODBUS_DATA_1(Sensor_Read_Type srt)
  374. {
  375. uint16_t log_en_inr = LOG_INR; // 打印log的速度 数值越小 打印越频繁
  376. static int16_t log_en_cnt = -1;
  377. if (srt >= s_TypeMAX)
  378. {
  379. return -1;
  380. }
  381. int8_t res = 0;
  382. uint8_t en_log = 0;
  383. if (chk_log_time)
  384. {
  385. en_log = 1;
  386. }
  387. if (srt == s_ALL)
  388. {
  389. for (uint8_t a = 0; a < MAX_SENSOR_NUM; a++)
  390. {
  391. if (sensor[a].cfged == 1)
  392. {
  393. sensor[a].value = 0;
  394. // rt_kprintf("start Read %s\n" , sensor[a].eName);
  395. if (sensor[a].online == 0)
  396. {
  397. rt_sprintf(sensor[a].eValue, "-99.99");
  398. }
  399. if (MODH_ReadParam_03H(sensor[a].sensor_addr, sensor[a].start_reg, sensor[a].count, a) == res_OK)
  400. {
  401. // rt_kprintf("res %X \n", Read_data[0]);
  402. for (uint8_t b = 0; b < sensor[a].d_length; b++)
  403. {
  404. sensor[a].value += Read_data[sensor[a].d_pos + b] << ((sensor[a].d_length - 1 - b) * 16);
  405. }
  406. memset(sensor[a].eValue, 0, sizeof(sensor[a].eValue));
  407. // 使用新算法对eval进行生成
  408. if (sensor[a].d_length == 1)
  409. {
  410. GenerateValue(sensor[a].value, sensor[a].factor, (char *)sensor[a].eValue); // 16位整型
  411. }
  412. else
  413. {
  414. GenerateValue_32(sensor[a].value, sensor[a].factor, (char *)sensor[a].eValue); // 32位整型
  415. }
  416. if (en_log)
  417. rt_kprintf("%s %s / ", sensor[a].eName, sensor[a].eValue);
  418. sensor[a].online = 3;
  419. res++;
  420. }
  421. else
  422. {
  423. if (en_log)
  424. rt_kprintf("s%d %s × ", a, sensor[a].eName);
  425. if (sensor[a].online > 0)
  426. {
  427. sensor[a].online--;
  428. rt_kprintf("%s -- \n", sensor[a].eName);
  429. }
  430. }
  431. }
  432. rt_thread_mdelay(5000); // 每个要素结束的间隔
  433. memset(Read_data, 0, sizeof(Read_data));
  434. }
  435. }
  436. else
  437. {
  438. //rt_kprintf("srt = %d \n" , srt);
  439. if (sensor[srt].cfged == 1)
  440. {
  441. sensor[srt].value = 0;
  442. if (MODH_ReadParam_03H(sensor[srt].sensor_addr, sensor[srt].start_reg, sensor[srt].count, srt) == res_OK)
  443. //if (MODH_ReadParam_03H(1, 1, 2, 5) == res_OK)
  444. {
  445. rt_sprintf(sensor[srt].eValue, "-99.99");
  446. for (uint8_t b = 0; b < sensor[srt].d_length; b++)
  447. {
  448. sensor[srt].value += Read_data[sensor[srt].d_pos + b] << ((sensor[srt].d_length - 1 - b) * 16);
  449. }
  450. memset(sensor[srt].eValue, 0, sizeof(sensor[srt].eValue));
  451. // 使用新算法对eval进行生成
  452. if (sensor[srt].d_length == 1)
  453. {
  454. GenerateValue(sensor[srt].value, sensor[srt].factor, (char *)sensor[srt].eValue); // 16位整型
  455. }
  456. else
  457. {
  458. GenerateValue_32(sensor[srt].value, sensor[srt].factor, (char *)sensor[srt].eValue); // 32位整型
  459. }
  460. rt_kprintf("√ s%d %s %s kg\n\n", srt, sensor[srt].eName, sensor[srt].eValue);
  461. sensor[srt].online = 1;
  462. }
  463. else
  464. {
  465. rt_kprintf("s%d %s × \n\n", srt, sensor[srt].eName);
  466. sensor[srt].online = 0;
  467. res = 0;
  468. }
  469. }
  470. rt_thread_mdelay(1000); // 每个要素结束的间隔
  471. memset(Read_data, 0, sizeof(Read_data));
  472. }
  473. rt_kprintf("\n");
  474. return res;
  475. }
  476. void RS485_SEND(uint8_t *buf, uint16_t size)
  477. {
  478. //rt_kprintf("RS485_SEND %d > %02X %02X %02X %02X %02X %02X %02X %02X\n\n" , size,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
  479. HAL_UART_Transmit(&huart5, buf, size, 1000);
  480. }
  481. /* UART5 init function */
  482. void MX_UART5_Init(void)
  483. {
  484. /* USER CODE BEGIN UART5_Init 0 */
  485. __HAL_RCC_GPIOC_CLK_ENABLE();
  486. __HAL_RCC_GPIOD_CLK_ENABLE();
  487. /* USER CODE END UART5_Init 0 */
  488. /* USER CODE BEGIN UART5_Init 1 */
  489. /* USER CODE END UART5_Init 1 */
  490. huart5.Instance = UART5;
  491. huart5.Init.BaudRate = 9600;
  492. huart5.Init.WordLength = UART_WORDLENGTH_8B;
  493. huart5.Init.StopBits = UART_STOPBITS_1;
  494. huart5.Init.Parity = UART_PARITY_NONE;
  495. huart5.Init.Mode = UART_MODE_TX_RX;
  496. huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  497. huart5.Init.OverSampling = UART_OVERSAMPLING_16;
  498. if (HAL_UART_Init(&huart5) != HAL_OK)
  499. {
  500. rt_kprintf("HAL_UART_Init(&huart5) failed\n");
  501. Error_Handler();
  502. }
  503. /* USER CODE BEGIN UART5_Init 2 */
  504. // rt_kprintf("MX_UART5_Init\n");
  505. /* USER CODE END UART5_Init 2 */
  506. }
  507. void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle)
  508. {
  509. GPIO_InitTypeDef GPIO_InitStruct = {0};
  510. if (uartHandle->Instance == UART5)
  511. {
  512. /* USER CODE BEGIN UART5_MspInit 0 */
  513. /* USER CODE END UART5_MspInit 0 */
  514. /* UART5 clock enable */
  515. __HAL_RCC_UART5_CLK_ENABLE();
  516. __HAL_RCC_GPIOC_CLK_ENABLE();
  517. __HAL_RCC_GPIOD_CLK_ENABLE();
  518. /**UART5 GPIO Configuration
  519. PC12 ------> UART5_TX
  520. PD2 ------> UART5_RX
  521. */
  522. GPIO_InitStruct.Pin = GPIO_PIN_12;
  523. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  524. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  525. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  526. GPIO_InitStruct.Pin = GPIO_PIN_2;
  527. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  528. GPIO_InitStruct.Pull = GPIO_NOPULL;
  529. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  530. /* UART5 interrupt Init */
  531. HAL_NVIC_SetPriority(UART5_IRQn, 0, 0);
  532. HAL_NVIC_EnableIRQ(UART5_IRQn);
  533. __HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);
  534. __HAL_UART_ENABLE(&huart5);
  535. HAL_UART_Receive_IT(&huart5, &aRxBuffer[3], 1);
  536. /* USER CODE END UART5_MspInit 1 */
  537. // rt_kprintf("HAL_UART_MspInit\n");
  538. }
  539. }
  540. void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle)
  541. {
  542. if (uartHandle->Instance == UART5)
  543. {
  544. /* USER CODE BEGIN UART5_MspDeInit 0 */
  545. /* USER CODE END UART5_MspDeInit 0 */
  546. /* Peripheral clock disable */
  547. __HAL_RCC_UART5_CLK_DISABLE();
  548. /**UART5 GPIO Configuration
  549. PC12 ------> UART5_TX
  550. PD2 ------> UART5_RX
  551. */
  552. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12);
  553. HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
  554. /* UART5 interrupt Deinit */
  555. HAL_NVIC_DisableIRQ(UART5_IRQn);
  556. /* USER CODE BEGIN UART5_MspDeInit 1 */
  557. /* USER CODE END UART5_MspDeInit 1 */
  558. }
  559. }
  560. /**
  561. * @brief This function handles UART5 global interrupt.
  562. */
  563. void UART5_IRQHandler(void)
  564. {
  565. if ((__HAL_UART_GET_FLAG(&huart5, UART_FLAG_ORE) != RESET))
  566. {
  567. __HAL_UART_CLEAR_OREFLAG(&huart5); // 清除标志位
  568. HAL_UART_Receive_IT(&huart5, &aRxBuffer[3], 1);
  569. }
  570. __HAL_UART_DISABLE_IT(&huart5, UART_IT_IDLE);
  571. if ((__HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE) != RESET)) // idle标志被置位
  572. {
  573. rs_buf_fis = 1; // 接收1帧
  574. __HAL_UART_CLEAR_IDLEFLAG(&huart5); // 清除标志位
  575. }
  576. __HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);
  577. HAL_UART_IRQHandler(&huart5);
  578. }
  579. /**
  580. * @brief Get the sensor num object
  581. *
  582. * @param cmd
  583. * @return Sensor_Read_Type
  584. */
  585. Sensor_Read_Type get_sensor_num(char *cmd)
  586. {
  587. if (strstr(cmd, stemp) != NULL)
  588. {
  589. return s_Temp;
  590. }
  591. if (strstr(cmd, humi) != NULL)
  592. {
  593. return s_Humi;
  594. }
  595. if (strstr(cmd, airpre) != NULL)
  596. {
  597. return s_Airpre;
  598. }
  599. if (strstr(cmd, lux) != NULL)
  600. {
  601. return s_Lux;
  602. }
  603. if (strstr(cmd, rain) != NULL)
  604. {
  605. return s_Rain;
  606. }
  607. return s_ALL;
  608. }
  609. #include "test.h"
  610. extern char Demo_Mode_NEW;
  611. /**
  612. * @brief 读取传感器参数 设置默认参数
  613. *
  614. */
  615. void sensor_setdef(void)
  616. {
  617. uint8_t mark_up = 0;
  618. while (ef_cfged != 1)
  619. {
  620. rt_thread_mdelay(1000);
  621. }
  622. ef_get_env_blob("sensor", &sensor, sizeof(sensor), NULL);
  623. if (sensor[s_Temp].cfged != 1)
  624. {
  625. sensor[s_Temp].cfged = 1;
  626. sensor[s_Temp].sensor_addr = 1;
  627. sensor[s_Temp].start_reg = 0;
  628. sensor[s_Temp].count = 1;
  629. sensor[s_Temp].d_length = 1;
  630. sensor[s_Temp].d_pos = 0;
  631. sprintf(sensor[s_Temp].eName, stemp);
  632. sensor[s_Temp].factor = -10;
  633. mark_up = 1;
  634. LOG_W("s_Temp set def");
  635. }
  636. if (sensor[s_Humi].cfged != 1)
  637. {
  638. sensor[s_Humi].cfged = 1;
  639. sensor[s_Humi].sensor_addr = 1;
  640. sensor[s_Humi].start_reg = 1;
  641. sensor[s_Humi].count = 1;
  642. sensor[s_Humi].d_length = 1;
  643. sensor[s_Humi].d_pos = 0;
  644. sprintf(sensor[s_Humi].eName, humi);
  645. sensor[s_Humi].factor = -10;
  646. mark_up = 1;
  647. LOG_W("s_Humi set def");
  648. }
  649. // if (sensor[s_weight].cfged != 1 )
  650. // {
  651. // sensor[s_weight].cfged = 1;
  652. // sensor[s_weight].sensor_addr = 1;
  653. // sensor[s_weight].start_reg = 1;
  654. // sensor[s_weight].count = 2;
  655. // sensor[s_weight].d_length = 2;
  656. // sensor[s_weight].d_pos = 0;
  657. // sprintf(sensor[s_weight].eName, weight);
  658. // sensor[s_weight].factor = -100;
  659. // mark_up = 1;
  660. // LOG_W("s_weight set def");
  661. // }
  662. // if (sensor[s_Lux].cfged != 1 || 1)
  663. // {
  664. // sensor[s_Lux].cfged = 0;
  665. // sensor[s_Lux].sensor_addr = 1;
  666. // sensor[s_Lux].start_reg = 5;
  667. // sensor[s_Lux].count = 1;
  668. // sensor[s_Lux].d_length = 1;
  669. // sensor[s_Lux].d_pos = 0;
  670. // sprintf(sensor[s_Lux].eName, lux);
  671. // sensor[s_Lux].factor = 10;
  672. // mark_up = 1;
  673. // LOG_W("s_Lux set def");
  674. // }
  675. // if (sensor[s_Rain].cfged != 1)
  676. // {
  677. // sensor[s_Rain].cfged = 1;
  678. // sensor[s_Rain].sensor_addr = 1;
  679. // sensor[s_Rain].start_reg = 6;
  680. // sensor[s_Rain].count = 1;
  681. // sensor[s_Rain].d_length = 1;
  682. // sensor[s_Rain].d_pos = 0;
  683. // sprintf(sensor[s_Rain].eName, rain);
  684. // sensor[s_Rain].factor = -10;
  685. // mark_up = 1;
  686. // LOG_W("s_Rain set def");
  687. // }
  688. if (mark_up == 1)
  689. {
  690. LOG_W("sensor SET %d", ef_set_env_blob("sensor", &sensor, sizeof(sensor)));
  691. }
  692. uint8_t s1, s2 = 0;
  693. s1 = ef_get_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1), NULL);
  694. s2 = ef_get_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1), NULL);
  695. if (s1 + s2 != 2)
  696. {
  697. rt_kprintf("s1 %d s2 %d \n", s1, s2);
  698. device_status.collecting_sh1 = 20;
  699. device_status.collecting_eh1 = 4;
  700. ef_set_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1));
  701. ef_set_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1));
  702. rt_kprintf("Work Time Setdef \n");
  703. Recode_e_code(e_work_time_err, s1 + s2, "Work Time Setdef");
  704. }
  705. if (device_status.collecting_sh1 > 24 || device_status.collecting_eh1 > 24)
  706. {
  707. device_status.collecting_sh1 = 20;
  708. device_status.collecting_eh1 = 4;
  709. ef_set_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1));
  710. ef_set_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1));
  711. rt_kprintf("Work Time Setdef \n");
  712. Recode_e_code(e_work_time_err, s1 + s2, "Work Time Setdef");
  713. }
  714. if (ef_get_env_blob("limit", &limit, sizeof(Limit), NULL) == 0)
  715. {
  716. limit.temp_up = tempup_def;
  717. limit.temp_dw = tempdw_def;
  718. limit.humi_up = humiup_def;
  719. limit.humi_dw = humidw_def;
  720. limit.temhumEN = ON;
  721. // limit.LuxEN = ON;
  722. // limit.LuxTime = gktime_def;
  723. LOG_W("limit SET %d", ef_set_env_blob("limit", &limit, sizeof(Limit)));
  724. }
  725. else
  726. {
  727. if (limit.temhumEN == ON)
  728. {
  729. LOG_W("温控已开启:%d ~ %d \n", limit.temp_dw, limit.temp_up);
  730. }
  731. if (limit.RainEN == ON)
  732. {
  733. LOG_W("雨控已开启\n");
  734. }
  735. if (limit.LuxEN == ON)
  736. {
  737. if (limit.LuxTime == 0)
  738. {
  739. limit.LuxTime = gktime_def;
  740. LOG_W("limit SET %d", ef_set_env_blob("limit", &limit, sizeof(Limit)));
  741. }
  742. }
  743. }
  744. uint8_t save_syscfg = 0;
  745. if (ef_get_env_blob("syscfg", &syscfg, sizeof(syscfg), NULL) == 0)
  746. {
  747. syscfg.fan_speed = 50; // 默认风机50%
  748. syscfg.en_tigmode = 0; // 默认是间隔上报
  749. syscfg.photim = 60;
  750. syscfg.dattim = 30;
  751. save_syscfg = 1;
  752. rt_kprintf("syscfg SET DEF \n");
  753. }
  754. else
  755. {
  756. Demo_Mode_NEW = 0;
  757. if (syscfg.fan_speed < 10 || syscfg.fan_speed > 100)
  758. {
  759. syscfg.fan_speed = 50; // 默认值
  760. save_syscfg = 1;
  761. rt_kprintf("fan_speed SET DEF \n");
  762. }
  763. CollFanSetPWM(syscfg.fan_speed);
  764. if (syscfg.dattim == 0)
  765. {
  766. syscfg.dattim = 30;
  767. save_syscfg = 1;
  768. rt_kprintf("dattim SET DEF \n");
  769. }
  770. if (syscfg.photim == 0)
  771. {
  772. syscfg.photim = 60;
  773. save_syscfg = 1;
  774. rt_kprintf("photim SET DEF \n");
  775. }
  776. if (syscfg.en_tigmode > 1)
  777. {
  778. syscfg.en_tigmode = 0;
  779. save_syscfg = 1;
  780. rt_kprintf("en_tigmode SET DEF \n");
  781. }
  782. }
  783. if (save_syscfg)
  784. {
  785. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  786. }
  787. /* 拍照定时参数(间隔天/时/分)校验: 非法或全0 -> 恢复默认(1天 21:00) */
  788. Check_Photo_Param_Valid();
  789. rt_kprintf("\n\n");
  790. LOG_I(" 当前工作模式:%d", syscfg.en_tigmode);
  791. LOG_I(" 图片上传间隔:%d", syscfg.photim);
  792. LOG_I(" 数据上传间隔:%d", syscfg.dattim);
  793. LOG_I(" 拍照定时:%d天 %02d:%02d", syscfg.pho_inr_day, syscfg.pho_t_hour, syscfg.pho_t_min);
  794. LOG_I(" 温控开关:%d [%d ~ %d]", limit.temhumEN, limit.temp_up, limit.temp_dw);
  795. LOG_I(" 采集开始时间:%d", device_status.collecting_sh1);
  796. LOG_I(" 采集结束时间:%d \n\n", device_status.collecting_eh1);
  797. }
  798. // void delswork(void)
  799. //{
  800. //
  801. // ef_del_env("swork");
  802. //
  803. // }
  804. // MSH_CMD_EXPORT(delswork , delswork);
  805. /**
  806. * @brief 线程
  807. *
  808. * @param param
  809. */
  810. static void rs485_thread_entry(void *param)
  811. {
  812. uint16_t timeout = 10 * 60, cnt = 0, update_wait = 0;
  813. rt_thread_mdelay(6000);
  814. MX_UART5_Init();
  815. rt_thread_mdelay(6000);
  816. while (ef_cfged == 0)
  817. {
  818. rt_thread_mdelay(1000);
  819. if (update_wait++ > 180)
  820. {
  821. break;
  822. }
  823. }
  824. rt_kprintf("rs485_thread_entry\n");
  825. sensor_setdef();
  826. HMI_WRITE("result.txt=\"要素采集已开始\"");
  827. char delay_cnt = 0;
  828. static char cnten = 1;
  829. while (1)
  830. {
  831. while (sex_enread)
  832. {
  833. // rt_kprintf("sex_enread \n");
  834. rt_thread_mdelay(1000);
  835. if (cnt++ >= timeout)
  836. {
  837. cnt = 0;
  838. sex_enread = 0;
  839. rt_kprintf("sex_enread timeout\n");
  840. HMI_WRITE("ReadSenor.result.txt=\"测试时长超时 已退出\"");
  841. break;
  842. }
  843. }
  844. READ_MODBUS_DATA_1(s_ALL);
  845. //READ_MODBUS_DATA_1(s_weight);
  846. rt_thread_mdelay(100);
  847. }
  848. }
  849. int rs485_thread(void)
  850. {
  851. rt_thread_t tid1 = RT_NULL;
  852. tid1 = rt_thread_create("rs485_thread",
  853. rs485_thread_entry, RT_NULL,
  854. 1024 + 256,
  855. 10, 5);
  856. /* 如果获得线程控制块,启动这个线程 */
  857. if (tid1 != RT_NULL)
  858. {
  859. rt_thread_startup(tid1);
  860. }
  861. else
  862. LOG_E("rs485_thread start fail\n");
  863. return 0;
  864. }
  865. INIT_APP_EXPORT(rs485_thread); // 监听命令及响应
  866. void dis_elem(void)
  867. {
  868. for (uint8_t a = 0; a < MAX_SENSOR_NUM; a++)
  869. {
  870. if (sensor[a].cfged == 1)
  871. {
  872. rt_kprintf("s%6s s-%d reg-%d val-%d/%s on-%d\n",
  873. sensor[a].eName,
  874. sensor[a].sensor_addr,
  875. sensor[a].start_reg,
  876. sensor[a].value,
  877. sensor[a].eValue,
  878. sensor[a].online);
  879. }
  880. }
  881. rt_kprintf("\n\n");
  882. }
  883. MSH_CMD_EXPORT(dis_elem, dis_elem);
  884. void dislimlt(void)
  885. {
  886. rt_kprintf("tup %d tdw %d hup %d hdw %d temp%d lux%d rain%d \n\n",
  887. limit.temp_up,
  888. limit.temp_dw,
  889. limit.humi_up,
  890. limit.humi_dw,
  891. limit.temhumEN,
  892. limit.LuxEN,
  893. limit.RainEN);
  894. }
  895. MSH_CMD_EXPORT(dislimlt, dislimlt);