OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4891|回复: 4

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

[复制链接]

13

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2019-3-14
在线时间
25 小时
发表于 2019-5-3 19:24:18 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 米斯特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);
                }
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2019-3-14
在线时间
25 小时
 楼主| 发表于 2019-5-3 21:00:27 | 显示全部楼层
有没有大佬救命一下啊

调试以后发现是在PS_UpImage函数里,data没有返回值,也就是在USART_RX_BUF里没有找到应答包……是连应答包都没有找到,而不是应答包里的确认码错误。
所以应该还是USART_RX_BUF接收的时候出现了错误……但是一旦给USART_RX_BUF分配40000个字节内存,调试的时候就一直卡在分配内存那步过不去了……不分配这么多……又接收不完数据包……

有没有好一点的办法啊……如果USART_RX_BUF定义成二维数组,接收相同字节数量的数据,占用内存会少吗?

/***********************************************/
/*上传图像*/
//返回值:确认码
u8 PS_UpImage(void)
{
        u16 sum;
        u8 ensure;
        u8 *data;
       
        Send_Head();
        Send_Addr();
        Send_Flag(0x01);
        Send_Length(0x03);
        Send_CMD(0x0A);
       
        sum = 0x01 + 0x03 + 0x0A;
        Send_Check(sum);
       
        data = JudgeStr(15000);        //出错的地方,data没有接收到正确的值
       
       
        if(data)
        {
                DATA = data;
                ensure = data[9];
        }
        else
                ensure = 0xFF;
       
        return ensure;
}

回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1750
金钱
1750
注册时间
2015-6-11
在线时间
309 小时
发表于 2019-5-5 07:54:56 | 显示全部楼层
1. AS608内部存储的图像大小应该是192*192的,也就是需要36864字节,这是图像采集成功必须要申请的内存,所以你分配10000字节,对于包都没收齐,当然出错。
2.申请40000内存,卡在malloc申请这一步,这个很好解决,跟进去调试不就了解了。另外全局声明也是要占用这些内存,不过结构更清晰,你可以调试时使用
回复

使用道具 举报

13

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2019-3-14
在线时间
25 小时
 楼主| 发表于 2019-5-5 19:19:34 | 显示全部楼层
本帖最后由 米斯特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、你说的全局变量我会考虑看看,不知道还有什么建议吗?



回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-8
在线时间
10 小时
发表于 2022-4-13 16:54:07 | 显示全部楼层
我是用了ATK-301,发现返回的图像数据很大,带着疑问,看到这个帖子,看来手册上的东西跟实际确实不一样。楼主这个问题,我是这样做的:改造UART,DMA+空闲+FIFO,这样“拆”后再“合”。不过看到你这个都是19年的帖子了。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 13:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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