本帖最后由 米斯特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);
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你好,谢谢
1、我之前通过用官方给的上位机测试程序,保存识别的图像,就是256*288的。
2、然后我用XCOM给as608发送过上传图像的指令,返回代码里有1个应答包,287个数据包,1个结束包,每个数据包里的数据部分长度是0x80字节,也就是128字节,因为as608模块通过usart上传图像是两个像素取高四位合并成1个字节,所以也就是每个数据包里包括的是一行256个像素的数据。
3、我发帖的程序里用的是Remalloc 后来我换成了进入那个if语句先把开头申请的100字节内存释放,再用Malloc申请400100字节内存,没有卡住了,但是仍然接收不到任何应答包,更不用说后续的应答包了
4、你说的全局变量我会考虑看看,不知道还有什么建议吗?
一周热门 更多>