UART - 透过 USB 转Serial模组与 PC 通讯

材料准备

  • USB to TTL Adapter x 1

范例说明

介绍

UART使用了两条线让双方可以同时传送资料。其中一条是Transmitting,另一条则是Receiving,双方使用约定好的频率 (baud rate) 来传资料。 Arduino 称呼UART为Serial,在Arduino Uno上只有一组硬体UART,并且这组UART主要被当作印出讯息使用(即Log UART) ,所以当Arduino要使用硬体的UART时,就会占用Log UART的资源。为了提供多组UART可以使用, GPIO 引脚通过软件方法模拟 UART 的行为,这称为Software Serial。 Ameba 配置了多个硬件 UART 端口,也与Software Serial库兼容。

流程

这个范例里,我们使用USB to TTL Adapter扮演UART的其中一端,另一端则是Ameba。
USB to TTL Adapter送出资料给Ameba, Ameba回传相同的资料, 最后显示在萤幕上。

  • 安装USB to TTL Adapter

USB to TTL Adapter是个将USB转成Serial介面的晶片。它一般会有4根脚, 分别是3V3(或5V), GND, TX, RX。在使用USB to TTL Adapter时, 通常都需要安装驱动程式。如果你的晶片是FTDI的, Windows会上网找驱动程式并自动安装, 或者也可以自己找驱动程式。
安装完驱动程式之后, 会在装置管理员找到对应的Serial Port, 像图中我的FTDI USB to TTL Adapter在COM8, 而Silicon USB to TTL Adapter则在COM6:

5-1

  • 执行范例

SoftwareSerial_Basic

首先先打开SoftwareSerialExamle范例, 它在 “File” -> “Examples” -> “AmebaSoftwareSerial” -> “SoftwareSerial_Basic”:

5-2

SoftwareSerial_DetailSetting

首先先打开SoftwareSerialExamle范例, 它在 “File” -> “Examples” -> “AmebaSoftwareSerial” -> “SoftwareSerial_DetailSetting”:

5-2

按照下图连接。 SoftwareSerial_Basic请参考左图。 SoftwareSerial_DetailSetting请参考右图。

接着我们打开Serial Port Terminal, 常见的Serial Port Terminal有Putty或是Tera Term。我们以Putty说明如何设定, 先将Connection Type选择Serial, 并且填入USB to TTL Adapter所在的Port (Ex. COM8)。
Speed则选择连线的baud rate。

SoftwareSerial_Basic

请注意,连接的两端应使用相同的baud rate。在本范例中,我们将baud rate设置为 4800。

5-4

接着我们点选左边的Serial页面,其中data bits为8, stop bits为1, Parity为None, flow control为None。
然后单击Open并按下Ameba上的重置按钮。

5-5

SoftwareSerial_DetailSetting

5-6

Putty就会出现“Hello, world?” 的讯息。

SoftwareSerial_Basic
这时候你在键盘上敲字,会经由USB to TTL Adapter的TX送到Ameba的Serial RX, 在程式码里面再送到Ameba的Serial TX, 最后由USB to TTL Adapter的RX接收并印出来。所以如果我们敲这个讯息“I am fine”, 就会出现这样:
SoftwareSerial_DetailSetting
如果在serial monitor中输入字,输入的字符将在 Putty 中打印出来,如下图所示。

5-6

程式码说明
首先需要设定UART的Baud rate, 使用SoftwareSerial:Begin():

https://www.arduino.cc/en/Reference/SoftwareSerialBegin
使用write()送出资料, 并且使用Software:available()来检查是否有资料送进来:

https://www.arduino.cc/en/Reference/SoftwareSerialAvailable
如果有资料进来, 就使用read()将资料读进来。

请先确认已安装QQ通讯软体