Arduino基础实验10,串口通信UART

文档【1】中,我们已经使用过Arduino的串口通信来做实验,本文中,创客行将专门深化一下UART串行接口的知识,它不仅在Arduino本身十分有用,而且在其它许多电子模块的通信中都会派上重要用场。

UART

UART的全名是Universal Asynchronous Receiver/Transmitter,通用异步收发传输器。它是一种数据传输总线,有两个通道RX和TX,分别作用为收和发的功能,每个通道都是单向的,互不干扰。

uart串口连接图1 uart串口连接

如图1,两个互相连接的设备在使用串口通信时,会需要连接三条线,设备1的TX连接设备2的RX,同理,设备1的RX连接设备2的TX,构成了图中的数据传输方向,此外,还需要一个公地线GND,使得电路形成完整回路。

在单片机和PC上使用的UART是TTL电平串口,一般它的工作电平在3.3V,例如PC和树莓派开发板都是这个电压,然而,Arduino是个特例,它的工作电平是5V,因此,在连接其它外设时,需要考虑对方能接受的工作电平,对3.3V设备连接时,Arduino开发板必须使用电平转换芯片。创客行淘宝店提供有相关产品。

uart2图2 串口参数设置

图2是串口通信软件中的参数设置界面,想要建立串口通信,必须首先指定串口号来识别使用的物理接口,然后设置连接使用的波特率,也就是信号传输的速度,互相连接的两个设备波特率要一致,否则或造成数据错误。下面的各种数据位和流控设置是串口物理层中需要的东西,一般如图2上设置即可,感兴趣的朋友请参阅相关资料,这里就不展开介绍了。

经过正确硬件连接和软件设置之后,我们就能够使用串口来在不同的电子设备之间传输信息了。

Arduino和PC之间的串口通信

Arduino nano开发板图3 Arduino Nano开发板

Arduino Nano的开发板带有USB/串口转换芯片,使用USB线连接电脑接口就可以串口通信,一个简单的例子如下

 
/*
 serial experiment 1
 source by: www.i-makers.info
*/

int cnt = 0;

void setup() {
  //以9600 bps波特率传送数据
  Serial.begin(9600);
}

void loop() {
  Serial.println(cnt ++);
  delay(1000); 
}

代码1 Arduino Nano的开发板对PC串口通信

代码1烧录到Arduino Nano的开发板上,连接电脑后,在Arduino IDE的串口监视器就可以看到每秒钟打印出一个累加的数值。

Arduino使用虚拟串口

由于UART串口每次只能在一对设备间进行通信,假如需要支持多个串口设备,或连接多个使用UART的传感器,Arduino只有一个硬件串口就不够用了,这时,Arduino的其它数字引脚就需要被使用起来,模拟成为软件UART接口。

文档【1】中,我们已经使用过了虚拟串口来让Arduino同时连接PC和超声测距传感器,在本文中,我们看看如何使用虚拟串口建立两个Arduino Nano开发板之间的通信。

两个Arduino开发板之间的UART串口通信图4 两个Arduino开发板之间的UART串口通信

如图4所示,两个建立通信的开发板需要你用线路将它们的UART引脚连接起来,跨越两板之间的橙线和白线作为TX和RX连接线,红线和绿线从右边面包板给左边供电。我们命名右边为1号板,左边为2号板,以下代码分别烧录到各自的板块。

/*
 serial experiment 2(device 1)
 source by: www.i-makers.info
*/

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //软件虚拟串口 RX, TX


unsigned char cnt = 0;
unsigned char temp = 0;
unsigned char num = 0;

void setup() {
 //设置波特率为 9600bps.
 mySerial.begin(9600);
 Serial.begin(9600);
 
 delay(1000);
 mySerial.println(cnt++);//cnt是一个被不断发送的累加值,这里发送“0”
}

void loop() {
 num = 0;
 if(mySerial.available()>0){//等待RX接口的数值。
   getRX();//获取RX接口的数值。
 
   mySerial.println(cnt++);//继续发送cnt
   Serial.println(num);
 }else{
   delay(1000);
 }
   delay(1000); 
}

