0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过串口在Windows上进行显示调试信息

电子设计 作者:电子设计 2018-11-01 09:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

如何通过串口在Windows上进行显示调试信息

我们知道,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

如何通过串口在Windows上进行显示调试信息

对于像字符数组之类的指针参数,是将指针拷贝到堆栈中,而不是将数组中的所有内容传送到堆栈中。比如,对函数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()的代码上尚未执行,函数中的局部变量也是在堆栈中,所以在函数执行结束后,局部变量将消失。

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

如何通过串口在Windows上进行显示调试信息

表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);

p=(int)p+1; /*指针移动*/

break;

case's':

myputs(*((char **)p));

p=(char **)p+1; /*指针移动*/

break;

default;

};

}

}

void myputs(char str) /*显示一个字符*/

{

while((*str)!='0')myputchar('str++);

}

/*显示任意进制的数值,b为二、八、十、十六等进制数*/

void myprintn(int,n,int b)

{

if(b= =16){ myprintx(n); return; }

if(n<0){ myputchar('-'); n=-n; };

if(n/b)

myprintn(n/b,b);

myputchar(n%b+'0');

}

void myprintx(int n) /*以十六进制显示1个数字*/

{

signed char i;

for(i=3;i>=0;i--)

if(((n》i*4)&0x0f)>=10)

/*当10,11…时,显示'a','b',…'f',*/

myputchar(((n》i*4)&0x0f)-10+'a');

else myputchar(((n》i*4)&0x0f)+'0');

}

/*

*在很多嵌入式系统中,并不存在PC一样的标准显示设备,

*通过修改该函数,可以将字符“ch”发送到串口,或者目

*标系统中的LED、LCD等显示器件。这样,就可以在脱

*离开发系统情况下显示调试信息,从而调试目标系统的软

*件或硬件。

*/

void myputchar(int ch)

{

……;/*此函数可供修改,将字符“ch”送到SBUF或其他显示器件就可以了*/

}

4 超级终端软件的使用

超级终端,即计算机显示终端,是计算机系统的输入、输出设备。计算机显示终端伴随主机时代的集中处理模式而产生,并随着计算技术的发展而不断发展。迄今为止,计算技术经历了主机时代、PC时代和网络计算时代这三个发展时期,终端与计算技术发展的三个阶段相适应,应用也经历了字符哑终端、图形终端和网络终端这三个形态。超级终端是一个通用的串行交互软件,很多嵌入式应用的系统有与之交换的相应程序,通过这些程序,可以通过超级终端与嵌入式系统交互,使超级终端成为嵌入式系统的“显示器”。

打开Windows的“超级终端”软件,再打开“hypertrm”,新建一个终端会话。在该会话的“属性\u35774设置\u32456终端仿真”菜单下,将终端仿真类型设置为VT100[5];在“属性\u35774设置\u32456终端设置\u23383字符集”菜单下设置字符集为“ASCII”;在“属性\u36830连接到\u37197配置\u24120常规\u26368最快速度”下设置通信波特率和目录系统一致,并将该对话框下“仅以该速度连接打开”设置选中;在“属性\u36830连接到\u37197配置\u36830连接\u36830连接首选项”下设置传送数据位数、校验方式。

超级终端的原理是将用户输入随时发向串口(采用TCP协议时是发往网口,这里只说串口的情况),但并不显示输入。它显示的是从串口接收到的字符。所以,嵌入式系统的相应程序应该完成的任务便是:

1、将自己的启动信息、过程信息主动发到运行有超级终端的主机;

2、将接收到的字符返回到主机,同时发送需要显示的字符(如命令的响应等)到主机。

在用超级终端显示时,唯一要求发送的数据必须以ASCII码形式发送(上述printf()函数就是如此)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20155

    浏览量

    328966
  • ROM
    ROM
    +关注

    关注

    4

    文章

    578

    浏览量

    88558
  • WINDOWS
    +关注

    关注

    4

    文章

    3697

    浏览量

    93238
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51083
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【EASY EAI】基于瑞芯微RV1126B的串口调试

    1.串口调试1.1接线说明EASYEAINano-TB支持调试串口调试,相关硬件接口如下图所示。串口
    的头像 发表于 11-14 11:46 6920次阅读
    【EASY EAI】基于瑞芯微RV1126B的<b class='flag-5'>串口</b><b class='flag-5'>调试</b>

    windows上用Eclipse IDE调试蜂鸟E203,用的开发板是哪个型号的?

    windows上用Eclipse IDE调试蜂鸟E203,用的开发板是哪个型号的,有哪位大佬调试出来了,求告知
    发表于 11-07 07:19

    【EASY EAI】基于瑞芯微RV1126B 的串口调试说明

    串口调试接线说明EASYEAINano-TB支持调试串口调试,相关硬件接口如下图所示。串口
    的头像 发表于 11-06 15:53 4921次阅读
    【EASY EAI】基于瑞芯微RV1126B 的<b class='flag-5'>串口</b><b class='flag-5'>调试</b>说明

    蜂鸟处理器上进行RT-Thread+ESP8266 wifi模块开发

    无线通信,相比于网口传输更加便携,功能更强大、开发更方便,基于串口控制的方式决定了其适合数据传输量不大,通信速率要求不高的情况,低功耗物联网系统中被经常使用。ESP8266模块通过定制的AT指令集
    发表于 10-31 09:02

    Windows和Linux环境下分别使用Olimex和蜂鸟调试器下载程序

    Windows系统下使用Olimex ARM-USB-TINY-H调试器时,需要通过Zadig安装olimex驱动程序。 ht
    发表于 10-31 08:26

    Windows下解决OpenOCD找不到设备及串口无法识别的方法

    RV-STAR开发板上使用的是一个双端口的FT2232串口转USB芯片,其中一个端口用于JTAG调试,另一个端口用于建立开发板到电脑的串口连接。 通常情况下,Windows系统会自动为
    发表于 10-20 11:25

    【上海晶珩睿莓1开发板试用体验】2、系统信息+连接WIFI+SSH调试

    功。 电脑上ping一下,能通 启用SSH 有了WIFI,我们就可以不用串口调试了。通过SSH,不仅能远程调试,还能
    发表于 08-17 09:55

    【干货分享】M-K1HSE开发板上使用SecureCRT工具进行调试

    SecureCRT是一款支持SSH协议的终端仿真软件,可通过串口或网口对开发板系统信息进行查看、对开发板系统进行
    的头像 发表于 08-12 08:07 1153次阅读
    【干货分享】<b class='flag-5'>在</b>M-K1HSE开发板上使用SecureCRT工具<b class='flag-5'>进行</b><b class='flag-5'>调试</b>

    【M-K1HSE开发板免费体验】系统调试工具 SecureCRT 的使用体验

    SecureCRT 是一款支持 SSH协议的终端仿真软件,可通过串口或网口对开发板系统信息进行查看、对开发板系统进行
    发表于 08-06 18:20

    如何在树莓派 AI HAT+上进行YOLO姿态估计?

    大家好,接下来会为大家开一个树莓派5和YOLO的连载专题。内容包括四个部分:树莓派5上使用YOLO进行物体和动物识别-入门指南树莓派5上开启YOLO姿态估计识别之旅!如何在树莓派AIHAT+
    的头像 发表于 07-20 20:34 617次阅读
    如何在树莓派 AI HAT+<b class='flag-5'>上进行</b>YOLO姿态估计?

    如何通过串口调试助手通过USB口读取电子标签信息和状态?

    因为刚好项目上需要用到NFC标签所以想能够通过USB口或者串口,用串口调试助手通过发命令的方式 读取电子标签
    发表于 06-17 07:51

    加载示例图像时,COM7的调试控制台hello_world不显示消息怎么解决?

    板是 mimxrt1180_evk。 我无法从板中找到 JP5。 使用示例映像进行测试时,调试控制台(通过 Windows11 电脑中的 J53、COM7 连接hello_world不
    发表于 03-25 07:01

    HarmonyOS NEXT 原生应用/元服务-ArkTS代码调试worker/taskpool调试

    开发者可通过worker或taskpool代码上设置断点,对worker/taskpool进行断点调试。 一、worker 调试 右键模块
    发表于 03-13 17:46

    瑞芯微开发板/主板Android调试串口配置为普通串口方法

    1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。内核设备树修改修改以下目录文件,关闭调试串口功能。arch/arm64
    的头像 发表于 02-11 11:57 1580次阅读
    瑞芯微开发板/主板Android<b class='flag-5'>调试</b><b class='flag-5'>串口</b>配置为普通<b class='flag-5'>串口</b>方法

    微软或已放弃Windows 11显示不兼容水印计划

    近日,知名科技媒体Windows Latest发布了一篇博文,引发了业界对微软Windows 11系统更新策略的广泛关注。据该博文报道,微软公司似乎已经放弃了Windows 11系统
    的头像 发表于 12-25 14:43 824次阅读