51单片机串口人机交互调试器 [原创首发]
本帖最后由 rain73 于 2014-7-13 19:16 编辑调试51单片机,很多时候需要实时了解各个存储器(寄存器)的值,或者需要修改其中的值,通常的办法是增加调试代码来完成,最后再将其删除。
过程既麻烦又不方便,那么有没有什么好的办法呢?这个串口人机交互调试器就能帮到你。
其原理是通过51单片机的串口与PC通信,PC发送指令,然后单片机执行指令完成相应的功能。目前调试器的代码暂不开源,以库的形式发布给
大家使用。
使用示例
先看一下 help 的内容:
目前有四个指令,getr(读寄存器),setr(写寄存器),geti(读内存),seti(写内存)。
示例:读P0口内容
DEBUG-51> getr p0
p0:FFH
示例:写P1口内容
DEBUG-51> setr p1 0x0F
示例:读0x80内存地址内容
DEBUG-51> geti 0x80
80H:00H
示例:写0x80内存地址内容
DEBUG-51> seti 128 255
调用方法
假设你的主程序是这样的:
#include <REG51.H>
#include "DEBUG51.H"
sbit LED = P0^0;
/* 主函数 */
void main() {
UART_Init(); //串口初始化
while (1) {
LED = ~ LED;
Delay_1ms();
debug51();
}
}
只需加入上面标注为红色的三行代码(debug51()函数必须放在主循环中),就可以调用人机交互调试器了。加入调试器的功能后,不会影响
原有程序的功能,但由于波特率中断的影响,主程序运行将会变慢。
当然还要把库文件放至你的工程项目中,下载后面的附件 DEBUG51.rar ,然后把里面的两个文件(DEBUG51.H, DEBUG51.LIB)解压至你的
项目目录中,再在工程中引用一下DEBUG51.LIB即可:
然后重新编译你的项目,下载至单片机中,就可以使用调试器了!
连接至PC
把单片机与PC间通过串口线连接好后,就可以测试通信状况了。PC端通信软件可以用超级终端,推荐使用SecureCRT,设置好通信参数:
端口(根据串口线连接设置),波特率(9600),数据位(8),奇偶校验(无),停止位(1),数据流控制(全部无)
然后打开刚设置的连接,再上电或复位单片机,如没什么意外,应该可以接收到欢迎信息:
如没有正确接收到信息,主要跟晶振频率有关,默认的晶振频率是11.0592MHz,这个频率适合于串口通信,如果不能更换晶振,也可以改为其它的
频率。修改 DEBUG51.H 中的 XTAL 值即可,如果是12MHz晶振,最好把波特率同时改为4800,这样误差小一点。
对于命令的使用方法,可随时键入 help 或 ? 即可显示,需注意一点,所有命令及参数都必须小写。
下一步准备开发的功能,可以读写内存块,例如连续读出一个数组,或许还能做到单步执行的功能。 觉得读写变量的值才有用。用C不太关心内存地址。 挺好的,高手都需要用到汇编的。 LIB...?这个没什么神秘的。。。 想法很独特,不过俺习惯使用LCD或者数码管来调试,显示的内容多,速度够快,而且也很直观。。。嘿嘿 楼主开放源代码吧。 czg1411 发表于 2014-7-13 17:36
觉得读写变量的值才有用。用C不太关心内存地址。
当要深入一点时,就需要关心内存。再一个有keil这样的编译环境,还怕找不到变量? lswhome 发表于 2014-7-13 18:12
想法很独特,不过俺习惯使用LCD或者数码管来调试,显示的内容多,速度够快,而且也很直观。。。嘿嘿 ...
有电脑显示屏多和快?我就是因为LCD显示的内容太少了才另外搞的这个。把 idata, xdata, code 全部读出来都没有问题! 预编译,一个定时器,任意一个IO=模似串口 饭桶 发表于 2014-7-13 18:03
挺好的,高手都需要用到汇编的。
现在用汇编的大部分是C写的程序放不下或C编译器不好用。。 开源吧,现在用51的年轻人不多了。
或者把东西升级到ARM上或许还能用用 rain73 发表于 2014-7-13 18:46
有电脑显示屏多和快?我就是因为LCD显示的内容太少了才另外搞的这个。把 idata, xdata, code 全部读出来 ...
不是的,你单片机要和电脑通信,速度也就是9600bps,能有多快?再说了,谁调试程序会经常调试到整个内存,一般也就是观察几个变量而已,超过10个的都不多吧。。。要速度快,数码管是最快的,LCD次之,串口连电脑,速度是最慢的。慢速的,调试一些要求速度的算法,根本就没法调试。。。因为调试代码放进去,就会导致原本的程序时序出问题,根本就没法调试! lswhome 发表于 2014-7-14 18:25
不是的,你单片机要和电脑通信,速度也就是9600bps,能有多快?再说了,谁调试程序会经常调试到整个内存 ...
速度快了你看得过来?就算9600的速率在LCD或LED上显示,就是模糊一片,这有什么意义?串口输出显示可以在屏上留历史数据。
只观察几个变量,直接可以用KEIL的仿真调试就行。如果你用到64K外存,或SD卡之类,要观察这些海量数据,你只能望洋兴叹了吧? 串口调试的好处是显而易见的。目前这个实现是工作于被动模式,在我的实现里还有一种主动模式,这就跟LCD的作用无差异了,缺点是需要增加调试代码。
在任何地方都可以直接调用,输出就在电脑屏幕上:
UART_ShowBin1(unsigned char Data); //把数据以二进制字面值显示(00000000~11111111)
UART_ShowHex1(unsigned char Data); //把数据以十六进制字面值显示(00~FF)
UART_ShowHex2(unsigned int Data); //把数据以十六进制字面值显示(0000~FFFF)
UART_ShowDec(int Data); //把数据以十进制字面值显示(-9999~9999)
本帖最后由 lswhome 于 2014-7-14 20:57 编辑
rain73 发表于 2014-7-14 20:03
速度快了你看得过来?就算9600的速率在LCD或LED上显示,就是模糊一片,这有什么意义?串口输出显示可以在 ...
晕倒,有种东西叫OLED,呵呵,速度还是非常快的,海量的数据,那就还是串口输出,呵呵。。。这个是没办法的事,我不是说串口不好,只是在一些要求实时观察并且对时序要求比较严格的程序里调试,用串口不太方便,调试的方法多的是,能够采用合适的调试方法去调试才是王道。
曾经见过有的人调试代码,那真是为了调试而调试,比如他的程序要通过串口通信,同时还非要用串口去调试,搞的焦头烂额的,何苦呢?一个12864就轻松搞定。。。 lswhome 发表于 2014-7-14 20:55
晕倒,有种东西叫OLED,呵呵,速度还是非常快的,海量的数据,那就还是串口输出,呵呵。。。这个是没办法 ...
其它不论了,就你提到的显示速度,刷屏快了你的眼睛能反应过来,不是模糊一片?这可不是放视频啊。 不错,调试的另一种方法,顶楼主 楼主那个不开源么 搞arm的就呵呵了,直接debug好多了,什么变量,什么内存都可以看到! 搞arm的就呵呵了,直接debug好多了,什么变量,什么内存都可以看到! 我点下载,链接别禁掉,有这样的情况吗? 顶楼主,读内存块的功能,现在出了吗,我是你粉丝{:lol:} 还是调试仿真好点,或者加显示器直观 {:titter:} 不喜欢用来源不明的所谓 “库”,,,,{:titter:} 风雨无阻88 发表于 2016-4-11 11:27
顶楼主,读内存块的功能,现在出了吗,我是你粉丝
在去年发这个贴之后就已经完成了,不过看大家兴趣不大,就没有整理发上来。不同的是主贴这个版本是在STC89下开发的,
后来的版本是在STC15下开发的,添加了很多寄存器,基础功能在两种MCU下应是一样的。
有兴趣的话我整理发上来。
wkman 发表于 2016-4-11 11:38
不喜欢用来源不明的所谓 “库”,,,,
这是调试库,不是应用库,有问题也不影响你的程序的,呵呵。 好资料,非常感谢。 楼主有意的话,就开放源码,大家一起完善一下 zhongsandaoren 发表于 2016-4-11 11:36
还是调试仿真好点,或者加显示器直观
你的方法有几个功能看好不好做?
1、连续输出一个页面512字节的数据;
2、输入不同的地址、不同的数据测试函数正确性,测试器件的功能是否正确;
3、省去了键盘的输入与显示的输出,针对核心功能进行开发,提高效率;
运用得好,可以省却很多烧写次数,并轻松测试逻辑的正确性。
通过这个交互程序,我在开发中效率提高不少,并发现了很多器件的细节,对完善程序有很大的好处。 Is it also suitable for stc-51? Or just only at89s51? YS126 发表于 2016-4-12 01:02
Is it also suitable for stc-51? Or just only at89s51?
其实差别仅在于串口的配置,主楼那个库应适用于所有兼容INTEL 51串口的所有MCU。
如果修改源代码,可适用于所有带串口的MCU,包括STM32。 学习了…… 楼主开放源代码吧。 支持,串口打印时最快的,而且可以生成记录文件,打印微秒级时间戳。LED灯和OLED的输出不能持久化。
页:
[1]