| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- #include "includes.h"
- //UART1 Trace
- SUT_USART1 m_usart1;
- static unsigned short rx1_ct;
- unsigned char g_ucUARTSel=0;//0--MCU 1--Modem
- /********************************************************************
- *Uart2DMAInit
- *串口2 DMA设置
- *串口2 发送必须用通道4,接收必须用通道5
- *********************************************************************/
- void Uart_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
-
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置PA2成第二功能引脚 TX 2
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置PA3成第二功能引脚 RX 3
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- USART_InitStructure.USART_BaudRate =115200;//115200
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_Init(USART1, &USART_InitStructure);
-
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能接收中断
- USART_Cmd(USART1, ENABLE);
- USART_ClearFlag(USART1,USART_FLAG_TC);
-
- /////////////////////////////////////
- // m_usart.g_usRxLen=0;
- // m_usart.g_usRxIn=0;
- // m_usart.g_usRxOut=0;
- m_usart1.g_ucUartSending=0;
- memset(m_usart1.RxBuffer,0,UART1_RX_BUFFER_SIZE);
-
- RS485_DIR_LOW;
-
- }
- unsigned char my_flag=0;
- unsigned char max_len=0;
- void UART1RxTxISRHandler(void)
- {
- __IO unsigned long temp;
- __IO unsigned char uart_data;
- __IO static unsigned char uart_last_data=0;
-
- char buf[20];
-
- //----接收中断--------
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
- uart_data = USART_ReceiveData(USART1);
- USART_SendData(USART1,uart_data);
- USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
-
- if(m_usart1.g_usUartRecvLen!=0){//上一包数据未处理完,不处理新来的数据,直接扔掉!
- rx1_ct=0;
- m_usart1.RxBuffer[0]=0;
- return;
- }
- m_usart1.RxBuffer[rx1_ct++]=uart_data;
-
- if(AuthIng==1)
- {
- if(rx1_ct>3){
- if( m_usart1.RxBuffer[0]==0xAA && m_usart1.RxBuffer[1]==0xBB) {
-
- if(rx1_ct==4) max_len=uart_data;
- else if(rx1_ct>max_len){
- rx1_ct=0;
- max_len=0;
- m_usart1.RxBuffer[0]=0;
- return;
- }
- if(uart_last_data==0xDD && uart_data==0x55){
- m_usart1.g_usUartRecvLen=rx1_ct;
- m_usart1.RxBuffer[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
- rx1_ct=0;
-
- }
- } else if( m_usart1.RxBuffer[0]==0xCC && m_usart1.RxBuffer[1]==0xDD) {
-
-
- //SlwTrace(INF,"test1111111",1);
- my_flag=1;
- if(rx1_ct==4) max_len=uart_data;
- else if(rx1_ct>max_len){
- snprintf(buf,sizeof(buf),"rxct==%d,maxlen===%d\r\n",rx1_ct,max_len);
- SlwTrace(INF,buf,1);
- rx1_ct=0;
- max_len=0;
- m_usart1.RxBuffer[0]=0;
- my_flag=3;
- return;
- }
- if(uart_last_data==0xDD && uart_data==0x55){
- //SlwTrace(INF,"test2222222",1);
- m_usart1.g_usUartRecvLen=rx1_ct;
- m_usart1.RxBuffer[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
- //SlwTrace(INF,"/*******************************/",1);
- //SlwTrace(INF,m_usart1.RxBuffer,1);
- // snprintf(buf,sizeof(buf),"lengh====%d\r\n",rx1_ct);
- // SlwTrace(INF,buf,1);
- rx1_ct=0;
- my_flag=2;
- }
- }
-
- else if(m_usart1.RxBuffer[0]=='R' && m_usart1.RxBuffer[1]=='T'){
- //SlwTrace(INF,"test3333333",1);
- if(uart_last_data=='\r' && uart_data=='\n'){
- m_usart1.g_usUartRecvLen=rx1_ct;
- m_usart1.RxBuffer[rx1_ct]=0;//末尾补0,方便应用层调试直接打印消息内容。
- rx1_ct=0;
- max_len=0;
- }
- }else{
- rx1_ct=0;
- max_len=0;
- m_usart1.RxBuffer[0]=0;
- }
- }else if(rx1_ct==1 && uart_data!=0xAA && uart_data!=0xCC && uart_data!='R' && uart_data!='A'){
- //SlwTrace(INF,"test4444444444",1);
- rx1_ct=0;
- max_len=0;
- m_usart1.RxBuffer[0]=0;
- }else if(rx1_ct==2 && uart_data!=0xBB && uart_data!=0xDD && uart_data!='T'){
-
- //SlwTrace(INF,"test5555555555",1);
- rx1_ct=0;
- max_len=0;
- m_usart1.RxBuffer[0]=0;
- }
-
- if(rx1_ct>=(UART1_RX_BUFFER_SIZE-1)){//数据超过缓冲区的数据,过滤不处理
- //SlwTrace(INF,"test6666666666666",1);
- rx1_ct=0;
- max_len=0;
- m_usart1.g_usUartRecvLen=0;
- }
-
- uart_last_data=uart_data;
- }
- else{
-
- if(m_usart1.RxBuffer[0] == PRO_HEADER){
- if(rx1_ct>=3){
- temp=m_usart1.RxBuffer[2]+3;
- if(rx1_ct >= temp){
- m_usart1.g_usUartRecvLen=rx1_ct;
- rx1_ct=0;
- }
- }
- }else{
- rx1_ct=0;
- m_usart1.RxBuffer[0]=0;
- }
- }
- }
- //处理异常
- if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
- {
- USART_ReceiveData(USART1); //
- USART_ClearFlag(USART1,USART_FLAG_ORE); //
- }
-
- }
- /////////////////////print part//////////////////
- void Uart1Send(char *data, unsigned short len)
- {
- unsigned short i;
- RS485_DIR_HIGH;
- for(i=0;i<len;i++)
- {
- USART_SendData(USART1,data[i]);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
- }
- RS485_DIR_LOW;
- }
- void SlwTrace(TRACE_TYPE type,char *buf, char needEnd)
- {
- unsigned short len;
-
- if(DEBUG == type) return;
- if(!sutProductPara.Sdebug)return;
- len=strlen(buf);
- if(len<=0) return;
- Uart1Send(buf, len);
- if(needEnd !=0) Uart1Send("\r\n", 2);
- }
- void Uart1RxEnable(unsigned char en)
- {
- static unsigned char sucEn=0;
- USART_InitTypeDef USART_InitStructure;
- if(sucEn!=en)sucEn=en;
- else return;
-
- if(en){
- USART_InitStructure.USART_BaudRate =9600;// 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//
- USART_Init(USART1, &USART_InitStructure);
- USART_Cmd(USART1, ENABLE);
- USART_ClearFlag(USART1,USART_FLAG_TC);
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
- }else{
- USART_InitStructure.USART_BaudRate =9600;// 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Tx;//
- USART_Init(USART1, &USART_InitStructure);
- USART_Cmd(USART1, ENABLE);
- USART_ClearFlag(USART1,USART_FLAG_TC);
- }
- }
- /*******************************************************************************
- ComSelect
- 调试口选择
- #define COM_SEL_MCU 0
- #define COM_SEL_MODEM 1
- *******************************************************************************/
- void ComSelect(unsigned char sel)
- {
- switch(sel)
- {
- case COM_SEL_MCU:
- SlwTrace(INF,"Debug COM selcet to MCU!\r\n",0);
- g_ucUARTSel=sel;
- break;
-
- case COM_SEL_MODEM:
- SlwTrace(INF,"Debug COM selcet to Modem!\r\n",0);
- g_ucUARTSel=sel;
-
- break;
- }
- }
- ////////////////重定向printf
- #if 1
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
- /* Whatever you require here. If the only file you are using is */
- /* standard output using printf() for debugging, no file handling */
- /* is required. */
- };
- /* FILE is typedef’ d in stdio.h. */
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- // Uart1Send((char *)&ch, 1);
- // //USART1->TDR=ch;
- // //while(!((USART1->ISR)&(1<<7))){}
- USART_SendData(USART1, (uint8_t)ch);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
- return (ch);
- }
- #endif
|