使用stm32f103c8t6單片機與as608模塊在網上使用開源的標準庫代碼,可以正常握手,但是使用重新編寫的hal庫代碼,一直無法正常通信,f4和f1的板子都嘗試過,總是找不到問題
,網上開源的as608通信協(xié)議代碼都試過了,基本相同但是都無法完成握手,上網查詢資料,有論壇說波特率從57600改為9600可以解決問題,我 修改后仍無法完成握手,其中delay函數(shù)移植的正點原子。實測定時準確,并未在工程加入過多無關代碼,只是為as608做測試 。有沒有大哥能幫我答疑解惑的  ,謝謝  
下面是串口二的接收代碼,經過測試也沒有問題,可以正常收發(fā)不知道是不是編譯器優(yōu)化的原因,目前是-03
- if(huart->Instance == USART2) /* 如果是串口1 */
- {
- HAL_UART_Receive_IT(&huart2, (uint8_t *)g_rx_buffer_usart2, RXBUFFERSIZE);
- if((g_usart2_rx_sta & 0x8000) == 0) /* 接收未完成 */
- {
- if(g_usart2_rx_sta & 0x4000) /* 接收到了0x0d */
- {
- if(g_rx_buffer_usart2[0] != 0x0a)
- {
- g_usart2_rx_sta = 0; /* 接收錯誤,重新開始 */
- }
- else
- {
- g_usart2_rx_sta |= 0x8000; /* 接收完成了 */
- }
- }
- else /* 還沒收到0X0D */
- {
- if(g_rx_buffer_usart2[0] == 0x0d)
- {
- g_usart2_rx_sta |= 0x4000;
- }
- else
- {
- g_usart2_rx_buf[g_usart2_rx_sta & 0X3FFF] = g_rx_buffer_usart2[0] ;
- g_usart2_rx_sta++;
- if(g_usart2_rx_sta > (USART_REC_LEN - 1))
- {
- g_usart2_rx_sta = 0; /* 接收數(shù)據(jù)錯誤,重新開始接收 */
- }
- }
- }
- }
- }
復制代碼- //串口發(fā)送一個字節(jié)
- static void MYUSART_SendData(u8 data)
- {
-
- USART2->DR = data;
- while((USART2->SR&0X40)==0);
- }
- //發(fā)送包頭
- static void SendHead(void)
- {
- MYUSART_SendData(0xEF);
- MYUSART_SendData(0x01);
- }
- //發(fā)送地址
- static void SendAddr(void)
- {
- MYUSART_SendData(AS608Addr>>24);
- MYUSART_SendData(AS608Addr>>16);
- MYUSART_SendData(AS608Addr>>8);
- MYUSART_SendData(AS608Addr);
- }
- //發(fā)送包標識,
- static void SendFlag(u8 flag)
- {
- MYUSART_SendData(flag);
- }
- //發(fā)送包長度
- static void SendLength(int length)
- {
- MYUSART_SendData(length>>8);
- MYUSART_SendData(length);
- }
- //發(fā)送指令碼
- static void Sendcmd(u8 cmd)
- {
- MYUSART_SendData(cmd);
- }
- //發(fā)送校驗和
- static void SendCheck(u16 check)
- {
- MYUSART_SendData(check>>8);
- MYUSART_SendData(check);
復制代碼- //與AS608握手 PS_HandShake
- //參數(shù): PS_Addr地址指針
- //說明: 模塊返新地址(正確地址)
- u8 PS_HandShake(u32 *PS_Addr)
- {
- SendHead();
- SendAddr();
- MYUSART_SendData(0X01);
- MYUSART_SendData(0X00);
- MYUSART_SendData(0X00);
- delay_ms(200);
- printf("sta = %d",g_usart2_rx_sta);
- if(g_usart2_rx_sta&0X8000)//接收到數(shù)據(jù)
- {
- if(//判斷是不是模塊返回的應答包
- g_usart2_rx_buf[0]==0XEF
- &&g_usart2_rx_buf[1]==0X01
- &&g_usart2_rx_buf[6]==0X07
- )
- {
- *PS_Addr=(g_usart2_rx_buf[2]<<24) + (g_usart2_rx_buf[3]<<16)
- +(g_usart2_rx_buf[4]<<8) + (g_usart2_rx_buf[5]);
- g_usart2_rx_sta=0;
- return 0;
- }
- g_usart2_rx_sta=0;
- }
- return 1;
- }
- //初始化,與AS608握手
- SysPara AS608Para;
- u8 ensure1;
- u16 ValidN;//模塊內有效指紋個數(shù)
- void AS608_Init(void)
- {
- //printf("\r\n與AS608模塊握手....\r\n");
- while(PS_HandShake(&AS608Addr))//與AS608模塊握手
- {
- delay_ms(400);
- //printf("\r\n未檢測到模塊!!!\r\n");
- delay_ms(800);
- //printf("\r\n嘗試連接模塊...\r\n");
- }
- printf("\r\n通訊成功!!!\r\n");
-
- ensure1=PS_ValidTempleteNum(&ValidN);//讀庫指紋個數(shù)
-
- ensure1=PS_ReadSysPara(&AS608Para); //讀參數(shù)
-
- }
復制代碼 圖片中的sta就是接收狀態(tài)嗎,一直接收不到正常代碼,先是0,再是以12遞增的數(shù)據(jù)
|