发布信息

单片机串口通信的重要性及传统调试方式的局限性

作者:软荐小编      2024-09-06 15:02:02     190

介绍

单片机系统中,串行口(UART,Universal Asynchronous Receiver and Transmitter Interface)是一个非常重要的部件,单片机串行口通常用于通过RS232/RS485电平转换芯片与上位机连接,实现上位机与下位机之间的数据交换、参数设置、网络组建以及各种外部设备的连接等。RS232/RS485串行接口总线具有成本低廉、简单可靠、使用方便等特点,其悠久的历史使得它至今仍得到广泛的应用;尤其对于数据量较小的场合,串行通信仍是一种很好的选择,有着广阔的应用前景。

在单片机编程中,串口起着重要作用,传统上串口程序调试往往采用专用的单片机硬件仿真器,在写好程序后利用仿真器设置断点,观察变量和程序流程,一步一步调试程序,纠正错误。使用硬件仿真器的确是一种有效的方法,但也存在一些缺点:

很多模拟器并不能实现完全的硬件模拟,这就可能导致模拟正常,但实际运行时却会出现错误;还存在模拟无法通过,但实际运行时却正常的情况。

对于一些较新的芯片或者表面贴装芯片,要么没有合适的仿真器或者仿真头;要么硬件仿真器非常昂贵,不容易买到。

有时由于设备内部空间有限,不方便连接模拟头。

有些模拟器是简单的在线模拟器,在仿真的时候会存在很多限制,比如速度慢,实时性或稳定性较差,有断点限制等,给仿真带来不便。

调试前的准备

下面介绍一种利用Keil软件仿真功能实现51单片机串口调试用户程序的方法,使用这种方法不需要硬件仿真器,甚至不需要用户电路板,所需要的只是:

①硬件:普通电脑1台(需有2个标准串口)、串口线1条(两端都是母头,连接关系如图1所示)。

②串口软件可以是自己编写的专用调试或上下位机通讯软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用于数据的收发,如果没有合适的串口调试软件,可以使用我编写的一个免费串口工具TurboCom,它除了具有其他软件的数据收发功能外,还具有定时轮流发送自定义数据帧和自动应答(接收到指定的数据帧后,自动返回相应数据帧)这两个非常有用的功能,特别适合用于老化测试。这个小工具可以在网上下载。

基本调试命令介绍

这种串口调试方法主要利用了Keil强大的软件仿真功能。在新版本(高于6.0)的Keil软件中,软件的仿真能力增强了,更多的单片机功能可以通过软件进行仿真。在这些功能中,最重要的一个功能就是用电脑的串口模拟单片机的串口(这个和很多软件在仿真时采用的刺激文件方式不同,它可以直接和其他串口进行通讯,更加方便灵活)。需要用到的命令有两个:ASSIGN和MODE。

2.1 ASSIGN 命令

将单片机串口和电脑串口绑定单片机仿真软件教程,基本用法是:ASSIGN channeloutreg

其中:channel代表计算机的串口,可以是COM1、COM2、COM3或COM4;inreg和outreg代表单片机的串口,对于只有一个串口的普通单片机来说,分别是SIN和SOUT;对于有两个或两个以上串口的单片机来说,分别是SnIN和SnOUT(n=0,1,…,即单片机的串口号)。

仿真单片机教程软件有哪些_单片机仿真器软件_单片机仿真软件教程

图1 串口连接图

例如:

分配 COM1SOUT

将电脑串口1与单片机串口绑定(适用于只有一个串口的单片机)。

分配 COM2S0OUT

将电脑串口2和单片机串口0绑定(对于有多个串口的单片机,​​要注意串口号的位置)。

需要注意的是,参数的括号不能省略,但是outreg没有括号。

2.2 MODE命令

设置绑定的电脑串口的参数。基本用法是:

MODE COMx 波特率、奇偶校验、数据位、停止位

其中:COMx(x=1,2,……)表示计算机的串口号;baudrate表示串口的波特率;parity表示校验方式;databits表示数据位长度;stopbits表示停止位长度。

例如:

模式 COM1 9600, n, 8, 1

设置串口1,波特率为9600、无奇偶校验、8个数据位、1个停止位。

模式 COM2 19200, 1, 8, 1

设置串行端口2。波特率为19 200、奇校验、8个数据位和1个停止位。

使用上面两个命令,就可以把电脑的串口模拟成单片机的串口,在进行软件模拟的时候,所有发送到绑定的电脑串口的数据都会被转发到Keil模拟出来的单片机串口上,用户程序可以通过中断处理程序或者查询的方式接收数据;同样,单片机程序中发送到单片机串口的数据也会通过绑定的电脑串口发送出去,可以被其他软件模拟调试单片机的串口部分。需要注意的是,这两个命令需要配合使用。

