宜昌老张

零成本学Arduino单片机之串行通讯

0
阅读(3486)

一、前言 

  串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。

    进行串行通信,一般应该有两个计算机,两个程序,利用一条串行通信电缆,互相“全双工”的传送信息。

   利用 PROTEUS 软件,做串行通信实验会很方便,Proteus仿真可以把一个或者两台计算机的硬件功能仿真出来,除了一台PC机运行仿真软件,不用任何其它硬件投入了,就可以进行RS232协议下的通讯实验
 
二、Proteus界面中的虚拟终端与Arduino单片机之间串行通讯的仿真方法
     PROTEUS 软件中,含有多种虚拟仪器,其中有一个称为“虚拟终端”设备,这个设备可以和Arduino单片机进行全双工的通信。这个虚拟终端”设备不需要编写一行程序,就可以完成收发字符任务,有点像我们常用的串口助手软件的作用。
    其实,用两个 “虚拟终端”,连接上线路,它们也可以通信了。请看下图:
图1 “虚拟终端”功能演示
 
   这是个最简单的“单工”串行通信系统,在这个系统里面并不需要单片机,不用装载程序。
     点击Proteus ISIS仿真界面左下方的“播放”按钮,就会弹出两个“虚拟终端”的对话窗口,在左边的,只能键入字符,不能显示字符,刚键入的字符,将会传输的右边窗口中,在右边显示出来。
      通过单工通信的例子介绍了“虚拟终端”的功能,接着通过一个实例了解下“虚拟终端”如何配合Arduino单片机做通讯实验的。
     Arduino串行通讯实例任务是:调节电位计滑动抽头与地之间的电压,并把电压值显示在一个“虚拟终端”里。同时,通过另一个“虚拟终端”输入字符'a',发送到Arduino单片机,让与之相连的LED灯点亮,输入字符'b',让LED灯熄灭。如图2所示。
    任务的仿真全景图:
 
图2 “虚拟终端”与Arduino单片机串行通讯演示
 
任务的仿真视频:
全屏观看,点击网址: 
     上面图片和视频展示的是“虚拟终端”与Arduino单片机之间的串行通讯,两者都在同一个仿真界面中。同样的任务也可以采用另一种“上下位机”的方式来仿真。
 
三、Arduino IDE编程界面中的串口监视器与Proteus仿真图中的Arduino单片机之间串行通讯的仿真方法
     现在,进一步研究,上下位机的串行通讯仿真,上位机软件采用Arduino IDE编程环境的串口监视器,下位机是Proteus ISIS仿真界面中的Arduino单片机,上下位机串行通讯仿真实验全景图如下。
图 3  Arduino IDE中的串口监视器与Proteus中的Arduino单片机串口通讯演示
 
视频:
 
    Proteus界面中的下位机Arduino单片机与上位机软件进行串行通讯,并没有硬件连接,需要通过某种软件虚拟出两个相互连接的串口,一个串口分配给Arduino单片机,另一个串口分配给上位机串口监控软件,在虚拟环境下,让两者能够完成上下位机的串行通讯。这种软件就是VSPD虚拟串口驱动软件。如下图所示。
图 4    VSPD虚拟串口驱动软件使用方法
 
   VSPD虚拟串口驱动软件请下载:http://115.com/file/eizd0usu
    下载和安装软件,添加补丁,然后运行程序,出现上图界面。在界面的First选项中选择COM7,在Second选项中选择COM8(当然也可以选择其它串口号配对,前提是被选串口原先是闲置的串口,没有被占有),然后单击Add pair 按钮,这两个串口会立即出现界面左侧的Vitual Port目录下,且会有“串口线”将它们连接起来。这时,如果打开PC的设备管理器,你会发现多出了两个串口,如下图所示。
图5 虚拟串口在PC的设备管理器中的显示
 
    在设备管理器看到了虚拟出的两个串口了,问题是具体如何把串口COM7分配给Arduino单片机,如何把COM8分配给Arduino IDE编程软件的串口监视器。
       要把串口COM7分配给Proteus仿真环境下的Arduino单片机,需要用到COMPIM串口连接器组件,这个组件可以从Proteus的元件模式库里找到。如下图。
