如果观察板子引脚发现,只有一对串口,但是我们烧录程序时使用的也是通过串口传输的,这么说来Arduino应该是有两个串口的,为了搞明白这个问题,我特意去Arduino官网查了一下关于Arduino的原理图。
原理图如下所示,通过原理图我们知道,单片机只有一对串口,但是最后分两路出去,一路连在了板子上的排针上;
另外一路通过两个发光二极管连在了一个叫做atmega的芯片上,程序通过这个芯片给单片机烧录程序。
原理图如下所示,通过原理图我们知道,单片机只有一对串口,但是最后分两路出去,一路连在了板子上的排针上;
另外一路通过两个发光二极管连在了一个叫做atmega的芯片上,程序通过这个芯片给单片机烧录程序。
软串口
但是我们要使用两个串口怎么办呢?不用担心,Arduino早已为我们谋划好了一切,我们把上面Arduino板上标注的串口叫做硬串口。
除了硬串口之外,Arduino还为我们设计了一种软串口,也可以叫做虚拟串口,他是通过程序定义的一组串口,然后映射到Arduino的IO口,这样我们就可以额外的多出一组串口。
下面我们用软串口做一组小实验,经过串口1向Arduino发送数据,Arduino接收到数据之后,再把数据转送到串口2,并让其在电脑上打印出来。
程序
上述小实验的程序如下图,我们发现这个程序与我们平时所见到的程序所不同的是,第一行多了一句:#include 的语句,我们所使用的软串口全靠的这一语句。它的作用是将其它数字、模拟引脚通过程序模拟成串口通信引脚。
SoftwareSerial mySerial(8, 9);的意思是把8引脚定义为RX口,TX定义为TX口。
再下面的程序的作用是设定波特率,然后把串口1的数据发给串口2,或者把串口2的数据发给串口1
#include
SoftwareSerial mySerial(8, 9); // RX, TX
void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
实验现象
我们通过电脑的USB串口向Arduino发送“123”,然后再让Arduino把收到的数据原封不动的发往我们的虚拟串口,并打印在屏幕上。
USB串口发送字符串“123”。
虚拟串口接收到了字符串“123”
Final
有人会说,一个串口就够用了,何必如此麻烦,然而实际的情况并非如此,比如说我们要用8266WiFi模块,如果把唯一一个宝贵的串口资源给了8266。
那程序不出问题还好,一旦有错,如果不再虚拟出来一对串口,我们都不知道哪里出了问题,所以软串口是我们开发者必须要掌握的。
芯板坊为您提供最全面国内外开发板资讯、评测、试用信息,包括现今的热门开发板,如树莓派,Arduino,STM32,OrangePi,Nanop pi,开源硬件等,感兴趣的电子发烧友们,可以来免费申请开发板。
最新评论