serial.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #include "includes.h"
  2. //UART1 Trace
  3. SUT_USART1 m_usart1;
  4. static unsigned short rx1_ct;
  5. unsigned char g_ucUARTSel=0;//0--MCU 1--Modem
  6. /********************************************************************
  7. *Uart2DMAInit
  8. *串口2 DMA设置
  9. *串口2 发送必须用通道4,接收必须用通道5
  10. *********************************************************************/
  11. void Uart_Init(void)
  12. {
  13. GPIO_InitTypeDef GPIO_InitStructure;
  14. USART_InitTypeDef USART_InitStructure;
  15. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  16. GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置PA2成第二功能引脚 TX 2
  17. GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置PA3成第二功能引脚 RX 3
  18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  22. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  23. GPIO_Init(GPIOA, &GPIO_InitStructure);
  24. USART_InitStructure.USART_BaudRate =115200;//115200
  25. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  26. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  27. USART_InitStructure.USART_Parity = USART_Parity_No;;
  28. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  29. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  30. USART_Init(USART1, &USART_InitStructure);
  31. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能接收中断
  32. USART_Cmd(USART1, ENABLE);
  33. USART_ClearFlag(USART1,USART_FLAG_TC);
  34. /////////////////////////////////////
  35. // m_usart.g_usRxLen=0;
  36. // m_usart.g_usRxIn=0;
  37. // m_usart.g_usRxOut=0;
  38. m_usart1.g_ucUartSending=0;
  39. memset(m_usart1.RxBuffer,0,UART1_RX_BUFFER_SIZE);
  40. RS485_DIR_LOW;
  41. }
  42. unsigned char my_flag=0;
  43. unsigned char max_len=0;
  44. void UART1RxTxISRHandler(void)
  45. {
  46. __IO unsigned long temp;
  47. __IO unsigned char uart_data;
  48. __IO static unsigned char uart_last_data=0;
  49. char buf[20];
  50. //----接收中断--------
  51. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  52. {
  53. uart_data = USART_ReceiveData(USART1);
  54. USART_SendData(USART1,uart_data);
  55. USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
  56. if(m_usart1.g_usUartRecvLen!=0){//上一包数据未处理完,不处理新来的数据,直接扔掉!
  57. rx1_ct=0;
  58. m_usart1.RxBuffer[0]=0;
  59. return;
  60. }
  61. m_usart1.RxBuffer[rx1_ct++]=uart_data;
  62. if(AuthIng==1)
  63. {
  64. if(rx1_ct>3){
  65. if( m_usart1.RxBuffer[0]==0xAA && m_usart1.RxBuffer[1]==0xBB) {
  66. if(rx1_ct==4) max_len=uart_data;
  67. else if(rx1_ct>max_len){
  68. rx1_ct=0;
  69. max_len=0;
  70. m_usart1.RxBuffer[0]=0;
  71. return;
  72. }
  73. if(uart_last_data==0xDD && uart_data==0x55){
  74. m_usart1.g_usUartRecvLen=rx1_ct;
  75. m_usart1.RxBuffer[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
  76. rx1_ct=0;
  77. }
  78. } else if( m_usart1.RxBuffer[0]==0xCC && m_usart1.RxBuffer[1]==0xDD) {
  79. //SlwTrace(INF,"test1111111",1);
  80. my_flag=1;
  81. if(rx1_ct==4) max_len=uart_data;
  82. else if(rx1_ct>max_len){
  83. snprintf(buf,sizeof(buf),"rxct==%d,maxlen===%d\r\n",rx1_ct,max_len);
  84. SlwTrace(INF,buf,1);
  85. rx1_ct=0;
  86. max_len=0;
  87. m_usart1.RxBuffer[0]=0;
  88. my_flag=3;
  89. return;
  90. }
  91. if(uart_last_data==0xDD && uart_data==0x55){
  92. //SlwTrace(INF,"test2222222",1);
  93. m_usart1.g_usUartRecvLen=rx1_ct;
  94. m_usart1.RxBuffer[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
  95. //SlwTrace(INF,"/*******************************/",1);
  96. //SlwTrace(INF,m_usart1.RxBuffer,1);
  97. // snprintf(buf,sizeof(buf),"lengh====%d\r\n",rx1_ct);
  98. // SlwTrace(INF,buf,1);
  99. rx1_ct=0;
  100. my_flag=2;
  101. }
  102. }
  103. else if(m_usart1.RxBuffer[0]=='R' && m_usart1.RxBuffer[1]=='T'){
  104. //SlwTrace(INF,"test3333333",1);
  105. if(uart_last_data=='\r' && uart_data=='\n'){
  106. m_usart1.g_usUartRecvLen=rx1_ct;
  107. m_usart1.RxBuffer[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
  108. rx1_ct=0;
  109. max_len=0;
  110. }
  111. }else{
  112. rx1_ct=0;
  113. max_len=0;
  114. m_usart1.RxBuffer[0]=0;
  115. }
  116. }else if(rx1_ct==1 && uart_data!=0xAA && uart_data!=0xCC && uart_data!='R' && uart_data!='A'){
  117. //SlwTrace(INF,"test4444444444",1);
  118. rx1_ct=0;
  119. max_len=0;
  120. m_usart1.RxBuffer[0]=0;
  121. }else if(rx1_ct==2 && uart_data!=0xBB && uart_data!=0xDD && uart_data!='T'){
  122. //SlwTrace(INF,"test5555555555",1);
  123. rx1_ct=0;
  124. max_len=0;
  125. m_usart1.RxBuffer[0]=0;
  126. }
  127. if(rx1_ct>=(UART1_RX_BUFFER_SIZE-1)){//数据超过缓冲区的数据,过滤不处理
  128. //SlwTrace(INF,"test6666666666666",1);
  129. rx1_ct=0;
  130. max_len=0;
  131. m_usart1.g_usUartRecvLen=0;
  132. }
  133. uart_last_data=uart_data;
  134. }
  135. else{
  136. if(m_usart1.RxBuffer[0] == PRO_HEADER){
  137. if(rx1_ct>=3){
  138. temp=m_usart1.RxBuffer[2]+3;
  139. if(rx1_ct >= temp){
  140. m_usart1.g_usUartRecvLen=rx1_ct;
  141. rx1_ct=0;
  142. }
  143. }
  144. }else{
  145. rx1_ct=0;
  146. m_usart1.RxBuffer[0]=0;
  147. }
  148. }
  149. }
  150. //处理异常
  151. if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
  152. {
  153. USART_ReceiveData(USART1); //
  154. USART_ClearFlag(USART1,USART_FLAG_ORE); //
  155. }
  156. }
  157. /////////////////////print part//////////////////
  158. void Uart1Send(char *data, unsigned short len)
  159. {
  160. unsigned short i;
  161. RS485_DIR_HIGH;
  162. for(i=0;i<len;i++)
  163. {
  164. USART_SendData(USART1,data[i]);
  165. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  166. }
  167. RS485_DIR_LOW;
  168. }
  169. void SlwTrace(TRACE_TYPE type,char *buf, char needEnd)
  170. {
  171. unsigned short len;
  172. if(DEBUG == type) return;
  173. if(!sutProductPara.Sdebug)return;
  174. len=strlen(buf);
  175. if(len<=0) return;
  176. Uart1Send(buf, len);
  177. if(needEnd !=0) Uart1Send("\r\n", 2);
  178. }
  179. void Uart1RxEnable(unsigned char en)
  180. {
  181. static unsigned char sucEn=0;
  182. USART_InitTypeDef USART_InitStructure;
  183. if(sucEn!=en)sucEn=en;
  184. else return;
  185. if(en){
  186. USART_InitStructure.USART_BaudRate =9600;// 115200;
  187. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  188. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  189. USART_InitStructure.USART_Parity = USART_Parity_No;
  190. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  191. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//
  192. USART_Init(USART1, &USART_InitStructure);
  193. USART_Cmd(USART1, ENABLE);
  194. USART_ClearFlag(USART1,USART_FLAG_TC);
  195. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  196. }else{
  197. USART_InitStructure.USART_BaudRate =9600;// 115200;
  198. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  199. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  200. USART_InitStructure.USART_Parity = USART_Parity_No;
  201. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  202. USART_InitStructure.USART_Mode = USART_Mode_Tx;//
  203. USART_Init(USART1, &USART_InitStructure);
  204. USART_Cmd(USART1, ENABLE);
  205. USART_ClearFlag(USART1,USART_FLAG_TC);
  206. }
  207. }
  208. /*******************************************************************************
  209. ComSelect
  210. 调试口选择
  211. #define COM_SEL_MCU 0
  212. #define COM_SEL_MODEM 1
  213. *******************************************************************************/
  214. void ComSelect(unsigned char sel)
  215. {
  216. switch(sel)
  217. {
  218. case COM_SEL_MCU:
  219. SlwTrace(INF,"Debug COM selcet to MCU!\r\n",0);
  220. g_ucUARTSel=sel;
  221. break;
  222. case COM_SEL_MODEM:
  223. SlwTrace(INF,"Debug COM selcet to Modem!\r\n",0);
  224. g_ucUARTSel=sel;
  225. break;
  226. }
  227. }
  228. ////////////////重定向printf
  229. #if 1
  230. #pragma import(__use_no_semihosting)
  231. //标准库需要的支持函数
  232. struct __FILE
  233. {
  234. int handle;
  235. /* Whatever you require here. If the only file you are using is */
  236. /* standard output using printf() for debugging, no file handling */
  237. /* is required. */
  238. };
  239. /* FILE is typedef’ d in stdio.h. */
  240. FILE __stdout;
  241. //定义_sys_exit()以避免使用半主机模式
  242. void _sys_exit(int x)
  243. {
  244. x = x;
  245. }
  246. //重定义fputc函数
  247. int fputc(int ch, FILE *f)
  248. {
  249. // Uart1Send((char *)&ch, 1);
  250. // //USART1->TDR=ch;
  251. // //while(!((USART1->ISR)&(1<<7))){}
  252. USART_SendData(USART1, (uint8_t)ch);
  253. while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  254. return (ch);
  255. }
  256. #endif