图6 COMPIM串口连接器组件的提取方法
   先选择元件模式库,再点击“P”按钮,打开元件查询提取对话框,可以在对话框左上方的关键字输入栏里输入元件名称:COMPIM,回车后,在结果中可以很容易地找到所需组件。找到后双击COMPIM组件,就可以把它提取到Proteus ISIS界面左侧的DEVICES栏中,供电路图绘制时随时选用,
      点选DEVICES栏的COMPIM组件,放置到电气原理图中,然后双击它,随之出现COMPIM组件的编辑元件窗口,在窗口中就可以把COM7虚拟串口关联到Arduino单片机电路中了。下图中我用红色矩形框标注了,COM7串口设置在编辑元件窗口中的位置
图7 虚拟串口COM7分配给Proteus环境下Arduino单片机的方法
 
    然后,介绍如何把COM8分配给Arduino IDE编程软件的串口监视器。打开Arduino IDE编程软件,点击菜单栏中的Tools菜单选项,在下拉菜单栏选择Serial→COM8,这样就可以把COM8串口与Arduino IDE编程软件的串口监视器关联起来了。
图8 虚拟串口COM8分配给Arduino IDE编程界面下串口监视器的方法 
 
    双击Arduino IDE工具栏的“Serial Monitor”工具图标,会打开串口监视器窗口。如果运行图3所示任务的程序,在窗口中,会看到电位计的电压值实时变化,你在“Send”输入栏里,输入‘a’字符,Proteus仿真图的LED灯会点亮,输入‘b’字符,LED会熄灭。这说明COM7和COM8这两个虚拟串口能正确仿真串行通讯,就好像两个物理串口在通讯一样。
图9 Arduino IDE编程界面的串口监视器
      对于Arduino IDE编程界面的串口监视器,你不需要为它编写程序,它本身就可以实现字符收发的功能,你用Arduino编程界面编写的程序是Proteus仿真图中Arduino单片机的串行通讯程序,以及电位计电压值采集和LED灯亮灭输出的程序。程序如下。
/*任务:调节电位计滑动抽头与地之间的电压,并把
电压值显示在上位机Arduino IDE编程环境的串口监视器里。
同时,通过串口监视器输入字符'a',发送到Proteus环境下的
下位机Arduino单片机,让与之相连的LED灯熄灭。
*/
int led=9;     //把LED连在Arduino数字端口9
int potpin = 0; //把电位计连在Arduino模拟端口0
//初始化
void setup() 
{
  Serial.begin(9600);  //启动串行通讯,波特率为9600b/s
  pinMode(led,OUTPUT);  //申明数字端口9为输出端口
  digitalWrite(led,HIGH); //初始化LED灯为熄灭状态
}
//主程序
void loop() 
{
 float sensorValue = analogRead(potpin); //读取电位计采样值 
  float voltage=sensorValue/1023*5;//采样值0-1024转换为0-5V电压值
  Serial.print("voltage = ");//在Arduino IDE的串口监视器实时显示电压值
  Serial.print(voltage);
  Serial.println(" V");  
  char val;//定义变量val,用于暂存上位机发送来的字符
  if(Serial.available()>0)//如果上位机发送来了字符
  {
    val=Serial.read(); //读取上位机发来的字符,并保存到val  
    Serial.println(val); //显示接受到的字符
    if(val=='a')//如果上位机发送字符'a',
    {
      digitalWrite(led,LOW); //点亮LED灯         
    }
    if(val=='b')//如果上位机发送字符'b',
    {
       digitalWrite(led,HIGH);//熄灭LED灯           
    }    
  }
  delay(100);//延时100ms
}
   把两个计算机的串口波特率都设置为9600b/s,COM7和COM8正确分配给上、下位计算机,再运行以上程序,就会看到视频中展示得那样的实验现象。
   文章中介绍的两个仿真项目的Proteus仿真图供下载(Proteus 7.6版本):Proteus仿真图下载.zip
 
四、结束语
    单看这篇文章应该理解Arduino单片机串行通讯仿真流程,但按照文章内容照着做仿真实验,应该还需要了解些Arduino单片机仿真的基础知识,例如hex机器码文件如何加载,Arduino单片机的工作参数如何设置等,这需要参看《零成本学Arduino单片机之入门》 一文,文章地址:http://blog.chinaaet.com/detail/30302.html
      Arduino在国外创客界十分流行,但在国内才刚刚起步,所以如何让越来越多的DIY爱好者进入Arduino大门,就需要降低这扇大门的门槛。降低门槛不仅仅是Arduino的易学好用和丰富网络共享,还有就是要降低初学者的硬件成本投入,如何解决少花钱,而多学习Arduino,Proteus仿真是一个很好的途径。