Serial.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. /*******************************************************************************************
  2. * File Name: Serial.c
  3. * Function Describe:device for serial
  4. * Relate Module:
  5. * Explain:
  6. 接收采用中断方式
  7. UART1: 连接尾插,用于与PC相连 另外,printf映射到UART1
  8. UART2: 连接Modem
  9. 全局变量g_ucUARTSel 调试选择控制,决定了3个串口的转发关系,其值通过以下3个宏控分别代表:
  10. COM_SEL_MCU 正常使用不转发,尾插用于MCU打印LOG或 MCU软件升级
  11. COM_SEL_MODEM UART1<-->UART2,尾插用于MODEM LOG打印
  12. * Writer: ShiLiangWen
  13. * Date: 2015.1.20
  14. ********************************************************************************************/
  15. #define THIS_FILE_ID 4
  16. /* Includes ------------------------------------------------------------------*/
  17. #include "includes.h"
  18. #define USART1_DR_Base 0x40013804
  19. #define USART2_DR_Base 0x40004404
  20. unsigned char g_ucUARTSel=0;//0--MCU 1--Modem 2--GPS
  21. unsigned char g_ucUART1RxMode=0;
  22. unsigned short g_usUSART_WordLength = 0x0000;//用于串口初始化,无校验位时为0x0000,有校验位时为0x1000
  23. unsigned char g_ucDebugLog=0;//0--不打印DEBUG信息 1--打印DEBUG信息
  24. //UART1 对外接口
  25. unsigned char RxBuffer1[UART1_RX_BUFFER_SIZE];
  26. unsigned char TxBuffer1[UART1_TX_BUFFER_SIZE];
  27. unsigned short rx1_ct;
  28. unsigned char rx1_ct_max=0;
  29. unsigned char g_ucUart1Sending;
  30. unsigned char g_usUart1RecvLen=0;
  31. //UART2 用于与MODEM通讯
  32. unsigned char RxBuffer2[UART2_RX_BUFFER_SIZE];
  33. unsigned char TxBuffer2[UART2_TX_BUFFER_SIZE];
  34. unsigned char DMATxBuffer2[UART2_TX_BUFFER_SIZE];
  35. static unsigned short susRx2In=0;
  36. static unsigned short susRx2Len=0;
  37. static unsigned short susRx2Out=0;
  38. unsigned char recevstatue=0;
  39. /********************************************************************
  40. *Uart1DMAInit
  41. *串口1 DMA设置
  42. *串口1 发送必须用通道4,接收必须用通道5
  43. *********************************************************************/
  44. void Uart1DMAInit(void)
  45. {
  46. NVIC_InitTypeDef NVIC_InitStructure;
  47. DMA_InitTypeDef DMA_InitStructure;
  48. //启动DMA时钟
  49. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  50. #if UART1_TX_USE_DMA!=0
  51. //DMA 通道4用于UART1 TX
  52. DMA_DeInit(DMA1_Channel4);
  53. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);//外设地址
  54. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer1;//内存地址
  55. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//DMA传输方向单向
  56. DMA_InitStructure.DMA_BufferSize = UART1_TX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  57. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  58. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  59. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  60. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  61. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  62. DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //设置DMA的优先级别
  63. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  64. DMA_Init(DMA1_Channel4,&DMA_InitStructure);
  65. // //DMA中断设置
  66. // NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
  67. // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  68. // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  69. // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  70. // NVIC_Init(&NVIC_InitStructure);
  71. DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//中断设置
  72. DMA_Cmd(DMA1_Channel4, DISABLE); //等到需要发送的时候再使能
  73. #endif
  74. //DMA 通道5用于UART1 RX
  75. DMA_DeInit(DMA1_Channel5);
  76. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);//外设地址
  77. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer1;//内存地址
  78. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA传输方向单向
  79. DMA_InitStructure.DMA_BufferSize = UART1_RX_BUFFER_SIZE; //设置DMA在传输时缓冲区的长度
  80. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  81. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
  82. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长
  83. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长
  84. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
  85. DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA的优先级别
  86. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  87. DMA_Init(DMA1_Channel5,&DMA_InitStructure);
  88. //DMA_Cmd(DMA1_Channel5, ENABLE); //使能通道
  89. }
  90. static unsigned char uart_data_last=0;
  91. void UART2RxTxISRHandler(void)
  92. {
  93. __IO unsigned char uart_data;
  94. __IO static unsigned char uart_last_data=0;
  95. int i;
  96. RunMake(THIS_FILE_ID);
  97. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){
  98. uart_data = USART_ReceiveData(USART2);
  99. RxBuffer2[susRx2In++]=uart_data;
  100. susRx2Len++;
  101. if(susRx2In>=(UART2_RX_BUFFER_SIZE)){
  102. susRx2In=0;
  103. }
  104. isr_sem_send(&ModemUartSem);
  105. USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  106. }else if(USART_GetFlagStatus(USART2,USART_FLAG_IDLE)!=RESET){
  107. USART2->SR;
  108. USART2->DR;
  109. #if 0
  110. //recevstatue=1;
  111. //if(numbIn>UART2_RX_BUFFER_SIZE) numbIn= UART2_RX_BUFFER_SIZE;
  112. RxBuffer2[susRx2In]='\0';
  113. RS485_DIR_HIGH;
  114. for(i=0;i<susRx2In;i++){
  115. USART_SendData(USART1,RxBuffer2[i]);
  116. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  117. }
  118. RS485_DIR_LOW;
  119. susRx2In=0;
  120. #else
  121. //isr_sem_send(&ModemUartSem);
  122. //SlwTrace(DEBUG,"xxxxxxxxxxxxxx\r\n");
  123. #endif
  124. }
  125. uart_last_data=uart_data;
  126. if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
  127. {
  128. USART_ReceiveData(USART2); //
  129. USART_ClearFlag(USART2,USART_FLAG_ORE); //
  130. }
  131. }
  132. static unsigned short susTcpRecvDataLen=0;//如果是$MYNETREAD: 0,8的AT响应,则应该记录其长度并存放在susTcpRecvDataLen中,然后其后的与长度相匹配数据也一起打包成应用层的消息
  133. /**********************************************************************
  134. Uart2RecvProcess //处理接收
  135. 从UART2接收缓冲区RxBuffer2中提取消息,放入环形消息队列Uart2MsgQueue中
  136. RxBuffer2也是环形缓冲区�
  137. +IPD,len:data\r\n
  138. >\r\n 可以发送数据 z最少3个字节
  139. ************************************************************************/
  140. void Uart2RecvProcess(void)
  141. {
  142. char data,flag;
  143. unsigned short Rx2Len,out;
  144. char preData[10];
  145. char lastData1,lastData2;
  146. unsigned short i,j,len;
  147. char num[5];
  148. char buf[20];
  149. //snprintf(buf,sizeof(buf),"susRx2Len==%d\r\n",susRx2Len);
  150. //SlwTrace(DEBUG,buf);
  151. RunMake(THIS_FILE_ID);
  152. if(susRx2Len<2){//接收缓冲区内的数据长度至少2字节 即0x0D 0x0A
  153. RunMake(THIS_FILE_ID);
  154. return;
  155. }
  156. //如果长度溢出,清空并重置缓冲区。
  157. if(susRx2Len>(UART2_RX_BUFFER_SIZE-2)){
  158. sprintf(buf,"RX2BUF====%d\r\n",susRx2Len);
  159. SlwTrace(INF,buf);
  160. USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //关闭串口接受中断
  161. susRx2In=0;
  162. susRx2Out=0;
  163. susRx2Len=0;
  164. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  165. SlwTrace(DEBUG,"[Rx2Buf Over]\r\n");
  166. RunMake(THIS_FILE_ID);
  167. return;
  168. }
  169. //锁定环形缓冲区当前状态
  170. Rx2Len=susRx2Len;
  171. //预读取前n字节
  172. if(Rx2Len<4) len=Rx2Len; //2
  173. else len=4;
  174. out=susRx2Out;
  175. for(i=0;i<len;i++){
  176. preData[i]=RxBuffer2[out];
  177. if(++out>=UART2_RX_BUFFER_SIZE)out=0;
  178. }
  179. RunMake(THIS_FILE_ID);
  180. if(0!=ModemStrCmp(preData,"+IPD")){
  181. //非服务器下行数据
  182. //非"+IPD",则直接找到最近的0x0A作为结束符,读取并形成一包消息
  183. out=susRx2Out;
  184. for(i=0;i<Rx2Len;i++)
  185. {
  186. if(RxBuffer2[out]==0x0A)break;
  187. if(++out>=UART2_RX_BUFFER_SIZE)out=0;
  188. }
  189. //123/n/0
  190. if(i<Rx2Len)
  191. {//找到了0x0A,从环形缓冲区中读取数据并拷贝到消息缓冲区,发送消息
  192. len=i+1;//消息长度
  193. RunMake(THIS_FILE_ID);
  194. if(len<(MODEM_AT_MSG_DATA_LEN-2))
  195. {
  196. sutAtm.MsgLen=len;
  197. for(i=0;i<len;i++)
  198. {
  199. sutAtm.MsgData[i]=RxBuffer2[susRx2Out];
  200. if(++susRx2Out>=UART2_RX_BUFFER_SIZE)susRx2Out=0;
  201. }
  202. sutAtm.MsgData[i]=0;//消息最后补0作为结束符,方便打印
  203. SlwTrace(DEBUG,"[START]\r\n");
  204. SlwTrace(DEBUG,sutAtm.MsgData);
  205. SlwTrace(DEBUG,"[END]\r\n");
  206. //更新g_usRx3Len,需要防止中断修改冲突
  207. USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //DISABLE UART3 RX IT
  208. #if 0
  209. sprintf(buf,"len==%d\r\n",len);
  210. SlwTrace(INF,buf);
  211. sprintf(buf,"surplus11==%d\r\n",susRx2Len);
  212. SlwTrace(INF,buf);
  213. susRx2Len=susRx2Len-len;
  214. sprintf(buf,"surplus22==%d\r\n",susRx2Len);
  215. SlwTrace(INF,buf);
  216. #else
  217. susRx2Len=susRx2Len-len;
  218. #endif
  219. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //ENABLE UART3 RX IT
  220. RunMake(THIS_FILE_ID);
  221. //发送消息
  222. sutAtm.MsgLen+=1;
  223. if(0 != MsgQueuePost(sutAtm.MsgData,sutAtm.MsgLen)) SlwTrace(DEBUG, "MQueue Full1");
  224. return;
  225. }else
  226. {//消息队列的内存块长度不够,需要特殊处理,扔掉后面部分
  227. SlwTrace(DEBUG,"66666666666666666\r\n");
  228. sutAtm.MsgLen=len;
  229. for(i=0;i<len;i++)
  230. {
  231. data=RxBuffer2[susRx2Out];
  232. if(i<(MODEM_AT_MSG_DATA_LEN-2)) sutAtm.MsgData[i]=data;
  233. if(++susRx2Out>=UART2_RX_BUFFER_SIZE) susRx2Out=0;
  234. }
  235. sutAtm.MsgData[MODEM_AT_MSG_DATA_LEN-1]=0;//消息最后补0作为结束符
  236. //更新g_usRx3Len,需要防止中断修改冲突
  237. USART_ITConfig(USART2, USART_IT_IDLE, DISABLE); //DISABLE UART2 RX IT
  238. susRx2In=susRx2In-len;
  239. USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //ENABLE UART2 RX IT
  240. RunMake(THIS_FILE_ID);
  241. //发送消息
  242. if(0 != MsgQueuePost(sutAtm.MsgData,sutAtm.MsgLen)) SlwTrace(INF, "MQueue Full2");
  243. return;
  244. }
  245. }
  246. return;
  247. }
  248. //服务器下行数据
  249. //+IPD,len:data\r\n
  250. if(Rx2Len<8) {
  251. //SlwTrace(INF,"IPD len short \r\n");
  252. return;//最少9字节
  253. }
  254. out=susRx2Out;
  255. flag=0;//找到','的标志
  256. j=0;//用来存储xxx的下标,xxx范围"1" -> "9999"
  257. for(i=0;i<Rx2Len;i++)
  258. {
  259. data=RxBuffer2[out];
  260. if(','==data || ':'==data){
  261. if(flag<1)flag++;
  262. else break;
  263. }else if(flag==1 && j<4){
  264. num[j++]=data;
  265. }
  266. if(++out>=UART2_RX_BUFFER_SIZE)out=0;
  267. }
  268. if(i>=Rx2Len){//未找到了2个','则直接忽略
  269. SlwTrace(DEBUG,"<2<\r\n");
  270. return;
  271. }
  272. RunMake(THIS_FILE_ID);
  273. //找到了2个',' 计算xxx长度
  274. num[j]=0;
  275. len=atoi(num);
  276. if(len<10)j=1;
  277. else if(len<100)j=2;
  278. else if(len<1000)j=3;
  279. else j=4;
  280. len=len+j+6; //需谨慎判断
  281. if(Rx2Len<len){
  282. snprintf(buf, sizeof(buf), "len:%d,%d\r\n",Rx2Len,len);
  283. SlwTrace(INF,buf);
  284. return;//长度不够,忽略
  285. }
  286. //长度够,产生消息
  287. if(len<(MODEM_AT_MSG_DATA_LEN-2)){
  288. sutAtm.MsgLen=len;
  289. for(i=0;i<len;i++){
  290. sutAtm.MsgData[i]=RxBuffer2[susRx2Out];
  291. if(++susRx2Out>=UART2_RX_BUFFER_SIZE)susRx2Out=0;
  292. }
  293. sutAtm.MsgData[i]=0;//消息最后补0作为结束符,方便打印
  294. SlwTrace(DEBUG,sutAtm.MsgData);
  295. SlwTrace(INF,"\r\n");
  296. //更新g_usRx3Len,需要防止中断修改冲突
  297. USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //DISABLE UART2 RX IT
  298. SlwTrace(INF,"/*****************************************************/\r\n");
  299. sprintf(buf,"len2==%d\r\n",len);
  300. SlwTrace(INF,buf);
  301. sprintf(buf,"surplus33==%d\r\n",susRx2Len);
  302. SlwTrace(INF,buf);
  303. susRx2Len=susRx2Len-len;
  304. sprintf(buf,"surplus44==%d\r\n",susRx2Len);
  305. SlwTrace(INF,buf);
  306. SlwTrace(INF,"/*****************************************************/\r\n");
  307. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //ENABLE UART2 RX IT
  308. //发送消息
  309. sutAtm.MsgLen +=1;
  310. if(0 != MsgQueuePost(sutAtm.MsgData,sutAtm.MsgLen)) SlwTrace(DEBUG, "MQueue Full3");
  311. }else{
  312. snprintf(preData, sizeof(preData),"AtMsgBuf Over [%u]",i);
  313. SlwTrace(DEBUG,preData);
  314. return;
  315. }
  316. RunMake(THIS_FILE_ID);
  317. }
  318. void Uart1Send(char *txbuf,int len)
  319. {
  320. int i;
  321. RS485_DIR_HIGH;
  322. for(i=0;i<len;i++){
  323. USART_SendData(USART1,txbuf[i]);
  324. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  325. }
  326. RS485_DIR_LOW;
  327. }
  328. void Uart2Send(char *txbuf,int len)
  329. {
  330. int i;
  331. for(i=0;i<len;i++){
  332. USART_SendData(USART2,txbuf[i]);
  333. while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  334. }
  335. }
  336. /*************************************************************************************
  337. * 函数名:USART1_Send
  338. * 描述 :串口1发送数据函数 通过DMA实现
  339. * 输入 :要发送数据的首地址,发送数据的个数。发送数据的地址任意,并不用固定为Txd1Buffer
  340. * 输出 : 无
  341. * 举例 :Usart1_Send("Hello word!",11); Usart1_Send(Txd1Buffer,11);
  342. **************************************************************************************/
  343. void USART1_Send(char *pbuffer, unsigned short size)
  344. {
  345. #if UART1_TX_USE_DMA==1
  346. char buf[20];
  347. unsigned short i;
  348. unsigned short len;
  349. char *pData;
  350. if(size==0)return;
  351. //等待上一次发送完成
  352. while(g_ucUart1Sending!=0){
  353. os_dly_wait(1);
  354. }
  355. #if 0 //增加时间戳
  356. sprintf((char *)TxBuffer1,"%010u: ",os_time_get());
  357. if(size>(UART1_TX_BUFFER_SIZE-12))len=UART1_TX_BUFFER_SIZE-12;
  358. else len=size;
  359. len+=12;
  360. pData=(char *)&TxBuffer1[12];
  361. #else
  362. if(size>UART1_TX_BUFFER_SIZE)len=UART1_TX_BUFFER_SIZE;
  363. else len=size;
  364. pData=(char *)&TxBuffer1[0];
  365. #endif
  366. for(i=0;i<len;i++)pData[i]=pbuffer[i];
  367. DMA_Cmd (DMA1_Channel4,DISABLE);
  368. DMA1_Channel4->CMAR = (u32)TxBuffer1;
  369. DMA1_Channel4->CNDTR = len;
  370. g_ucUart1Sending=1;
  371. DMA_Cmd (DMA1_Channel4,ENABLE); //使能DMA,开始发送
  372. #else
  373. Uart1Send(pbuffer,size);
  374. #endif
  375. }
  376. void USART1_SendWaitCompleted(void)
  377. {
  378. #if UART1_TX_USE_DMA==1
  379. while(g_ucUart1Sending!=0){
  380. os_dly_wait(1);
  381. }
  382. #endif
  383. }
  384. //void USART2_SendWaitCompleted(void)
  385. //{
  386. //#if UART2_TX_USE_DMA==1
  387. // while(g_ucUart2Sending!=0){
  388. // os_dly_wait(1);
  389. // }
  390. //#endif
  391. //}
  392. unsigned char max_len=0;
  393. /*********************************************************************************************
  394. *UART1RxTxISRHandler
  395. *串口1中断处理函数
  396. **********************************************************************************************/
  397. void UART1RxTxISRHandler(void)
  398. {
  399. __IO unsigned long temp;
  400. __IO unsigned char uart_data;
  401. __IO static unsigned char uart_last_data=0;
  402. char *p;
  403. unsigned char i;
  404. //----接收中断--------
  405. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  406. {
  407. uart_data = USART_ReceiveData(USART1);
  408. USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
  409. if(g_usUart1RecvLen!=0){//上一包数据未处理完,不处理新来的数据,直接扔掉!
  410. rx1_ct=0;
  411. RxBuffer1[0]=0;
  412. return;
  413. }
  414. RxBuffer1[rx1_ct++]=uart_data;
  415. if(AuthIng==1)
  416. {
  417. if(rx1_ct>3){
  418. if( RxBuffer1[0]==0xAA && RxBuffer1[1]==0xBB){
  419. if(rx1_ct==4) max_len=uart_data;
  420. else if(rx1_ct>max_len){
  421. rx1_ct=0;
  422. max_len=0;
  423. RxBuffer1[0]=0;
  424. //SlwTrace(INF,"erro len\r\n");
  425. return;
  426. }
  427. if(uart_last_data==0xDD && uart_data==0x55){
  428. g_usUart1RecvLen=rx1_ct;
  429. RxBuffer1[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
  430. //SlwTrace(INF,"ture go\r\n");
  431. rx1_ct=0;
  432. }
  433. }else if((RxBuffer1[0]=='R'|| RxBuffer1[0]=='A') && RxBuffer1[1]=='T'){
  434. if(uart_last_data=='\r' && uart_data=='\n'){
  435. g_usUart1RecvLen=rx1_ct;
  436. RxBuffer1[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
  437. rx1_ct=0;
  438. max_len=0;
  439. }
  440. }else{
  441. rx1_ct=0;
  442. max_len=0;
  443. RxBuffer1[0]=0;
  444. }
  445. }else if(rx1_ct==1 && uart_data!=0xAA && uart_data!='R' && uart_data!='A'){
  446. rx1_ct=0;
  447. max_len=0;
  448. RxBuffer1[0]=0;
  449. }else if(rx1_ct==2 && uart_data!=0xBB && uart_data!='T'){
  450. rx1_ct=0;
  451. max_len=0;
  452. RxBuffer1[0]=0;
  453. }
  454. }
  455. else
  456. {
  457. if(RxBuffer1[0] == PRO_HEADER){
  458. if(rx1_ct>=3){
  459. temp=RxBuffer1[2]+3;
  460. if(rx1_ct >= temp){
  461. g_usUart1RecvLen=rx1_ct;
  462. rx1_ct=0;
  463. }
  464. }
  465. }else{
  466. rx1_ct=0;
  467. RxBuffer1[0]=0;
  468. }
  469. }
  470. if(rx1_ct>=(UART1_RX_BUFFER_SIZE-1)){//数据超过缓冲区的数据,过滤不处理
  471. rx1_ct=0;
  472. max_len=0;
  473. g_usUart1RecvLen=0;
  474. }
  475. uart_last_data=uart_data;
  476. }
  477. //---异常中断---
  478. if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
  479. {
  480. USART_ReceiveData(USART1); //
  481. USART_ClearFlag(USART1,USART_FLAG_ORE); //
  482. }
  483. }
  484. /*******************************************************************************
  485. Uart1Init
  486. mcu<->PC
  487. *******************************************************************************/
  488. void Uart1Init(void)
  489. {
  490. NVIC_InitTypeDef NVIC_InitStructure;
  491. GPIO_InitTypeDef GPIO_InitStructure;
  492. USART_InitTypeDef USART_InitStructure;
  493. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
  494. /*
  495. * USART1_TX -> PA9 , USART1_RX -> PA10 , RS485_DIR -> PA8
  496. */
  497. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  498. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  499. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  500. GPIO_Init(GPIOA, &GPIO_InitStructure);
  501. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  502. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  503. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  504. GPIO_Init(GPIOA, &GPIO_InitStructure);
  505. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  506. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;// GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
  507. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  508. GPIO_Init(GPIOA, &GPIO_InitStructure);
  509. USART_InitStructure.USART_BaudRate =115200;// 9600;//sutProductPara.UartBaud;
  510. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  511. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  512. USART_InitStructure.USART_Parity = USART_Parity_No;
  513. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  514. USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
  515. USART_Init(USART1, &USART_InitStructure);
  516. USART_Cmd(USART1, ENABLE);
  517. USART_ClearFlag(USART1,USART_FLAG_TC);
  518. USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //ENABLE DISABLE
  519. USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //ENABLE DISABLE
  520. USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  521. USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE); //使能USART1的接收DMA请求ENABLE
  522. USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能USART1的发送DMA请求
  523. Uart1DMAInit();
  524. rx1_ct=0;
  525. g_usUart1RecvLen=0;
  526. g_ucUart1Sending=0;
  527. g_ucUART1RxMode=0;
  528. RS485_DIR_LOW;
  529. Uart1RxEnable(1);
  530. }
  531. void Uart1RxEnable(int en)
  532. {
  533. static unsigned char sucEn=0;
  534. USART_InitTypeDef USART_InitStructure;
  535. if(sucEn!=en)sucEn=en;
  536. else return;
  537. if(en){
  538. USART_InitStructure.USART_BaudRate =115200;//sutProductPara.UartBaud;
  539. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  540. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  541. USART_InitStructure.USART_Parity = USART_Parity_No;
  542. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  543. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//
  544. USART_Init(USART1, &USART_InitStructure);
  545. USART_Cmd(USART1, ENABLE);
  546. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  547. // USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //USART_IT_IDLE USART_IT_RXNE
  548. //USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能USART1的接收DMA请求ENABLE
  549. //DMA_Cmd(DMA1_Channel5, ENABLE); //使能通道
  550. }else{
  551. USART_InitStructure.USART_BaudRate =115200;// 115200;
  552. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  553. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  554. USART_InitStructure.USART_Parity = USART_Parity_No;
  555. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  556. USART_InitStructure.USART_Mode = USART_Mode_Tx;//
  557. USART_Init(USART1, &USART_InitStructure);
  558. USART_Cmd(USART1, ENABLE);
  559. USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //USART_IT_IDLE USART_IT_RXNE
  560. USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE); //使能USART1的接收DMA请求ENABLE
  561. //DMA_Cmd(DMA1_Channel5, DISABLE); //使能通道
  562. }
  563. }
  564. /***************************************************************************
  565. Uart2Init
  566. Use for MainBoard
  567. ****************************************************************************/
  568. void Uart2Init(void)
  569. {
  570. GPIO_InitTypeDef GPIO_InitStructure;
  571. USART_InitTypeDef USART_InitStructure;
  572. memset(RxBuffer2,0,sizeof(RxBuffer2));
  573. susRx2In=0;
  574. susRx2Len=0;
  575. susRx2Out=0;
  576. //初始化接收消息队列
  577. MsgQueueSet();
  578. /*使能串口2使用的GPIO时钟*/
  579. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  580. /*使能串口2时钟*/
  581. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  582. /*串口2 RX管脚配置*/
  583. /* Configure USART2 Rx as input floating */
  584. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  585. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
  586. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  587. GPIO_Init(GPIOA, &GPIO_InitStructure);
  588. /*串口2 TX管脚配置*/
  589. /* Configure USART2 Tx as alternate function push-pull */
  590. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  591. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  592. GPIO_Init(GPIOA, &GPIO_InitStructure);
  593. USART_InitStructure.USART_BaudRate = 115200;//57600;//115200;
  594. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  595. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  596. USART_InitStructure.USART_Parity = USART_Parity_No;
  597. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  598. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  599. USART_Init(USART2, &USART_InitStructure);
  600. USART_ClearFlag(USART2,USART_FLAG_TC);
  601. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //ENABLE DISABLE
  602. USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //USART_IT_IDLE USART_IT_RXNE
  603. USART_DMACmd(USART2,USART_DMAReq_Tx,DISABLE);
  604. USART_DMACmd(USART2,USART_DMAReq_Rx,DISABLE);
  605. USART_Cmd(USART2, ENABLE);
  606. //USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE); //使能USART1的接收DMA请求
  607. //Uart2DMAInit();
  608. }
  609. /***********************************************************************************
  610. *
  611. ************************************************************************************/
  612. void SlwTrace(TRACE_TYPE type,char *buf)
  613. {
  614. int len;
  615. //if(!sutProductPara.Debug) return;
  616. #if UART1_TX_USE_DMA==0
  617. len=strlen(buf);
  618. //if(len>256)len=256;
  619. Uart1Send(buf,len);
  620. #else
  621. len=strlen(buf);
  622. if(len>512)len=512;
  623. if(len>UART1_TX_BUFFER_SIZE)len=UART1_TX_BUFFER_SIZE;
  624. USART1_Send(buf,len);
  625. #endif
  626. }
  627. /*******************************************************************************
  628. ComSelect
  629. 调试口选择
  630. #define COM_SEL_MCU 0
  631. #define COM_SEL_GPS 1
  632. #define COM_SEL_MODEM 2
  633. *******************************************************************************/
  634. void ComSelect(unsigned char sel)
  635. {
  636. switch(sel)
  637. {
  638. case COM_SEL_MCU:
  639. SlwTrace(INF,"Debug COM selcet to MCU!\r\n");
  640. g_ucUARTSel=sel;
  641. break;
  642. case COM_SEL_MODEM:
  643. SlwTrace(INF,"Debug COM selcet to Modem!\r\n");
  644. g_ucUARTSel=sel;
  645. //os_tsk_delete(idModemTask);
  646. //os_tsk_delete(idWLanTask);
  647. break;
  648. }
  649. }
  650. /**************************************************************************
  651. * USART1_SendOK_IQ
  652. * 串口1发送数据完毕后,会调用的中断函数,将发送标志置0
  653. * 此函数需在stm32f10x_it.c 的 DMA1_Channel4_IRQHandler()中被调用
  654. ***************************************************************************/
  655. void USART1_SendOK_IQ(void)
  656. {
  657. //判断是否为DMA发送完成中断
  658. if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
  659. {
  660. DMA_ClearITPendingBit(DMA1_IT_GL4);
  661. DMA_ClearFlag(DMA1_FLAG_TC4);
  662. DMA_Cmd (DMA1_Channel4,DISABLE);
  663. g_ucUart1Sending = 0; //数据发送完毕
  664. }
  665. //printf("USART1_SendOK_IQ\r\n");
  666. }
  667. #ifdef __GNUC__
  668. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  669. set to 'Yes') calls __io_putchar() */
  670. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  671. #else
  672. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  673. #endif /* __GNUC__ */
  674. /**
  675. * @brief Retargets the C library printf function to the USART.
  676. * @param None
  677. * @retval None
  678. */
  679. PUTCHAR_PROTOTYPE
  680. {
  681. RS485_DIR_HIGH;
  682. /* Place your implementation of fputc here */
  683. /* e.g. write a character to the USART */
  684. USART_SendData(USART1, (uint8_t) ch);
  685. /* Loop until the end of transmission */
  686. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  687. {
  688. }
  689. RS485_DIR_LOW;
  690. return ch;
  691. }