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

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);
                }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
米斯特R
1楼-- · 2019-07-21 03:17
 精彩回答 2  元偷偷看……
zc123
2楼-- · 2019-07-21 03:50
1. AS608内部存储的图像大小应该是192*192的,也就是需要36864字节,这是图像采集成功必须要申请的内存,所以你分配10000字节,对于包都没收齐,当然出错。
2.申请40000内存,卡在malloc申请这一步,这个很好解决,跟进去调试不就了解了。另外全局声明也是要占用这些内存,不过结构更清晰,你可以调试时使用
米斯特R
3楼-- · 2019-07-21 06:09
本帖最后由 米斯特R 于 2019-5-5 19:26 编辑
zc123 发表于 2019-5-5 07:54
1. AS608内部存储的图像大小应该是192*192的,也就是需要36864字节,这是图像采集成功必须要申请的内存,所 ...

你好,谢谢

1、我之前通过用官方给的上位机测试程序,保存识别的图像,就是256*288的。

2、然后我用XCOM给as608发送过上传图像的指令,返回代码里有1个应答包,287个数据包,1个结束包,每个数据包里的数据部分长度是0x80字节,也就是128字节,因为as608模块通过usart上传图像是两个像素取高四位合并成1个字节,所以也就是每个数据包里包括的是一行256个像素的数据。

3、我发帖的程序里用的是Remalloc  后来我换成了进入那个if语句先把开头申请的100字节内存释放,再用Malloc申请400100字节内存,没有卡住了,但是仍然接收不到任何应答包,更不用说后续的应答包了


4、你说的全局变量我会考虑看看,不知道还有什么建议吗?



一周热门 更多>