void getRX(){
 num = 0;
 
 while(true){
   mySerial.readBytes(&temp,1);
   
   //使用串口发送数值时,使用println()方式,会将ASC码的13和10作为换行符号发出去,
   //这里也作为数据传输完成的标志,当发现13时,将后一个字符10读出来,则意味着传输结束。
   if(temp == 13){
     mySerial.readBytes(&temp,1);
     break;
   }
 
   num = 10*num + (temp-'0');//print()时串口会传送数字的ASC码字符号,需要用这个办法恢复数字
 }
}

代码2 Arduino串口互联板1代码

/*
 serial experiment 2(device 2)
 source by: www.i-makers.info
*/

/*
 D2 G
 D3 C
 D4 DP
 D5 D
 D6 E
 D7 B
 D8 F
 D11 A
 */
 const int Nixie[12][8]={
 {0,1,0,1,1,1,1,1}, //0
 {0,1,0,0,0,1,0,0}, //1
 {1,0,0,1,1,1,0,1}, //2
 {1,1,0,1,0,1,0,1}, //3
 {1,1,0,0,0,1,1,0}, //4
 {1,1,0,1,0,0,1,1}, //5
 {1,1,0,1,1,0,1,1}, //6
 {0,1,0,0,0,1,0,1}, //7
 {1,1,0,1,1,1,1,1}, //8
 {1,1,0,1,0,1,1,1}, //9
 {0,0,0,0,0,0,0,0}, //none
 {1,0,0,0,0,0,0,0} //"-"
 };
 

void setup() {
 Serial.begin(9600);
 
 for(int i=2;i<13;i++){
   pinMode(i, OUTPUT);
 }
}

unsigned char temp;
unsigned char num = 0;
int showVal[3];

void loop() { 
//接收RX数据
 if(Serial.available()){
   getRX();
 }
 
 //回传到开发板1
 Serial.println(num);
 
 //将收到数据拆分成三位十进制数值
 showVal[0]=num/100;
 showVal[1]=(num%100)/10;
 showVal[2]=(num%100)%10;

 //显示数值
 for(int cnt=0;cnt<200;cnt++)
 {
   showValue();
 }
}

void showValue(){
 for(int j=0;j<3;j++){
   for(int i=10;i<13;i++){
     digitalWrite(i,1);
   }
 
   for(int i=0;i<8;i++){
     digitalWrite(i+2,Nixie[showVal[2-j]][i]);
   }
 
   digitalWrite(10+j,0);
   delay(5);
 }
}

void getRX(){
 num = 0;
 
 while(true){
   Serial.readBytes(&temp,1);
 
   if(temp == 13){
     Serial.readBytes(&temp,1);
     break;
   }
 
   num = 10*num + (temp-'0');
 }
}

代码3 Arduino串口互联板2代码

从代码上可以看到,开发板1使用D2和D3来作为软件串口的RX和TX,它们分别连接到开发板2的硬件串口引脚,也就是TX和RX。Arduino提供了软件串口的支持库,只需要包含<SoftwareSerial.h>头文件即可。

上面的代码中已经加上了中文注释,它的功能是开发板1给开发板2传送一个数值,开发板2用数码管显示该值,并将其回传给开发板1作为应答;当开发板1收到应答后,将数值累加,继续发给开发板2。实验表现为数码管会在unsigned char范围,也就是0-255内不断显示累加值。

有关数码管驱动的代码请参阅文档【2】

总结

本文中分析了UART串口通信方法,介绍了Arduino硬件串口和软件串口的使用,并通过两个Arduino Nano开发板互连来做串口通信实验,串口通信在许多场合有重要应用,大家在需要传输数据的场合可以尝试使用一下UART。更多的精彩内容,请查看全站目录

优秀科技原创内容源,欢迎添加微信公众号。

创客行淘宝店提供本网站电子制作的全部套件

创客行淘宝店地址:https://shop125908459.taobao.com/

参考文档

  1. Arduino基础实验9,超声波测距的两种模式
  2. Arduino基础实验3,驱动多位七段数码管
  3. 全站目录

发表评论