您当前的位置:五五电子网电子知识单元电路显示电路-显示屏通过串口在Windows的超级终端软件中显示调试信息的具体方法 正文
通过串口在Windows的超级终端软件中显示调试信息的具体方法

通过串口在Windows的超级终端软件中显示调试信息的具体方法

点击数:7776 次   录入时间:03-04 11:56:25   整理:http://www.55dianzi.com   显示电路-显示屏

  内容摘要:提出在目标系统脱离开发系统运行时,如何通过串口在Windows的超级终端软件中显示调试信息的一个具体方法。该方法有助于改进调试质量、缩短调试周期。

  1 ROM版本目标系统的调试问题

  一般的目标系统在开发工具环境下的调试并不困难,但最终系统必须脱离开发工具独立运行,即使在开发工具环境下完全正常的系统,ROM版本也往往会出现各种问题。原因有两人:一是开发工具硬件环境和最终的目标硬件环境不完全相同;二是外部因素不同,实验室中无法模拟现场的很多外部条件。对于硬件的调试,可以使用示波器等仪器;对于软件的调试,一般方法则是显示软件运行中的各种信息(如变量)。

  我们知道,C语言中的“printf()”函数是学习C语言的人最了解和熟悉的一个函数。很多C语言教材一开始就以显示“hello word”字符串来描述C语言的基本特片,其中唯一的语句就是调用“printf ()”函数。虽然该函数可以在屏幕上输出信息,但一般的用户软件中只在调试时用它来显示某些中间变量的结果,一旦程序调试完成,就将其删除了,真正的应用信息(如菜单字符等)显示往往其他的输出函数。对于使用和学习C语言的程序员来说,printf()由于可以同时输出不同类型的数据,因此,它的使用是软件调试的重要手段之一。

  在TURBO C2.0编译器中,printf()函数的实现依赖于操作系统。在嵌入式系统中,往往没有操作系统或者操作系统不提供这个功能,也可能没有显示输出部件,或显示设备的空间有限,只能用于显示应用信息。最常用的方法是通过目标系统的一个串口将信息发送给PC机来显示,PC机上可以使用Windows的“超级终端”软件接受和显示信息,如图1所示。

  这种系统的硬件很简单,我们只说明软件的实现方法。为此,我们必须设计专用的、可以显示各种数据类型的printf()函数,以达到从串口或其他途径输出信息的目的。一般的C函数不同,printf()函数的参数数量和类型是可变的,这是编写该函数的难点。要解决这个难是,必须先了解C函数参数传递的原理。

  2 C函数的参数传递原理

  C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体应用比如单片机以及嵌入式系统开发。

  C语言  avr单片机c语言高级程序设计是一种成功的系统描述语言,用C语言开发的UNIX操作系统就是一个成功的范例;同时C语言又是一种通用的程序设计语言,在国际上广泛流行。世界上很多着名的计算公司都成功的开发了不同版本的C语言,很多优秀的应用程序也都使用C语言开发的,它是一种很有发展前途的高级程序设计语言。

  在大部分情况下,C语言是通过堆栈存储器来传递参数(也有例外,C51的小模式则通过寄存器传递参数)。对于非指针类型,传递的不是原来类型的数据,而是对参数进行了类型转换,如字符类型(char)变成整型(int)拷贝到堆栈中、浮点类型(float)变成双精度类型(double),如表1所列。表1中未列出的,则没有转换[4]。

  表1

  对于像字符数组之类的指针参数,是将指针拷贝到堆栈中,而不是将数组中的所有内容传送到堆栈中。比如,对函数fun(char *STr,int i,float &a)的调用:

  char str[10]=“welcome”;

  int i=100; float a=1.14;

  ……

  fun(str,i,&a);

  各个参烽str,i在堆栈中按先右后左的次序存放,表2所列为调用函数fun( )开始时堆栈中的参数存放情况。此时函数fun()的代码上尚未执行,函数中的局部变量也是在堆栈中,所以在函数执行结束后,局部变量将消失。



www.55dianzi.com

表2 函数调用时的参数在堆栈中的存储情况(X86环境)

表2说明了两个问题:第一个问题是,每个参数在堆栈中的存储长度和参数的类型有关。对于指针类型参数,参数长度和编译模式有关:大模式下,地址包括段地址和偏移地址,共4字节;而小模式下,地址只有段内偏移,占2字节。第二个问题是,如果知道其中的一个参数地址和参数的类型,则可以得到任意参数的数值,并不需要知道参数的名称。比如在函数fun()中,可用以下代码显示各个参数的内容:

  void fun(char *str,int i,float *a)

  {

  void *p

  p=&str;

  printf("str=%s",str); p=(char **)p+1;

  printf("i=%d" ((int*)p));p=(int *)p+1;

  printf("i=%d" *((float *)p));

  }

3 PC机上的printf()函数的设计实现

现在,可以编写自己的printf()函数了。以下给出TC20编译环境下的具体实现代码,在其他环境下,可以根据该原理进行移植。也可以按位显示二进制数。对于其他类型,读者可以根据需要增删。

在实际应用中,可以修改其中的putchar()函数,将字符发到串口,就可以达到上述目的了。这里我们编写的函数还增加了数字的二进制显示,这对于很多位域应用是很有用处的。

  /*printf()函数的实现代码,为和库函数区别,特在各函数前增加前缀“my”*/

  void myprintf(char *FMt,…)

  {

  void *p;

  char ch;

  p=&fmt;p=(char**)p+1;/*指向堆栈中的下一个参数*/

  while(1){

  while((ch=*fmt++)!='%'{/*读入格式字符串*/

  if(ch= ='0')return;

  putchar(ch);

  };

  ch=*fmt++;

  switch(ch){ /*格式字符分析*/

  /*因为字符参数传递时也转换成整形参数传递,故同样处理*/

  case 'c':

  case'd':

  case'x':

  case'0':

  case'b':

  if(ch= ='c')myputchar(*(int *)p));

  if(ch= ='d')myprintn(*((int *)p),10);

  if(ch= ='x')myprintn(*((int *)p),16);

  if(ch= ='o')myprintn(*((int *)p),8);

  if(ch= ='b')myprintn(*((int *)p),2);

[1] [2]  下一页


本文关键字:信息  软件  Windows  显示电路-显示屏单元电路 - 显示电路-显示屏