找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 299|回复: 2
收起左侧

stm32与as608握手失败,换了几个单片机都不行

[复制链接]
ID:1101834 发表于 2024-9-17 11:19 | 显示全部楼层 |阅读模式
使用stm32f103c8t6单片机与as608模块在网上使用开源的标准库代码,可以正常握手,但是使用重新编写的hal库代码,一直无法正常通信,f4和f1的板子都尝试过,总是找不到问题
,网上开源的as608通信协议代码都试过了,基本相同但是都无法完成握手,上网查询资料,有论坛说波特率从57600改为9600可以解决问题,我 修改后仍无法完成握手,其中delay函数移植的正点原子。实测定时准确,并未在工程加入过多无关代码,只是为as608做测试 。有没有大哥能帮我答疑解惑的,谢谢
下面是串口二的接收代码,经过测试也没有问题,可以正常收发不知道是不是编译器优化的原因,目前是-03
  1. if(huart->Instance == USART2)             /* 如果是串口1 */
  2.     {
  3.                 HAL_UART_Receive_IT(&huart2, (uint8_t *)g_rx_buffer_usart2, RXBUFFERSIZE);
  4.         if((g_usart2_rx_sta & 0x8000) == 0)      /* 接收未完成 */
  5.         {
  6.             if(g_usart2_rx_sta & 0x4000)         /* 接收到了0x0d */
  7.             {
  8.                 if(g_rx_buffer_usart2[0] != 0x0a)
  9.                 {
  10.                     g_usart2_rx_sta = 0;         /* 接收错误,重新开始 */
  11.                 }
  12.                 else
  13.                 {
  14.                     g_usart2_rx_sta |= 0x8000;   /* 接收完成了 */
  15.                 }
  16.             }
  17.             else                                /* 还没收到0X0D */
  18.             {
  19.                 if(g_rx_buffer_usart2[0] == 0x0d)
  20.                 {
  21.                     g_usart2_rx_sta |= 0x4000;
  22.                 }
  23.                 else
  24.                 {
  25.                     g_usart2_rx_buf[g_usart2_rx_sta & 0X3FFF] = g_rx_buffer_usart2[0] ;
  26.                     g_usart2_rx_sta++;
  27.                     if(g_usart2_rx_sta > (USART_REC_LEN - 1))
  28.                     {
  29.                         g_usart2_rx_sta = 0;     /* 接收数据错误,重新开始接收 */
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.     }
复制代码
  1. //串口发送一个字节
  2. static void MYUSART_SendData(u8 data)
  3. {
  4.          
  5.         USART2->DR = data;
  6.         while((USART2->SR&0X40)==0);
  7. }
  8. //发送包头
  9. static void SendHead(void)
  10. {
  11.         MYUSART_SendData(0xEF);
  12.         MYUSART_SendData(0x01);
  13. }
  14. //发送地址
  15. static void SendAddr(void)
  16. {
  17.         MYUSART_SendData(AS608Addr>>24);
  18.         MYUSART_SendData(AS608Addr>>16);
  19.         MYUSART_SendData(AS608Addr>>8);
  20.         MYUSART_SendData(AS608Addr);
  21. }
  22. //发送包标识,
  23. static void SendFlag(u8 flag)
  24. {
  25.         MYUSART_SendData(flag);
  26. }
  27. //发送包长度
  28. static void SendLength(int length)
  29. {
  30.         MYUSART_SendData(length>>8);
  31.         MYUSART_SendData(length);
  32. }
  33. //发送指令码
  34. static void Sendcmd(u8 cmd)
  35. {
  36.         MYUSART_SendData(cmd);
  37. }
  38. //发送校验和
  39. static void SendCheck(u16 check)
  40. {
  41.         MYUSART_SendData(check>>8);
  42.         MYUSART_SendData(check);
复制代码
  1. //与AS608握手 PS_HandShake
  2. //参数: PS_Addr地址指针
  3. //说明: 模块返新地址(正确地址)        
  4. u8 PS_HandShake(u32 *PS_Addr)
  5. {        
  6.         SendHead();
  7.         SendAddr();
  8.         MYUSART_SendData(0X01);
  9.         MYUSART_SendData(0X00);
  10.         MYUSART_SendData(0X00);
  11.         delay_ms(200);
  12.         printf("sta = %d",g_usart2_rx_sta);
  13.         if(g_usart2_rx_sta&0X8000)//接收到数据
  14.         {               
  15.                 if(//判断是不是模块返回的应答包                                
  16.                                         g_usart2_rx_buf[0]==0XEF
  17.                                 &&g_usart2_rx_buf[1]==0X01
  18.                                 &&g_usart2_rx_buf[6]==0X07
  19.                         )
  20.                         {
  21.                                 *PS_Addr=(g_usart2_rx_buf[2]<<24) + (g_usart2_rx_buf[3]<<16)
  22.                                                                 +(g_usart2_rx_buf[4]<<8) + (g_usart2_rx_buf[5]);
  23.                                 g_usart2_rx_sta=0;
  24.                                 return 0;
  25.                         }
  26.                 g_usart2_rx_sta=0;                                       
  27.         }
  28.         return 1;               
  29. }
  30. //初始化,与AS608握手
  31. SysPara AS608Para;
  32. u8 ensure1;
  33. u16 ValidN;//模块内有效指纹个数
  34. void AS608_Init(void)
  35. {
  36.    //printf("\r\n与AS608模块握手....\r\n");
  37.         while(PS_HandShake(&AS608Addr))//与AS608模块握手
  38.         {
  39.                 delay_ms(400);
  40.                 //printf("\r\n未检测到模块!!!\r\n");
  41.                 delay_ms(800);
  42.                 //printf("\r\n尝试连接模块...\r\n");
  43.         }
  44.         printf("\r\n通讯成功!!!\r\n");

  45.         ensure1=PS_ValidTempleteNum(&ValidN);//读库指纹个数

  46.         ensure1=PS_ReadSysPara(&AS608Para);  //读参数

  47. }
复制代码
图片中的sta就是接收状态吗,一直接收不到正常代码,先是0,再是以12递增的数据

通信状态

通信状态
回复

使用道具 举报

ID:973695 发表于 2024-9-19 11:05 | 显示全部楼层
一般来说串口通信的问题可以先用 串口助手调试as608模块,再用串口助手接收 stm32f103c8t6单片机所发送的数据,如果还有问题再考虑是不是波特率误差
回复

使用道具 举报

ID:1101834 发表于 2024-10-12 12:05 | 显示全部楼层
stycx 发表于 2024-9-19 11:05
一般来说串口通信的问题可以先用 串口助手调试as608模块,再用串口助手接收 stm32f103c8t6单片机所发送的数 ...

好的谢谢。明白
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表