让人摸不着头脑的串口通讯错误(基于51单片机)
2013-05-01 18:50
351 查看
这是我在做SD卡测试实验时遇到的一个莫名其妙的问题,希望可以和大家共同的探讨,也希望知道原因的人可以给我提建议和指导我改正这个错误。这里先行谢过!
这个错误说是串口错误吧,有点牵强,因为那段用来串口通讯的源码肯定是没问题的,但是当和SD卡模块的代码组合在一起就产生莫名其妙的问题,
具体的问题主要是如下症状:
本程序中串口部分主要功能是发送一长串的字符(hello MCU),但是串口调试工具只能接受某一位(h),如果是单纯的串口实验,我肯定会检查看TI标志是否清零,但是这段串口通讯的程序是没有问题的,因为我单独拉出来测试过的。
我的初期解决方法:
1、起先我怀疑是不是单片机的内部RAM不够了,毕竟一般单片机的RAM较小(其实担心这个也是多余的,因为我的单片机是STC89C54RD+的,有1KB的RAM),但是抱着可能出错的心态还是看了一下。于是我从上到下逐一的删除函数和变量,删了好多,测试还是没能通过。
2、抱着势要找错错误原因的决心,我继续往下删。最后删掉一个函数后,这样的错误没了。于是我接下来的重点便是在这个函数上。
3、将上面的函数注释后的确没错误了,处于内存的考虑,我将函数内的语句全部注释,但发现还是有错
4、于是我又写了一个test的测试程序,发现参数只要不是小于两个就可以正常工作
5、我自己怀疑是不是前面变量太多了(自己瞎想了,肯定不是这个问题),于是删掉了其他函数,结果发现还是出错,只要不把上面的SD_read_signal()函数注释掉怎么改都不行,我看来看去这个函数也没有问题,所以非常的郁闷
6、后来我又想是不是什么变量影响了TI标志位,可惜没能找到
这次的查错还是以失败告终,希望大家给以观点和看法,谢谢了,小弟不甚感激!!!
这个错误说是串口错误吧,有点牵强,因为那段用来串口通讯的源码肯定是没问题的,但是当和SD卡模块的代码组合在一起就产生莫名其妙的问题,
具体的问题主要是如下症状:
本程序中串口部分主要功能是发送一长串的字符(hello MCU),但是串口调试工具只能接受某一位(h),如果是单纯的串口实验,我肯定会检查看TI标志是否清零,但是这段串口通讯的程序是没有问题的,因为我单独拉出来测试过的。
我的初期解决方法:
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标志位,可惜没能找到
这次的查错还是以失败告终,希望大家给以观点和看法,谢谢了,小弟不甚感激!!!
相关文章推荐
- 零基础学FPGA(十二)一步一脚印之基于FIFO的串口发送机设计全流程及常见错误详解
- 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)
- 串口通讯奇偶校验位的设置导致数据错误
- 基于PLC-C#串口通讯,温度检测和转速监控的c#/.Net实现。
- 在基于单文档(SDI)程序中应用MSCOMM串口通讯控件
- 基于VB的串口通讯及其软件实现
- 20120725-51单片机IO口模拟串口通讯5
- 基于Arm板linux嵌入式系统RS485串口读写通讯
- 基于ARM+CPLD的多串口通讯协议转换方案
- 基于C++的串口通讯//使用MsComm控件//SetRThreshold()函数的使用,根据数据数量触发端口
- 基于PC/104的多串口通讯的设计
- 在Delphi环境下基于SPCOMM控件开发串口通讯报文字节丢失的问题解决
- MFC单文档之基于MSCOMM的多个编辑框的串口通讯
- 基于rs232串口通讯的Verilog设计
- 基于rs232串口通讯的Verilog设计
- 利用JNI实现java的串口通讯技术(基于C++的底层)
- 基于FPGA的串口通讯设计与实现
- VC中基于文档(SDI/MDI)程序中能直接用串口MSComm通讯控件吗?
- 基于WIN32 API的串口通讯软件的设计
- 抛砖引玉----基于51串口通讯编程软件架构剖析