使用stm32f103c8t6单片机与as608模块在网上使用开源的标准库代码,可以正常握手,但是使用重新编写的hal库代码,一直无法正常通信,f4和f1的板子都尝试过,总是找不到问题
,网上开源的as608通信协议代码都试过了,基本相同但是都无法完成握手,上网查询资料,有论坛说波特率从57600改为9600可以解决问题,我 修改后仍无法完成握手,其中delay函数移植的正点原子。实测定时准确,并未在工程加入过多无关代码,只是为as608做测试 。有没有大哥能帮我答疑解惑的,谢谢
下面是串口二的接收代码,经过测试也没有问题,可以正常收发不知道是不是编译器优化的原因,目前是-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; /* 接收数据错误,重新开始接收 */
- }
- }
- }
- }
- }
复制代码- //串口发送一个字节
- static void MYUSART_SendData(u8 data)
- {
-
- USART2->DR = data;
- while((USART2->SR&0X40)==0);
- }
- //发送包头
- static void SendHead(void)
- {
- MYUSART_SendData(0xEF);
- MYUSART_SendData(0x01);
- }
- //发送地址
- static void SendAddr(void)
- {
- MYUSART_SendData(AS608Addr>>24);
- MYUSART_SendData(AS608Addr>>16);
- MYUSART_SendData(AS608Addr>>8);
- MYUSART_SendData(AS608Addr);
- }
- //发送包标识,
- static void SendFlag(u8 flag)
- {
- MYUSART_SendData(flag);
- }
- //发送包长度
- static void SendLength(int length)
- {
- MYUSART_SendData(length>>8);
- MYUSART_SendData(length);
- }
- //发送指令码
- static void Sendcmd(u8 cmd)
- {
- MYUSART_SendData(cmd);
- }
- //发送校验和
- static void SendCheck(u16 check)
- {
- MYUSART_SendData(check>>8);
- MYUSART_SendData(check);
复制代码- //与AS608握手 PS_HandShake
- //参数: 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)//接收到数据
- {
- 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;//模块内有效指纹个数
- 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);//读库指纹个数
-
- ensure1=PS_ReadSysPara(&AS608Para); //读参数
-
- }
复制代码 图片中的sta就是接收状态吗,一直接收不到正常代码,先是0,再是以12递增的数据
|