【MSP430F5529测评】2. UART串口通信
<div class='showpostmsg'> 本帖最后由 wuguangtao 于 2020-10-27 22:17 编辑# MSP430F5529LP UART 串口通信测试
由于energia很容易上手和测试, 这一篇我们先用它来测试下`MSP430F5529`的串口通信功能,下一次再换CCS环境。
## UART 接口
`MSP430F5529` 包含的UART接口可不止一个,从其datasheet可知,MSP430F5529 包含两个`USCIs` (universal serial communication interfaces), `USCI_A` 与 `USCI_B`, 其中 `USCI_A` 可用于 `UART`, `IrDA` 与 `SPI` 三种模式,共两套接口(`UCA0` 与 `UCA1`)。
也就是说,MSP430F5529 可以同时使用两套UART接口,但是可能导致其他接口如`SPI` `IrDA`不够用,具体情况具体分析。当前这套开发板的USB功能中已经集成了一套UART接口,我们可以从板子的原理图中找到对应的管脚。
结合以下官方提供的开发板文档信息可知,`P4.4` 与 `P4.5` 对应的`UCA1TXD`, `UCA1RXD` 被用于ez-FET lite仿真功能当中,这两个接口分别对应了两个跳帽,上一篇有讲到。也就是说,USB调试工具已经集成了UART串口通信功能,只要在代码中启用该功能,就可以直接通过USB进行通信。本文后续有专门例程讲解。
因为上面这套UART接口被用掉了,开发板引出的管脚中也就不再包含这两个管脚了。剩下还有`UCA0`的`P3.3 `,`P3.4`可以用于自定义。
## 例程测试
好啦,介绍完了UART的接口,下面通过例程来掌握该接口的使用方法。
### 选择串口
板子连上PC后,打开设备管理器,找到端口信息,其中 `MSP Application UART1` 对应的就是UART通信端口。我这里是`COM3`
接下来在energia 软件中选择对应串口。
在软件右下角有个串口监视器,点击它打开串口收发窗口,可以用于监视串口的数据。
### 例程代码
串口配置完成,接下来先找个例程试试看。选择 communication 目录下的首个例程 `ASCIITable`, 这个用来打印ASCII表。
```c++
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
// prints title with ending line break
Serial.println("ASCII Table ~ Character Map");
}
// first visible ASCIIcharacter '!' is number 33:
int thisByte = 33;
// you can also write ASCII characters in single quotes.
// for example. '!' is the same as 33, so you could also use this:
//int thisByte = '!';
void loop() {
// prints value unaltered, i.e. the raw binary version of the
// byte. The serial monitor interprets all bytes as
// ASCII, so 33, the first number, will show up as '!'
Serial.write(thisByte);
Serial.print(", dec: ");
// prints value as string as an ASCII-encoded decimal (base 10).
// Decimal is the default format for Serial.print() and Serial.println(),
// so no modifier is needed:
Serial.print(thisByte);
// But you can declare the modifier for decimal if you want to.
//this also works if you uncomment it:
// Serial.print(thisByte, DEC);
Serial.print(", hex: ");
// prints value as string in hexadecimal (base 16):
Serial.print(thisByte, HEX);
Serial.print(", oct: ");
// prints value as string in octal (base 8);
Serial.print(thisByte, OCT);
Serial.print(", bin: ");
// prints value as string in binary (base 2)
// also prints ending line break:
Serial.println(thisByte, BIN);
// if printed last visible character '~' or 126, stop:
if(thisByte == 126) { // you could also use if (thisByte == '~') {
// This loop loops forever and does nothing
while(true) {
continue;
}
}
// go on to the next character
thisByte++;
}
```
代码不长,比较简单,先看setup函数,
```c
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
// prints title with ending line break
Serial.println("ASCII Table ~ Character Map");
}
```
首先配置波特率为9600bps,然后向串口发送一串字符串"ASCII Table ~ Character Map", 这就是初始化函数了。
在主循环`loop`中,从初始字节33(对应字符 `!`)开始,直到126(对应字符`~`), 逐个打印每个ASCII的字符本身,十进制数,十六进制数、八进制数、二进制数。如 `!`的打印输出如下:
```yaml
!, dec: 33, hex: 21, oct: 41, bin: 100001
```
### 下载测试
下面进行编译下载测试,等待编译成功,然后可能需要手动按一下板子的复位键 `reset`生效。
测试时,可以看到串口监视器中不断刷新输出新的数据,这些就是板子通过COM口传输过来的。
```yaml
ASCII Table ~ Character Map
!, dec: 33, hex: 21, oct: 41, bin: 100001
", dec: 34, hex: 22, oct: 42, bin: 100010
#, dec: 35, hex: 23, oct: 43, bin: 100011
$, dec: 36, hex: 24, oct: 44, bin: 100100
%, dec: 37, hex: 25, oct: 45, bin: 100101
&, dec: 38, hex: 26, oct: 46, bin: 100110
', dec: 39, hex: 27, oct: 47, bin: 100111
(, dec: 40, hex: 28, oct: 50, bin: 101000
), dec: 41, hex: 29, oct: 51, bin: 101001
*, dec: 42, hex: 2A, oct: 52, bin: 101010
+, dec: 43, hex: 2B, oct: 53, bin: 101011
,, dec: 44, hex: 2C, oct: 54, bin: 101100
-, dec: 45, hex: 2D, oct: 55, bin: 101101
., dec: 46, hex: 2E, oct: 56, bin: 101110
/, dec: 47, hex: 2F, oct: 57, bin: 101111
0, dec: 48, hex: 30, oct: 60, bin: 110000
1, dec: 49, hex: 31, oct: 61, bin: 110001
2, dec: 50, hex: 32, oct: 62, bin: 110010
3, dec: 51, hex: 33, oct: 63, bin: 110011
4, dec: 52, hex: 34, oct: 64, bin: 110100
5, dec: 53, hex: 35, oct: 65, bin: 110101
6, dec: 54, hex: 36, oct: 66, bin: 110110
7, dec: 55, hex: 37, oct: 67, bin: 110111
8, dec: 56, hex: 38, oct: 70, bin: 111000
9, dec: 57, hex: 39, oct: 71, bin: 111001
:, dec: 58, hex: 3A, oct: 72, bin: 111010
;, dec: 59, hex: 3B, oct: 73, bin: 111011
<, dec: 60, hex: 3C, oct: 74, bin: 111100
=, dec: 61, hex: 3D, oct: 75, bin: 111101
>, dec: 62, hex: 3E, oct: 76, bin: 111110
?, dec: 63, hex: 3F, oct: 77, bin: 111111
@, dec: 64, hex: 40, oct: 100, bin: 1000000
A, dec: 65, hex: 41, oct: 101, bin: 1000001
B, dec: 66, hex: 42, oct: 102, bin: 1000010
C, dec: 67, hex: 43, oct: 103, bin: 1000011
D, dec: 68, hex: 44, oct: 104, bin: 1000100
E, dec: 69, hex: 45, oct: 105, bin: 1000101
F, dec: 70, hex: 46, oct: 106, bin: 1000110
G, dec: 71, hex: 47, oct: 107, bin: 1000111
H, dec: 72, hex: 48, oct: 110, bin: 1001000
I, dec: 73, hex: 49, oct: 111, bin: 1001001
J, dec: 74, hex: 4A, oct: 112, bin: 1001010
K, dec: 75, hex: 4B, oct: 113, bin: 1001011
L, dec: 76, hex: 4C, oct: 114, bin: 1001100
M, dec: 77, hex: 4D, oct: 115, bin: 1001101
N, dec: 78, hex: 4E, oct: 116, bin: 1001110
O, dec: 79, hex: 4F, oct: 117, bin: 1001111
P, dec: 80, hex: 50, oct: 120, bin: 1010000
Q, dec: 81, hex: 51, oct: 121, bin: 1010001
R, dec: 82, hex: 52, oct: 122, bin: 1010010
S, dec: 83, hex: 53, oct: 123, bin: 1010011
T, dec: 84, hex: 54, oct: 124, bin: 1010100
U, dec: 85, hex: 55, oct: 125, bin: 1010101
V, dec: 86, hex: 56, oct: 126, bin: 1010110
W, dec: 87, hex: 57, oct: 127, bin: 1010111
X, dec: 88, hex: 58, oct: 130, bin: 1011000
Y, dec: 89, hex: 59, oct: 131, bin: 1011001
Z, dec: 90, hex: 5A, oct: 132, bin: 1011010
[, dec: 91, hex: 5B, oct: 133, bin: 1011011
\, dec: 92, hex: 5C, oct: 134, bin: 1011100
], dec: 93, hex: 5D, oct: 135, bin: 1011101
^, dec: 94, hex: 5E, oct: 136, bin: 1011110
_, dec: 95, hex: 5F, oct: 137, bin: 1011111
`, dec: 96, hex: 60, oct: 140, bin: 1100000
a, dec: 97, hex: 61, oct: 141, bin: 1100001
b, dec: 98, hex: 62, oct: 142, bin: 1100010
c, dec: 99, hex: 63, oct: 143, bin: 1100011
d, dec: 100, hex: 64, oct: 144, bin: 1100100
e, dec: 101, hex: 65, oct: 145, bin: 1100101
f, dec: 102, hex: 66, oct: 146, bin: 1100110
g, dec: 103, hex: 67, oct: 147, bin: 1100111
h, dec: 104, hex: 68, oct: 150, bin: 1101000
i, dec: 105, hex: 69, oct: 151, bin: 1101001
j, dec: 106, hex: 6A, oct: 152, bin: 1101010
k, dec: 107, hex: 6B, oct: 153, bin: 1101011
l, dec: 108, hex: 6C, oct: 154, bin: 1101100
m, dec: 109, hex: 6D, oct: 155, bin: 1101101
n, dec: 110, hex: 6E, oct: 156, bin: 1101110
o, dec: 111, hex: 6F, oct: 157, bin: 1101111
p, dec: 112, hex: 70, oct: 160, bin: 1110000
q, dec: 113, hex: 71, oct: 161, bin: 1110001
r, dec: 114, hex: 72, oct: 162, bin: 1110010
s, dec: 115, hex: 73, oct: 163, bin: 1110011
t, dec: 116, hex: 74, oct: 164, bin: 1110100
u, dec: 117, hex: 75, oct: 165, bin: 1110101
v, dec: 118, hex: 76, oct: 166, bin: 1110110
w, dec: 119, hex: 77, oct: 167, bin: 1110111
x, dec: 120, hex: 78, oct: 170, bin: 1111000
y, dec: 121, hex: 79, oct: 171, bin: 1111001
z, dec: 122, hex: 7A, oct: 172, bin: 1111010
{, dec: 123, hex: 7B, oct: 173, bin: 1111011
|, dec: 124, hex: 7C, oct: 174, bin: 1111100
}, dec: 125, hex: 7D, oct: 175, bin: 1111101
~, dec: 126, hex: 7E, oct: 176, bin: 1111110
```
**说明:** 在测试时,可以修改波特率,默认值为9600,但其可选值通常有 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200.可以根据特定需求去设置。
## 自发自收测试
下面我们使用另外一组UART进行测试
- UCA0_TXD: P3.3
- UCA0_RXD: P3.4
由于没有其它串口线,所以需要同时使用USB的串口调试功能,也就是说两套UART接口,在energia中也就是`serial` 与 `serial1`. `serial` 对应 USB 串口调试, `serial1`对应 UCA0.
我们用两套UART实现很简单的功能,来验证UCA0 UART。首先使用杜邦线把UCA0 的收发接口接在一起,
这样一来,从serial1输出的数据都将返回到serial1,也就是所谓的**自发自收**。然后将接收的数据通过serial也就是USB发送到PC端,通过串口监视器就可以看到serial1发送的数据了。
### 代码
```c
long randNumber;
void setup() {
// put your setup code here, to run once:
//Initialize serial and wait for port to open:
Serial.begin(9600);
Serial1.begin(9600);
// prints title with ending line break
Serial.println("Start testing");
}
void loop() {
// put your main code here, to run repeatedly:
randNumber = random(300);
Serial1.println(randNumber);
while (Serial1.available() > 0) {
Serial.println(Serial1.readStringUntil('\n'));
delay(1000);
}
}
```
### 测试
将代码编译下载到开发板,打开串口监视器,reset一下,就可以看到监视器在接收数据了。
单独看监视器好像无法看出数据到底是来自哪个串口,为了验证,我们在运行过程中把杜邦线拔掉,就可以发现数据停止传输了,说明数据中断了,这也验证了serial1的数据收发一切正常,数据流如下:
```yml
serial1 TXD -> serial1 RXD -> serail TXD -> PC
```
## 小结
本章主要对UART接口及其使用方法进行了详细介绍,让大家能够更快上手。UART串口调试非常有利于代码功能的测试,就好比各种嵌入式设备的console输出,可以通过串口打印debug log帮助分析当前的运行状态,有助于快速定位bug或调试功能。
## 参考文档
以下参考文档都可以从官方网站得到,为了方便都放这了,后续文章就不重复添加了。
ps: 有份文档重复添加了,但是没法删除,忽略就好,哈哈。
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>谢谢分享,不错的资料</p>
<p>看得出,用心了</p>
<p>这个截图是真的多,不错哈,之前大学电赛用的就是这块板子,目前手上也有一块。积灰中。。。</p>
页:
[1]