仿真单片机教程软件有哪些_单片机仿真软件教程_单片机仿真器软件

2.3 模拟步骤

首先用一根串口线把电脑的两个串口连接起来(也可以两台电脑的两个串口都连接起来),两个串口一个用来模拟单片机串口,一个用来调试程序,这个由用户自行分配,没有特殊要求。

其次,编写用户程序并编译。

然后,设置工程文件(Project)的相关参数,如图2、图3所示。主要选择软件仿真模式(Use Simulator)和晶振参数。

仿真单片机教程软件有哪些_单片机仿真软件教程_单片机仿真器软件

图2 仿真参数设置

为了避免每次进入仿真状态都要输入串口参数设置命令,可以建立一个初始化文件,初始化文件就是一个普通的文本文件,内容就是仿真所需的命令,按顺序一行一行输入即可,如图2这样每次进入仿真调试状态,Keil都会自动加载debug.ini的内容进行初始化。

为了能够正确模拟串口,在软件仿真调试时,需要在用户的Keil工程文件属性中设置实际的晶振频率,这个参数很重要,直接影响到通信的波特率,大家根据实际使用的参数进行设置即可,注意这个参数的单位是MHz。

设置完参数后就可以开始仿真了,点击工具栏上的图标,在新窗口浏览图片,进入Debug状态单片机仿真软件教程,在Output窗口(一般在左下角)的命令文本框中输入上面介绍的命令。例如将PC的串口1设置为单片机的串口:

模式 com1 9600,0,8,1

分配 com1 Sout

然后设置断点,一般在关键的地方或者和串口相关的地方。然后点击运行用户程序的图标,使用户程序运行起来(否则收不到串口数据)。串口调试软件或者用户调试软件,发送通讯命令或者数据包,看用户程序是否进入断点,相关变量是否正确。也可以故意发送带有错误数据的数据包,观察用户程序的异常处理部分。如果发现程序有错误,可以立即停止仿真调试,立即修改代码,然后重复上述步骤再次仿真。由于它不需要连接用户目标板或者下载代码到用户板,所以速度很快。以上步骤和使用硬件仿真器基本相同,只不过现在采用的是软件仿真。

需要注意的是,在仿真时,单片机串口的实际波特率是由MODE命令指定的,单片机程序中的TMOD、SCON等参数并不影响串口仿真状态(也就是说,这些参数不会影响仿真的波特率,即使它们是错误的)。但是中断使能位(如ES、EA等)仍然起作用。如果ES或EA被禁止,则不会进入串口中断。

因为这种方式是用电脑的串口模拟单片机的串口,而模拟是通过Keil软件对串口上的数据进行转换,并不是直接进行数据转发,所以在实际模拟时,处理速度会比实际单片机运行时稍微低一些。比如在模拟模式下,1秒钟只能发送/接收10个数据帧,但在单片机硬件上运行时,1秒钟可以发送/接收50个数据帧。这个和使用的电脑速度有关,但不是很重要。对于模拟来说,没有什么影响。

对于有多个串口的单片机,​​理论上可以一次性绑定多个串口,只要电脑有足够多的串口即可。基本上使用这种方法需要电脑上的串口数量是单片机绑定串口数量的两倍。其中一个串口被Keil占用,用于模拟单片机的串口;另一个串口被电脑占用,用于向单片机串口发送和接收数据。

概括

这里介绍的方法,对于C51和汇编语言都适用,它的最大优点就是简单、方便、易用,不需要用到任何电路,没有特殊的要求,甚至可以在硬件电路搭建好之前,就把串口部分装上去,就可以开始编写程序、调试了。这种方法我用了很久,证明是非常有效的。其实对于51单片机来说,Keil的仿真功能非常强大,只要掌握它的功能,熟练使用,就可以解决工作中的大多数问题。很多工作都可以用软件仿真来完成,根本不需要任何硬件仿真器;只有一些新的外部设备的时序、接口调试才可能需要硬件仿真。目前关于Keil软件仿真的参考书很少,有些还是讲老版本的使用方法。不过不要紧,Keil的帮助文件很详细、清楚,只要仔细看,就一定能用得上。一旦熟练了,你就会发现Keil相当强大。

对于串口编程,51单片机有功能强大的开发软件Keil,给我们带来了极大的方便;而在其它单片机软件的开发中,目前还没有如此强大的开发工具和方便的调试方法。一种解决方法就是先在Keil中编写并调试好串口程序,然后再将程序移植到其它单片机平台(笔者在PIC18单片机的开发中就曾采用此方法,取得了很好的效果。当然,这就意味着在使用C语言开发单片机程序时,汇编语言是不可移​​植的)。至于如何减少程序移植的工作量,使程序具有通用性,并以最低的成本顺利地移植到其它单片机平台,也是一个非常值得探讨的问题。

相关内容 查看全部