uart_comm.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: Uart_comm.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2014-12-17
  7. 功能说明: 面板通信
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #ifdef FUN_GPRS
  15. #include "gprs_aux.h"
  16. #endif
  17. /*------------------------------- 宏定义 --------------------------------------
  18. */
  19. #define COMM_TYPE 5
  20. #define MAX_INST_MASK 3
  21. #define MAX_BOARD_MASK 3
  22. /*------------------------------ 类型结构 -------------------------------------
  23. */
  24. UART_INST_BUF_DEF ptBuf[COMM_TYPE];
  25. int prior=1;
  26. int hmi_chnl=0;
  27. bool hmi_status=0;
  28. DWORD count = 0;
  29. /*------------------------------ 函数声明 -------------------------------------
  30. */
  31. //static void _Uart_Comm_Send(int len,u8 *buf);
  32. //static void _uart_comm_queue(void);
  33. /*------------------------------ 外部函数 -------------------------------------
  34. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  35. */
  36. void uart_comm_init(UART_COMM_STRUCT *pt,BYTE chnl)
  37. {
  38. memset(pt,0,sizeof(UART_COMM_STRUCT));
  39. pt->type = IEC_HMI_CHN;
  40. hmi_chnl = chnl;
  41. }
  42. //将数据加入缓冲区
  43. int Add_Uart_Frame(int board,int len,u8 *para)
  44. {
  45. UART_INST_DEF *pt = &ptBuf[board].tInst[ptBuf[board].head];
  46. memcpy(pt->para, para, len);
  47. pt->len=(BYTE)len;
  48. ptBuf[board].head = (ptBuf[board].head + 1) & (UART_MAX_INST_BUFS-1);
  49. return 1;
  50. }
  51. void Sub_Uart_Frame(int board )
  52. {
  53. ptBuf[board].tail = (ptBuf[board].tail - 1) & (UART_MAX_INST_BUFS-1);
  54. }
  55. void Uart_Comm_Send(void)
  56. {
  57. int i = 0;
  58. static int s_cnt[COMM_TYPE] ={0};
  59. int ret = 0;
  60. //按优先级发送
  61. for(i=1;i<COMM_TYPE;i++)
  62. {
  63. UART_INST_DEF *pt = &ptBuf[i].tInst[ptBuf[i].tail];
  64. //连续3次后,接下来发送低优先级缓冲区数据
  65. if(s_cnt[i]<MAX_INST_MASK)
  66. {
  67. if(ptBuf[i].head != ptBuf[i].tail)
  68. {
  69. //发送数据
  70. ret=protocol_put_oneframe(&g_h_boj[0], pt->para, (int)pt->len);
  71. if(ret==0)
  72. {
  73. ptBuf[i].tail = (ptBuf[i].tail + 1) & (UART_MAX_INST_BUFS-1);
  74. s_cnt[i]++;
  75. if(g_print_hmi)
  76. {
  77. print_msg("TX_HMI:",pt->para,(int)pt->len);
  78. }
  79. }
  80. break;
  81. }
  82. }
  83. else
  84. {
  85. s_cnt[i] = 0;
  86. }
  87. }
  88. }
  89. void Uart_Comm_Recv(void)
  90. {
  91. u8 buf[UART_FRAME_LEN];
  92. int ret = 0;
  93. BYTE src_addr;
  94. BYTE dst_addr;
  95. ret = protocol_get_oneframe(&g_h_boj[0], buf);
  96. if(ret == 0)
  97. {
  98. ret = (int)buf[1] + 6;
  99. if(g_print_hmi)
  100. print_msg("RX_HMI:",buf, ret);
  101. if(buf[ret-1] & 0x80)
  102. {
  103. src_addr = (buf[ret-1] >> 3) & 0x07; // 起始地址
  104. dst_addr = buf[ret-1] & 0x07; // 目标地址
  105. switch(src_addr)
  106. {
  107. case HMI_BOARD:
  108. HMI_Board_Recv((int)buf[1] + 6, buf);
  109. hmi_status = true;
  110. count = ustimer_get_origin();
  111. break;
  112. case PDA_BOARD:
  113. PDA_Board_Recv((int)buf[1] + 6, buf);
  114. break;
  115. case GPRS_BOARD:
  116. #ifdef FUN_GPRS // modfiy for xxxxxx 20220706 GPRS没有使用。
  117. GPRS_Board_Proc((int)buf[1] + 6, buf);
  118. #endif
  119. break;
  120. case MAINTAIN_BOARD:
  121. Maintain_Board_Recv((int)buf[1] + 6,buf);
  122. break;
  123. default:
  124. break;
  125. }
  126. }
  127. }
  128. if(ustimer_get_duration(count) > 10 * USTIMER_SEC)
  129. {
  130. hmi_status = false;
  131. }
  132. }
  133. /*------------------------------ 内部函数 -------------------------------------
  134. */
  135. void Reset_Uart_Link(UART_COMM_STRUCT *pt)
  136. {
  137. pt->cTypeCounter = 0;
  138. pt->cRecvCnt = 0;
  139. }
  140. /*------------------------------ 文件结束 -------------------------------------
  141. */