| | |
| | | #include "Usart.h" |
| | | #include <string.h> |
| | | #include <stdarg.h> |
| | | #include <stdio.h> |
| | | #include "modbus.h" |
| | | #include "Rcc_Nvic_Systick.h" |
| | | |
| | | #include "global_param.h" |
| | | //æ°æ®åééååé |
| | | EUART_Frame m_EUART_TxFrames[EUART_TX_FRM_SIZE]; //æ°æ®åé帧éå |
| | | volatile int8_t m_EUART_TxFrm_Tail = 0; //æ°æ®åé帧éåå°¾æé |
| | |
| | | { |
| | | m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; |
| | | } |
| | | HIDO_DataStruct stPosState[4]; |
| | | HIDO_INT32 GPS_ParseGGA(HIDO_CHAR *_pcData, HIDO_UINT32 _u32Len) |
| | | { |
| | | |
| | | if (HIDO_UtilParseFormat((HIDO_UINT8 *) _pcData, _u32Len, "$%*,%*,%p,%*,%p,%*,%p,%*,%*,%p,%*,%*,%*,%*,%**", |
| | | &stPosState[0], &stPosState[1], &stPosState[2], &stPosState[3]) != 15) |
| | | { |
| | | return HIDO_ERR; |
| | | } |
| | | |
| | | //l_u8PosState = atoi((HIDO_CHAR *)stPosState.m_pData); |
| | | |
| | | return HIDO_OK; |
| | | } |
| | | //UART DMAçé
ç½® |
| | | void UART_DMAConfiguration(void) |
| | | { |
| | |
| | | |
| | | //åå§å管è |
| | | GPIO_InitStructure.GPIO_Pin = EU_RX_PIN; |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //Rx䏿è¾å
¥ |
| | | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Rx䏿è¾å
¥ |
| | | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
| | | GPIO_Init(EU_RX_GPIO, &GPIO_InitStructure); |
| | | |
| | |
| | | UART_DMAConfiguration(); |
| | | |
| | | } |
| | | u8 overrun_flag=0; |
| | | u8 overrun_flag=0,receiveingdata_flag,gpsdataready_flag,waitggaend_flag,ggaend_idx; |
| | | u8 RTCMdata[2000]; |
| | | u32 lastusartdata_timer; |
| | | u16 rtcm_i,gps_packlen; |
| | | u16 t1,t2,t3,t4; |
| | | extern volatile uint32_t time32_incr; |
| | | void UART_CheckReceive(void) |
| | | { |
| | | int32_t DMACnt = 0; |
| | | int32_t MaxDataLen = EUART_RX_BUF_SIZE; |
| | | u8 rxbuf_len = 0; |
| | | u8 buftemp1 = 0; |
| | | u8 buftemp2 = 0; |
| | | u8 i = 0; |
| | | |
| | | //妿æ£å¨å¾åééå䏿·»å æ°æ®ï¼éåº |
| | | if(m_bEUARTPushingFrms) |
| | | return; |
| | |
| | | m_bEUARTCheckingRec = 0; |
| | | return; |
| | | } |
| | | |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR);//DMACntæ¯DMAé鿥æ¶å°æ°æ®æ»é¿åº¦,CNDTRæ¯dmaå©ä½æªä½¿ç¨æ°é |
| | | |
| | | if(DMACnt!=m_EUART_DMA_RXPtr) |
| | | if(time32_incr-lastusartdata_timer>300&&receiveingdata_flag) |
| | | { |
| | | //DMAææªå¤çæ°æ® |
| | | DMA_rxtemp=m_EUART_DMA_RXPtr+1; |
| | | delay_us(10); |
| | | overrun_flag=0; |
| | | if( DMA_rxtemp >= EUART_RX_BUF_SIZE ) |
| | | gpsdataready_flag = 1; |
| | | receiveingdata_flag = 0; |
| | | gps_packlen = rtcm_i; |
| | | rtcm_i = 0; |
| | | t1++; |
| | | waitggaend_flag = 1; |
| | | if(g_com_map[DEV_ROLE]) |
| | | { |
| | | DMA_rxtemp = 0; |
| | | UWBSendOnePackData(RTCMdata,gps_packlen); |
| | | gpsdataready_flag = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR);//DMACntæ¯DMAé鿥æ¶å°æ°æ®æ»é¿åº¦,CNDTRæ¯dmaå©ä½æªä½¿ç¨æ°é |
| | | if(DMACnt!=DMA_rxtemp&&(cmd_mode==0)) |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | receiveingdata_flag = 1; |
| | | lastusartdata_timer = time32_incr; |
| | | //Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); |
| | | RTCMdata[rtcm_i++] = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]; |
| | | // if(waitggaend_flag&&m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]=='*') |
| | | // { |
| | | // waitggaend_flag = 0; |
| | | // ggaend_idx = rtcm_i; |
| | | // } |
| | | //delay_us(10); |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | //DMAæè¶
è¿2使°æ®æªå¤ç |
| | | DMA_rxtemp = 0;//æ¸
空æ°ç»æé |
| | | datadelaycount = 0;//çå¾
æ¬¡æ°æ¸
é¶ |
| | | buftemp1 = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]; |
| | | buftemp2 = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr+1]; |
| | | if((buftemp1==0x55)&&(buftemp2==0xAA)) |
| | | { |
| | | //ç§æåè®® |
| | | cmd_mode = 1; |
| | | } |
| | | else if(buftemp1==RS485_Addr) |
| | | { |
| | | if((buftemp2==03)||(buftemp2==06)||(buftemp2==16))//åè½ç æ£ç¡® |
| | | { |
| | | //modubsåè®® |
| | | t1++; |
| | | cmd_mode=2; |
| | | DMA_rxtemp2=m_EUART_DMA_RXPtr+7; |
| | | if( DMA_rxtemp2 >= EUART_RX_BUF_SIZE-1 ) |
| | | { |
| | | DMA_rxtemp2 -= EUART_RX_BUF_SIZE; |
| | | overrun_flag=1; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | m_EUART_DMA_RXPtr+=2; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //æ æç ï¼å¹²æ°ç |
| | | if(cmd_mode==0) |
| | | { |
| | | m_EUART_DMA_RXPtr+=2; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | } |
| | | } |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | else |
| | | { |
| | | //åªæ1使°æ®æªå¤ç |
| | | if(++datadelaycount > WAITDELAYCOUNT) |
| | | { //è¶
åºçå¾
æ¬¡æ° |
| | | datadelaycount = 0; |
| | | cmd_mode=0; |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | } |
| | | } |
| | | if(cmd_mode==1) |
| | | { |
| | | //ç§æåè®® |
| | | while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); |
| | | m_EUART_DMA_RXPtr++; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | } |
| | | else if(cmd_mode==2) |
| | | { |
| | | //modbusåè®® |
| | | delay_ms(10);//çå¾
æ°æ®æ¥æ¶å®æ |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | if((overrun_flag==0&&DMACnt>DMA_rxtemp2)||(overrun_flag==1&&DMACnt<DMA_rxtemp&&DMACnt>DMA_rxtemp2)) |
| | | { while(m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) |
| | | { |
| | | RS485_RX_BUFF[i] = m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]; |
| | | m_EUART_DMA_RXPtr++; |
| | | if(++i >= EUART_RX_BUF_SIZE)i = 0; |
| | | if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | { |
| | | m_EUART_DMA_RXPtr = 0; |
| | | } |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | // m_EUART_DMA_RXPtr++;//æ°æ®æåä¸ä¸ä½ |
| | | // if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) |
| | | // { |
| | | // m_EUART_DMA_RXPtr = 0; |
| | | // } |
| | | t2++; |
| | | RS485_Service(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | m_bEUARTCheckingRec = 0; |
| | | DMACnt = EUART_RX_BUF_SIZE - (EUART_RX_DMA_CH->CNDTR); |
| | | MaxDataLen--; |
| | | } |
| | | m_bEUARTCheckingRec = 0; |
| | | } |
| | | |
| | | #ifndef EXUART_USE_TXDMA |
| | |
| | | t4++; |
| | | #ifdef BAUDRATE_19200 |
| | | delay_us(500); |
| | | #else |
| | | delay_us(10); |
| | | #endif |
| | | // temp32 = GPIOC->CRH; //C10å¤ç¨æ¨æ½è¾åº |
| | | // temp32 &= ~(0x00000000F<<8); |
| | |
| | | return (ch); |
| | | } |
| | | |
| | | HIDO_UINT32 HIDO_UtilParseFormat(HIDO_UINT8 *_pu8Src, HIDO_UINT32 _u32SrcLen, const HIDO_CHAR *_pcFmt, ...) |
| | | { |
| | | va_list sArgPtr = { NULL }; |
| | | int nParseNum = 0; |
| | | HIDO_CHAR cSign = ' '; |
| | | HIDO_BOOL bReturn = HIDO_FALSE; |
| | | |
| | | if((NULL == _pu8Src) || (NULL == _pcFmt)) |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | va_start(sArgPtr, _pcFmt); |
| | | |
| | | while ((*_pcFmt) != '\0') |
| | | { |
| | | if(0 == _u32SrcLen) |
| | | { |
| | | if(!(('%' == *_pcFmt) && ('e' == *(_pcFmt + 1)))) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if ((*_pcFmt) == '%') |
| | | { |
| | | _pcFmt++; |
| | | cSign = *(_pcFmt++); |
| | | |
| | | switch (cSign) |
| | | { |
| | | case '*': |
| | | { |
| | | while (_u32SrcLen) |
| | | { |
| | | if (*_pu8Src != *_pcFmt) |
| | | { |
| | | _pu8Src++; |
| | | _u32SrcLen--; |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | nParseNum++; |
| | | |
| | | break; |
| | | } |
| | | case 'd': |
| | | { |
| | | HIDO_BOOL bNeg = HIDO_FALSE; |
| | | HIDO_BOOL bBeg = HIDO_FALSE; |
| | | |
| | | HIDO_UINT32 nResult = 0; |
| | | int *pInt = NULL; |
| | | HIDO_CHAR c = ' '; |
| | | |
| | | pInt = va_arg(sArgPtr, INT32_PTR); |
| | | |
| | | while (_u32SrcLen) |
| | | { |
| | | c = *_pu8Src; |
| | | |
| | | if ((HIDO_FALSE == bBeg) && c == '-') |
| | | { |
| | | bNeg = HIDO_TRUE; |
| | | bBeg = HIDO_TRUE; |
| | | } |
| | | else if ((c >= '0') && (c <= '9')) |
| | | { |
| | | bBeg = HIDO_TRUE; |
| | | nResult = nResult * 10 + (c - '0'); |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | } |
| | | |
| | | _pu8Src++; |
| | | _u32SrcLen--; |
| | | } |
| | | |
| | | if (HIDO_TRUE == bNeg) |
| | | { |
| | | nResult = (~nResult) + 1; |
| | | } |
| | | |
| | | if (NULL != pInt) |
| | | { |
| | | *pInt = nResult; |
| | | } |
| | | |
| | | nParseNum++; |
| | | |
| | | break; |
| | | } |
| | | case 'x': |
| | | { |
| | | HIDO_UINT32 nResult = 0; |
| | | HIDO_UINT32 *pUint = NULL; |
| | | HIDO_CHAR c; |
| | | |
| | | pUint = va_arg(sArgPtr, UINT32_PTR); |
| | | |
| | | while (_u32SrcLen) |
| | | { |
| | | c = *_pu8Src; |
| | | |
| | | if ((c >= '0') && (c <= '9')) |
| | | { |
| | | nResult = (nResult << 4) + (c - '0'); |
| | | } |
| | | else if ((c >= 'a') && (c <= 'f')) |
| | | { |
| | | nResult = (nResult << 4) + (c - 'a' + 0x0A); |
| | | } |
| | | else if ((c >= 'A') && (c <= 'F')) |
| | | { |
| | | nResult = (nResult << 4) + (c - 'A' + 0x0A); |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | } |
| | | |
| | | _pu8Src++; |
| | | _u32SrcLen--; |
| | | } |
| | | |
| | | if (NULL != pUint) |
| | | { |
| | | *pUint = nResult; |
| | | } |
| | | |
| | | nParseNum++; |
| | | |
| | | break; |
| | | } |
| | | case 'p': |
| | | { |
| | | HIDO_DataStruct *pDptr = va_arg(sArgPtr, DATA_PTR); |
| | | HIDO_UINT8 *pStart = NULL; |
| | | HIDO_UINT32 nCount = 0; |
| | | |
| | | pStart = _pu8Src; |
| | | |
| | | while (_u32SrcLen) |
| | | { |
| | | if (*_pu8Src != *_pcFmt) |
| | | { |
| | | nCount++; |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | } |
| | | |
| | | _pu8Src++; |
| | | _u32SrcLen--; |
| | | } |
| | | |
| | | if(NULL != pDptr) |
| | | { |
| | | pDptr->m_pData = pStart; |
| | | pDptr->m_u32Len = nCount; |
| | | } |
| | | |
| | | nParseNum++; |
| | | |
| | | break; |
| | | } |
| | | case 'e': |
| | | { |
| | | HIDO_UINT8 **ppPtr = va_arg(sArgPtr, U8_PTR_PTR); |
| | | |
| | | if (ppPtr) |
| | | { |
| | | *ppPtr = _pu8Src; |
| | | } |
| | | |
| | | nParseNum++; |
| | | bReturn = HIDO_TRUE; |
| | | |
| | | break; |
| | | } |
| | | default: |
| | | { |
| | | bReturn = HIDO_TRUE; |
| | | nParseNum = 0; |
| | | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if(HIDO_TRUE == bReturn) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | else if (*_pu8Src == *_pcFmt) |
| | | { |
| | | _pu8Src++; |
| | | _pcFmt++; |
| | | _u32SrcLen--; |
| | | } |
| | | else |
| | | { |
| | | nParseNum = 0; |
| | | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | va_end(sArgPtr); |
| | | |
| | | return nParseNum; |
| | | } |