指纹模块的上传图像指令的数据包太大了!!要如何传给上位机??

2019-07-21 01:56发布

本帖最后由 米斯特R 于 2019-5-3 19:27 编辑

给指纹模块as608发送指令后,应答包之后的数据包有40000+个字节,将USARE2_RX_LEN改的很大后,keil会报错,应该是片内的SRAM溢出了。
所以用原来usart2的通信协议就不够了,然后我改了一下协议,将USARE2_RX_STA改为了32位,即0x00000000,最高位还是用来标记接收结束的,对于USART2_RX_BUF,我改为了这样定义 → u8 *USART2_RX_BUF;


这样在每次要接收的时候,用malloc给BUF分配一些内存,倒是也可以应付普通长度是应答包。

精英板是f103zet6,片内SRAM有64KB,在malloc.h里定义的可以管理的有40KB,即40*1024>数据包的总字节数,
但是,当我给他分配上万个字节内存后,编译可以通过,在PC的上位机软件给模块指令后,却仍然不能接收数据包,单片机会卡住,不能继续执行下面的语句。上位机用VS调试的时候,也无法检测到返回发送的数据包。

对了,我的上位机和单片机直接的通讯是用的蓝牙模块hc-05,9600波特率,usart3。

/*******************下面是主函数里while(1)语句里的部分**************************/

                if(USART3_RX_STA & 0x8000)
                {
                        
                        LCD_Fill(0,30,240,320,WHITE);
                        
                        rec_len = USART3_RX_STA & 0x7FFF;
                        USART3_RX_BUF[rec_len] = 0;
                        
                        
                        //验证数据首位是否为0x00
                        if(USART3_RX_BUF[0]==0)
                        {
                                
                                
                                USART2_RX_BUF = MEM_Malloc(SRAMIN , 100);
                                
                                //录入指纹
                                if(USART3_RX_BUF[1]==0x01)
                                {
                                        Enroll_FP();
                                        USART3_RX_STA = 0x0000;
                                        continue;
                                }
                                
                                
                                
                                if(USART3_RX_BUF[1]==0x0A)
                                {
                                        USART2_RX_BUF = MEM_Remalloc(SRAMIN,USART2_RX_BUF,1000);
                                        UpImage_FR();
                                        USART3_RX_STA = 0x0000;
                                        continue;
                                }
                                
                                
                                MEM_Free(SRAMIN,USART2_RX_BUF);
                                

                        }
                        USART3_RX_STA = 0x0000;



/**************************下面是UpImage_FR();函数里的部分************************/
void UpImage_FR(void)
{
        u8 ensure;
        u8 i;
        
        ensure = PS_UpImage();
        
        if(ensure == 0x00)
        {
                usart3_Printf("A");
                for(i=12 ; i<(USART2_RX_STA&0x7FFFFFFF) ; i++)
                {
                        usart3_Printf("%d",DATA);
                }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。