理论教育 零点起步:双机USART异步通信实例

零点起步:双机USART异步通信实例

时间:2023-10-19 理论教育 版权反馈
【摘要】:设此数组为Array,则Array[0]=0x55,Array[1]=0xAA,Array[2]赋值为要发送的长度N,Array[3]到Array[2+N]为具体要发送的数据,然后使用一个循环把数组中每个数据依次用USART发送即可。图9-10 USART异步通信协议接收方程序流程图电路图如图9-11所示。设双方的主频都是4MHz,异步通信波特率设置为9600bit/s,8位数据位、1位停止位。图9-11 双机USART异步通信实验原理图题意分析●题意要求按S1时发送数据,看本题电路图可知,读取RC0的状态可得知S1是否按下。7)启动VSM后运行程序。

零点起步:双机USART异步通信实例

有的系统中接收方每次接收时只要求能接收到完整数据包即可正常工作。例如,接收方是实时的信息显示模块,由于其数据变化快,不需要保留历史记录,所以只要保证显示信息的正确性即可。通过一个简单的通信协议,就能做到这点。例如,一个发送一组数据的简单通信协议如表9-6所示。

表9-6 数据通信协议帧格式

978-7-111-33274-9-Chapter09-30.jpg

●第一字节:0x55,固定值。

●第二字节:0xAA,固定值。

前两个字节表示一个数据包开始标志,接收方只有依次接收到0x55和0xAA之后才表明这是一个有效的数据包,其后的接收数据才需要保存,否则接收后直接抛弃。之所以用两个字节表示数据包开始标志,是为了防止错把具体数据中的内容当做数据包开始标志。不用一个字节是为了减小误判的几率。因为用一个字节表示数据包开始标志,每收到一个字节是数据包开始标志的几率为1/256,若用两个字节则此几率就降为1/65536。

●第三字节:表示要传输的数据长度(以字节为单位),设为N,假设每次数据长度小于252。

●具体数据:第三字节其后跟的N个字节就是具体数据了。

对于以上协议收发双方的编程思路如下。

发送方的编程很简单,只需要把要发送的数据放在一个足够长的字符数组中。设此数组为Array,则Array[0]=0x55,Array[1]=0xAA,Array[2]赋值为要发送的长度N,Array[3]到Array[2+N]为具体要发送的数据,然后使用一个循环把数组中每个数据依次用USART发送即可。

接收方的编程稍微复杂一些。用流程图9-10来表示。

下面通过一个双机通信的例子来学习一下此协议的编程和使用方法。

978-7-111-33274-9-Chapter09-31.jpg

图9-10 USART异步通信协议接收方程序流程图

【例9-3】电路图如图9-11所示。单片机U1是发送方,U2是接收方。设双方的主频都是4MHz,异步通信波特率设置为9600bit/s,8位数据位、1位停止位。编程实现每按一次按钮S1,U1依次每隔0.5s发送1、2、3、4到U2。U2收到完整数据包后把收到的数据每隔1s依次显示在数码管X2上。若U2收不到完整数据包则不显示。

电路图在光盘位置:“\Example\Chapter9\S093\MCUtoMCUSend.DSN”。

978-7-111-33274-9-Chapter09-32.jpg

图9-11 双机USART异步通信实验原理图

题意分析

●题意要求按S1时发送数据,看本题电路图可知,读取RC0的状态可得知S1是否按下。(www.daowen.com)

●题意要求U1每次共发送4个字节的具体数据,并且要求接收方收不到完整数据包则不显示。所以接收方要用一个方法保证收到的是一个完整的数据包,本例采用单向数据通信协议来解决。

●题意要求的时间间隔分别是0.5s和1s,由于ISIS中单击按钮的常见周期是0.14s,所以本例采用0.1s作为基本延时长度,并通过带参数的函数实现其他时间间隔。

●本题需要发送方和接收方两个单片机程序,所以需要新建两个项目,一个用来编写发送方程序,一个用来编写接收方程序。

设计过程

1)新建一个MPLAB项目S093rcv,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S093”文件夹下。

2)向项目中加入一个新建的rcvmain.c文件,输入以下内容(本项目所有内容参考光盘“\Example\Chapter9\S093”文件夹内容)。

978-7-111-33274-9-Chapter09-33.jpg

978-7-111-33274-9-Chapter09-34.jpg

978-7-111-33274-9-Chapter09-35.jpg

3)把项目保存后成功编译出目标文件。然后用调试工具Proteus VSM加载MCUtoMCU Rcv.DSN来进行调试。

4)新建一个MPLAB项目S093send,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S093”文件夹下。

5)向项目中加入一个新建的sendmain.c文件,输入以下内容(本项目所有内容参考光盘“\Example\Chapter9\S093”文件夹内容)。

978-7-111-33274-9-Chapter09-36.jpg

978-7-111-33274-9-Chapter09-37.jpg

978-7-111-33274-9-Chapter09-38.jpg

6)把项目保存后成功编译出目标文件。然后用调试工具Proteus VSM加载MCUtoMCU Send.DSN来进行调试。

7)启动VSM后运行程序。按S1后观察U1左侧的数码管X1数据变化,然后再观察U2右侧数码管X2数据变化规律。一切正常,则X1显示“41234”,然后X2显示“1234”,X1显示的第一个“4”是数据包长度字节的内容。

8)再按一次S1,当X1变到2时再按一次U2右侧的RST按钮复位U2,观察X2是否还显示收到的数据?

9)如果一切正常,则读者会发现此时X2不会显示数据。这是因为当X1显示2时U2复位,导致U2之后接收到的串行数据是3和4,不符合规定的数据包开始标志0x55和0xAA,所以X2就不显示数据了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