1、串口通信测试方法1 关于串口通信的一些知识:RS-232C 是目前最常用的串行接口 标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。在 PC 机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且 MCS-51 单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以 组成一个简单可行的通信接口。由于 MCS-51 单片机的输入和输出电平为 TTL 电平,而 PC 机配置的是 RS-232C 标 准串行接口,二者电气规范不一致,因此要完成 PC 机与单片机的数据通信,必须进行电平转换。注明:3)RS-232C 上传送的数字量采用 负逻辑,且与地对
2、称逻辑 1:-3 -15V 逻辑 0:+3+15V 所以与单片机连接时常常需要加入电平转换芯片:2 实现串口通信的三个步骤:(1) 硬件连接51 单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232 电平的,而单片机的串口是 TTL 电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片 MAX232 进行转换。我们采用了三线制连接串口,也就是说和计算机的 9 针串口只连接其中的 3 根线:第 5 脚的 GND、第 2 脚的RXD、第 3 脚的 TXD。电路如下图所示,MAX232 的第 10 脚和单片机
3、的 11 脚连接,第 9 脚和单片机的 10 脚连接,第 15 脚和单片机的 20 脚连接。使用 MAX232 串口通信电路图(9 孔串口接头)(2)串行通信程序设计通信协议的使用通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在 PC 机与单片机之间进行通信,在设计过程中,有如下 约定:0x31:PC 机发送 0x31,单片机回送 0x01,表示选择本单片机 ;0x*:PC 机发送 0x*,单 片机回送 0x*,表示选择单片机后发送数据通信正常;在系统工作过程中,单片机接收到 PC 机数据信息后,便查找协议,完成相应
4、的操作。串行通信程序设计主要有微机 发送接收程序和单 片机发送接收程序,微机上的发送和接收程序主要采用计算机高级语言编写,如 C 语言,因为了能够在计算机端看到单片机发出的数据,我们必须借助一个 WINDOWS 软件进行观察,这里利用如下图标的一个免费计算机串口调试软件,故而这一块计算机通信的程序可不写!在单片机上主要用汇编或 C 编写,在使用串口之前,必 须先对串口进行初始化,主要是设置产生波特率的定时器 1、串口控制和中断控制。具体步 骤如下:1 确定定时器 1 的工作方式编程 TMOD 寄存器(设置波特率);2 确定串口的控制编程 SCON;3 串口的中断方式,必须开 CPU 和源中断编
5、写 IE 寄存器;4 计算定时器 1 的初值装载 TH1,TL1;5 启动定时器 1编程 TCON 中的 TR1 位。为何串行口的工作方式选择方式 1,这是针对于我们平常最常用的,单纯一块板对应于我们的私人电脑,所以就无须考虑是哪一块板发来的信息,即无须分清是数据帧还是地址帧。因为此时属于直通方式,所以无须考虑的。方式 1 为波特率可变的 10 位异步通讯接口方式,发送或接收一帧信息,包括 1个起始位 0,8 个数据位和一个停止位 1,。其中的起始位和停止位在 发送时自动插入的。输出:当单片机执行一条指令将数据写入发送缓冲 SBUF 且 TI=0 时,就启动发送。串行数据从 TXD 引脚输出,
6、 发送完一帧数据后,就有硬件置位 TI。输入:在(REN)=1 时,串行口采样 RXD 引脚,当采样到 1 到 0 的跳变时,确认是串行发送来的一帧数据的开始位 0,从而开始接收一帧数据。在接收到附加的第9 位数据后,当满足(1)RI=0(2)SM2=0 或接收到的第 9 位数据为 1 时,第 9 位数据(停止位)才进入 RB8,8 位数据才能进入接收寄存器,并由硬件置位中断 标志RI.否则信息丢失。所以在方式 1 接收时, 应先用软件清零 RI 和 SM2 标志。通常串行接口以方式 1 工作时,SM2 置为 0.而我们现实中需要的是一个机器中多块板进行显示和读取数据,所以这里不得不采取 SM
7、2=1 的多机通信,而且我们一般采取的方式 为方式 3,TB8 发送数据位,在模式 2 和 3 是要发送的第 9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。这里就可以根据地址判断出我们需要选取的板是不是方位监测板。注明:如果用 C 语言来写的话,无论你是先发地址帧,然后数据帧,还是只发数据帧,最后显示的都是一样的内容,而汇编语言是不行的。SM2:多机通信控制位,仅用于方式 2 和方式 3.接收状态时,当串行口工作于方式 2 或 3 时,以及 SM2=1 时,只有当接收到的第九位数据为 1 时,才把接收到的前 8 位数
8、据送入 SBUF,且置位 RI 发出中断申请,否 则会将接收到的数据丢弃。而当 SM2=0 时,就不管接收到的第九位数据为多少,直接送入并申请 中断,因 为这个时候是直通方式。注明:这里如果在 SM2=1 的时候, 发来的是数据而不是地址,则不会发出中断请求,不会进入中断服 务程序。(就像我一直以为要判断数据是第一次发来的还是 SM2=0 后发来的,其实不需要)如不需要 MOV A,SCON; ;判断是不是第二次中断后发来的数据CJNE A,#90H,WAIT发来的如果是数据,能够进入中断服务程序的一定是 SM2 清零后的数据。方式 2 为固定波特率的 11 位 UART 方式,它比方式 1
9、增加了一位可程控为 1或 0 的第 9 位数据。输出:发送的串行数据由 TXD 端输出一帧信息为 11 位,附加的第 9 位来自SCON 寄存器的 TB8 位,用软件置位或复位。它可作为多机通信中地址、数据信息的标志位;也可以作为数据的奇偶校验位。当单片机执行一条数据写入 SUBF的指令且 TI=0 时,就启动发送器发送。发送一帧信息后,置位中断标志 TI,发送完一个之后,如果 TI 不清零的话, 则会一直发送在发送缓冲器里的数据JNB TI,$ CLR TI。输入:在(REN)=1 时,串行口采样 RXD 引脚,当采样到 1 到 0 的跳变时,确认是串行发送来的一帧数据的开始位 0,从而开始
10、接收一帧数据。在接收到附加的第9 位数据后,当满足(1)RI=0(2)SM2=0 或接收到的第 9 位数据为 1 时,第 9 位数据(地址位或者数据位)才进入 RB8,8 位数据才能进入接收寄存器,并由硬件置位中断标志 RI,此时申请中断, 进入中断服务程序.RB8=1;标志此时是一个地址 帧, SM2=1 时,将地址转入 SBUF,置位 RI,发出中断请求, ,若相符,则将从机的 SM2 清零,变成直通方式,准备接受其后传送来的数据。RB8=0;数据帧,对 SM2=1,RB8=0 的从机接收到直接丢弃,而对 SM2=0 的从机,直通方式,不论 RB8 是 0 还是 1,都将接受并将置位,发出
11、中断请求。注明:多机处理通信方式,首先保证每一台从机在系统中的编号是唯一的。系统初始化时,将所有从机中的 SM2 均置 1,并处 于允许串行口中断接收状态。主机欲与某从机通信时,先向所有从机发出从机的地址,然后才接着发命令或者数据。在主机发地址时,置第 9 位数据(TB8 为 1),表示主机发送的是地址帧,然后才将第 9 位数据(TB8)清 0,发送命令或数据。3 观察结果:下面列举一个使用的串口通信测试软件,其功能为,将 PC 机键盘的输入发送给单片机,单片机收到 PC 机发来的数据后,回送同一数据给 PC 机,并在屏幕上显示出来,只要两者相同,则说明两者之间的通信正常。在 PC 上打开软件
12、串口 调试器.exe, 设置端口号 COM1,波特率 4800,数据位 8,停止位 1,打开串口,并勾 选发送区的“十六进制”与接收区的“ 十六进制”。发送数据时根据通信协议将一帧通信数据划分为地址码和功能数据码。要完成一帧通信数据的发送,要在串口调试器.exe 分先后两次发送实现。首先发送地址,如图 2 所示操作:图 2接下来,发送功能数据码操作如图 3 所示:图 3注:在切换发送地址码和功能数据码时,都要先关闭串口,再设置校验位,要发送时再打开串口。还有就是不同版本的串口调试器,可能在发送数据功能码时是否加空格分开有一定的区别。4 通信故障分析过程如果串口通信不行的话,按以下步骤进行检查:
13、 将 MAX232 芯片翘起来,将 MAX232 的 7 脚和 8 脚用镊子短路,则在串口调试器上自动发送一个数值,则应回显同样的一个数值,如果可回显, 则表示电脑的串口是可以正常通信了,如果不行,则代表电脑的串口不行,重新更 换电脑; 如果电脑的串口可以的话,则查看 MAX232 是否正常,则拿镊子将单片机的第 10 脚和第 11 脚短路,则串口同样可以自动收发数据,如果不行的话, 则为MAX232 芯片有问题:先更换芯片;如果芯片正常,则查看外围的极性电容是否正常焊接,一般不正常焊接极性电容也会出现以上问题; 如果以上检查都正常,出现串口通信没有回送数值,则代表单片机工作不正常:先检查单片机的电源电压是否正常供电;如果正常供电,则判断单片机是否程序成功烧入,重新对单片机进行烧写程序,查看是否之后还可以进 行串口通信;在重新烧写过程序的单片机后串口通信还不行的话,则检查单片机的外围电路,查看复位开关是否焊接 错误, 导致常通状态;如果检查开关是正常焊接,如果有复位芯片,则更换好的复位芯片,看是否串口通信是否正常。