请教在mini板上同时使用指纹识别和SIM800C模块后出现的问题

2019-07-21 01:48发布

如题。目前我是将sim800c通信模块和atk-as608指纹识别模块都连接到了mini板上。由于初始代码都是用的P2串口,我就参考论坛里的教程将指纹识别模块改到了P5串口上,使得两个模块通过不同串口来跟mini主板进行通信以及接收指令。在代码方面并没有做太多修改,仅仅是修改了不同阶段下按键所提供的功能(即按键后进入哪一个功能函数)以及ui界面(主要是显示的字幕)。但现在遇到了一个问题,在阶段性验证时,按键进入指纹识别模块的功能后,整个功能会停留在尝试连接AS608模块的阶段下(屏幕显示玩AS608 FINGERPRINT.....一系列字幕后,会不断循环闪现TRY to connect again和Cannot connect with AS608这两行字)而无法进入指纹识别的主要功能阶段。但是单独烧录更改端口后的AS608相关代码,AS608则可以正常工作。详细研读未改动前的AS608代码后认为是没有没有握手成功(倾向于认为as608接收到了来自stm32的信号,但在返回信号时给stm32时出现了问题)。

另外由于两个模块在单独使用时使用的都是通用定时器4,在同时连接到stm32上后,编译时显示了冲突(重复定义),我便把as608模块的timer.h,time.c,uart.c做了修改,将其从使用通用定时器4改为了使用通用定时器5(tim4改为tim5)。


相关部分代码粘贴如下:

..........
while(1)
{
  delay_ms(10);
  sim_at_response(1);//检查GSM模块发送过来的数据,及时上传给电脑
  if(sim_ready)//SIM卡就绪.
  {
   key=KEY_Scan(0);
   if(key)
   {
      switch(key)
      {
     case KEY0_PRES:
      fingercheck(); //指纹模块
      break;
     case KEY1_PRES:
      sim800c_sms_test();  //短信模块
      break;
     case 3:
      OTP();  //随机数生成
      break;
      }
      gate_seturity_ui(40,30);
      timex=0;
   }   
  }
  if(timex==0)  //2.5秒左右更新一次
  {
   if(sim800c_gsminfo_show(40,225)==0)sim_ready=1;
   else sim_ready=0;
  }
  if((timex%20)==0)LED0=!LED0;//200ms闪烁
  timex++;  
}  
........
........
u8 fingercheck(void)
{      //这一部分我是直接从AS608实验的主函数部分复制过来了,准备先看看指纹模块功能靠按键来触发后能否正常运行,还未进行修改。
/*u8 key;*/
    u8 ensure;
u8 key_num;
char *str;

/*POINT_COLOR=RED;
LCD_Clear(WHITE);
Show_Str_Mid(0,30,"已进入指纹验证模式",16,240);
Show_Str_Mid(0,50,"请将手指放在传感器上",16,240);
Show_Str_Mid(0,70,"按下WK_UP退回上一级菜单",16,240); */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
PS_StaGPIO_Init(); //初始化FR读状态引脚
POINT_COLOR=RED;
/*加载指纹识别实验界面*/
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,0,"AS608 Fingerprint module test",16,240);              
Show_Str_Mid(0,20,"Author: @ALIENTEK",16,240);         
  POINT_COLOR=BLUE;
Show_Str_Mid(0,40,"Connect with AS608....",16,240);
while(PS_HandShake(&AS608Addr))//与AS608模块握手
{
  LCD_Fill(0,40,240,80,WHITE);
  Show_Str_Mid(0,40,"Cannot connect with AS608!",16,240);
  delay_ms(1000);
  LCD_Fill(0,40,240,80,WHITE);
  Show_Str_Mid(0,40,"Try to connect again....",16,240);
  delay_ms(1000);   
}
LCD_Fill(0,40,240,320,WHITE);
Show_Str_Mid(0,40,"Connect success!",16,240);//通讯成功
str=mymalloc(30);
sprintf(str,"Baudrate:%d   Addr:%x",uart5_baund,AS608Addr);//显示波特率
Show_Str(0,60,240,16,(u8*)str,16,0);
delay_ms(100);
ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
if(ensure!=0x00)
  ShowErrMessage(ensure);//显示确认码错误信息
ensure=PS_ReadSysPara(&AS608Para);  //读AS608模块参数
if(ensure==0x00)
{
  mymemset(str,0,50);
  sprintf(str,"RemainNum:%d    Level:%d",AS608Para.PS_max-ValidN,AS608Para.PS_level);//显示剩余指纹数量和安全等级
  Show_Str(0,80,240,16,(u8*)str,16,0);
}
else
  ShowErrMessage(ensure);
myfree(str);
AS608_load_keyboard(0,170,(u8**)kbd_menu);//加载虚拟键盘
while(1)
{
  key_num=AS608_get_keynum(0,170);
  if(key_num)
  {
   if(key_num==1)Del_FR();  //删指纹
   if(key_num==3)Add_FR();  //录指纹         
  }
  if(PS_Sta)  //检测PS_Sta状态,如果有手指按下
  {
   press_FR();//刷指纹   
  }     
}
}
........
int main(void)
{  //这一部分我在研读SIM800C模块和AS608模块的主函数代码后根据自身判断做了一点修改,主要是把二者不重复的函数加了进来。
u8 key,fontok=0;
  
    NVIC_Configuration();  
delay_init();               //延时函数初始化   
uart_init(115200);            //串口初始化为9600
    usmart_dev.init(72);       //初始化USMART   
LCD_Init();             //初始化液晶
LED_Init();                   //LED初始化  
KEY_Init();             //按键初始化                    
  USART2_Init(115200);          //初始化串口2
    uart5_init(uart5_baund);
tp_dev.init();            //触摸屏初始化
  mem_init();             //初始化内存池     
  exfuns_init();            //为fatfs相关变量申请内存  
    f_mount(fs[0],"0:",1);           //挂载SD卡
  f_mount(fs[1],"1:",1);           //挂载FLASH.
key=KEY_Scan(0);  
if(key==KEY0_PRES)           //强制校准
{
    LCD_Clear(WHITE);          //清屏
    tp_dev.adjust();            //屏幕校准  
    LCD_Clear(WHITE);          //清屏
}
fontok=font_init();           //检查字库是否OK
if(fontok||key==KEY1_PRES)       //需要更新字库(字库不存在/KEY1按下)   
{
  LCD_Clear(WHITE);       //清屏
   POINT_COLOR=RED;    //设置字体为红 {MOD}           
  LCD_ShowString(60,50,200,16,16,"ALIENTEK STM32");
  while(SD_Initialize())   //检测SD卡
  {
   LCD_ShowString(60,70,200,16,16,"SD Card Failed!");
   delay_ms(200);
   LCD_Fill(60,70,200+60,70+16,WHITE);
   delay_ms(200);      
  }                  
  LCD_ShowString(60,70,200,16,16,"SD Card OK");
  LCD_ShowString(60,90,200,16,16,"Font Updating...");
  key=update_font(20,110,16); //更新字库
  while(key)                  //更新失败  
  {        
   LCD_ShowString(60,110,200,16,16,"Font Update Failed!");
   delay_ms(200);
   LCD_Fill(20,110,200+20,110+16,WHITE);
   delay_ms(200);         
  }     
  LCD_ShowString(60,110,200,16,16,"Font Update Success!");
  delay_ms(1500);
  LCD_Clear(WHITE);           //清屏        
}  
gate_security();                 
}
由于个人水平有限,实在看不出哪里出错,恳请各位大神前来支个招或找出错误,并致以诚挚的感谢


0条回答

一周热门 更多>