让人摸不着头脑的串口通讯错误(基于51单片机)

这是我在做SD卡测试实验时遇到的一个莫名其妙的问题,希望可以和大家共同的探讨,也希望知道原因的人可以给我提建议和指导我改正这个错误。这里先行谢过!

这个错误说是串口错误吧,有点牵强,因为那段用来串口通讯的源码肯定是没问题的,但是当和SD卡模块的代码组合在一起就产生莫名其妙的问题,

具体的问题主要是如下症状:

本程序中串口部分主要功能是发送一长串的字符(hello MCU),但是串口调试工具只能接受某一位(h),如果是单纯的串口实验,我肯定会检查看TI标志是否清零,但是这段串口通讯的程序是没有问题的,因为我单独拉出来测试过的。

让人摸不着头脑的串口通讯错误(基于51单片机)_第1张图片

我的初期解决方法:

1、起先我怀疑是不是单片机的内部RAM不够了,毕竟一般单片机的RAM较小(其实担心这个也是多余的,因为我的单片机是STC89C54RD+的,有1KB的RAM),但是抱着可能出错的心态还是看了一下。于是我从上到下逐一的删除函数和变量,删了好多,测试还是没能通过。

2、抱着势要找错错误原因的决心,我继续往下删。最后删掉一个函数后,这样的错误没了。于是我接下来的重点便是在这个函数上。

uchar SD_read_signal(ulong addr,uchar *Buffer)//参数:扇区地址,缓冲区指针    
{ 
    uchar cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF};  //读单块
   addr = addr << 9;                 //addr = addr * 512 
   cmd[1] = ((addr & 0xFF000000) >>24 );
   cmd[2] = ((addr & 0x00FF0000) >>16 );
   cmd[3] = ((addr & 0x0000FF00) >>8 ); 
   SD_read_block(cmd,Buffer,512); 
   return 0;
}


3、将上面的函数注释后的确没错误了,处于内存的考虑,我将函数内的语句全部注释,但发现还是有错

4、于是我又写了一个test的测试程序,发现参数只要不是小于两个就可以正常工作

uchar test(ulong addr,uchar i)//两个的参数最后串口还是错误,如果是一个参数就能通过
{
	
	return 0;
}

5、我自己怀疑是不是前面变量太多了(自己瞎想了,肯定不是这个问题),于是删掉了其他函数,结果发现还是出错,只要不把上面的SD_read_signal()函数注释掉怎么改都不行,我看来看去这个函数也没有问题,所以非常的郁闷

6、后来我又想是不是什么变量影响了TI标志位,可惜没能找到

 

这次的查错还是以失败告终,希望大家给以观点和看法,谢谢了,小弟不甚感激!!!

你可能感兴趣的:(单片机)