6. 串口通讯¶
本章主要讲解LubanCat-H618系列板卡的pin引脚中串口的基本使用。
6.2. 使能串口接口¶
串口在默认情况是关闭状态的,需要使能才能使用
可以通过打开 /boot/uEnv.txt 查看是否启用了uart相关设备设备树插件。
注意
开启UART2和UART5设备树插件时,需要将其对应物理引脚的其他功能设备树插件删除
这里以激活 UART2 和 UART5 为例,选择需要开启的设备树插件,粘贴到 overlays=
后面,多个设备树插件开启,设备树插件之间要用空格隔开,如下图:

然后重启激活设备
注解
如果是直接拔电源的方式重启,会有可能出现文件没能做出修改 (原因:文件未能及时从内存同步到存储设备中,解决方法,在终端上输入 “sync” 再拔电关机)
6.3. 检查串口设备¶
查看串口有没有成功使能
1 2 | #执行命令查看终端设备
ls /dev/tty*
|
ttyAS2和ttyAS5分别对应UART2和UART5
如下图(作者使用LubanCat-A1):

6.4. 串口通讯实验(Shell)¶
本次实验以LubanCat-A1板卡讲解,其他板卡的操作和本实验类似,这里就不过多赘述了。 使用板卡上的串口2和串口5进行实验,对应的设备文件为/dev/ttyAS2和/dev/ttyAS5。 对tty的设备文件直接读写就可以控制设备通过串口接收或发送数据,下面我们使用板卡本身的UART2和UART5串口进行测试。
6.4.2. 查询串口的通信参数¶
串口外设使能后,在/dev目录下生成ttyS3设备文件,用stty工具查询其通信参数
1 2 3 | #在板卡的终端执行如下命令
stty -F /dev/ttyAS2
stty -F /dev/ttyAS5
|
如下图:

6.4.3. 修改串口波特率¶
1 2 3 | #设置通讯速率,其中ispeed为输入速率,ospeed为输出速率
stty -F /dev/ttyAS2 ispeed 115200 ospeed 115200
stty -F /dev/ttyAS5 ispeed 115200 ospeed 115200
|
如下图:

6.4.5. 通讯测试¶
下面我们使用LubanCat-A1板卡进行UART2和UART5相互通讯测试
打开两个终端,其中一个终端输入:
1 2 3 4 | #使用cat命令读取终端设备文件
cat /dev/ttyAS2
#cat命令会等待
#终端会输出接收到的内容
|
另一个终端输入:
1 2 3 4 5 | #在板卡上的终端执行如下指令
#使用echo命令向终端设备文件写入字符串
echo Hello,lubancat! > /dev/ttyAS5
echo "我在通过UART5发消息" > /dev/ttyAS5
#另一个终端会接收到内容
|
结果如下图所示:

6.5. 与Windows主机通讯¶
下面我们使用板卡配合Windows下的串口调试助手进行测试。板卡使用UART5与串口模块进行连接,连接时注意板卡和串口模块的TX和RX要交替连接。 配置好串口调试助手后,尝试使用如下命令测试发送数据:
1 2 3 4 5 | #在板卡上的终端执行如下指令
#使用echo命令向终端设备文件写入字符串"Hello!"、"I'm lubancat"
echo Hello! > /dev/ttyAS5
echo "I'm lubancat" > /dev/ttyAS5
#Windows上的串口调试助手会接收到内容
|
往/dev/ttyAS5设备文件写入的内容会直接通过串口线发送至Winodws的主机。
而读取设备文件则可接收Winodws主机发往板卡的内容,可以使用cat命令来读取:
1 2 3 4 5 6 7 | #在板卡上的终端执行如下指令
#使用cat命令读取终端设备文件
cat /dev/ttyAS5
#cat命令会等待
#使用串口调试助手发送字符串
#字符串最后必须加回车!
#板卡的终端会输出接收到的内容
|
6.6. 串口通讯实验案例(C程序)¶
6.6.1. 串口发送实验¶
本次实验以LubanCat-A1板卡讲解,其他板卡的操作和本实验类似,这里就不过多赘述了。 使用板卡上的串口2和串口5进行实验,对应的设备文件为/dev/ttyAS2和/dev/ttyAS5。 下面我们使用板卡本身的UART2和UART5串口进行测试。
该实验只需连接一根杜邦线。当然您也可以连接两根,但需要关闭回显。
1 2 | 板卡 - 板卡
UART2_RX(3) --- UART5_TX(8)
|
1 | quick_start/uart/uart_send.c
|
代码较长复制粘贴容易乱序,可以下载我们提供的源码 uart_send.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <termios.h>
#include <string.h>
#include <sys/ioctl.h>
//第一部分代码/
//根据具体的设备修改
const char default_path[] = "/dev/ttyAS5";
int main(int argc, char *argv[])
{
int fd;
int res;
char *path;
char send_buf[1024] = "Embedfire tty send test.\n";
// 标准输出设备
int save_fd = dup(STDOUT_FILENO);
//第二部分代码/
//若无输入参数则使用默认终端设备
if (argc > 1)
path = argv[1];
else
path = (char *)default_path;
//获取串口设备描述符
printf("This is tty/uart send demo.\n");
fd = open(path, O_RDWR);
if (fd < 0) {
printf("Fail to Open %s device\n", path);
return 0;
}
//第三部分代码/
struct termios opt;
//清空串口接收缓冲区
tcflush(fd, TCIOFLUSH);
// 获取串口参数opt
tcgetattr(fd, &opt);
//设置串口输出波特率
cfsetospeed(&opt, B9600);
//设置串口输入波特率
cfsetispeed(&opt, B9600);
//设置数据位数
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
//校验位
opt.c_cflag &= ~PARENB;
opt.c_iflag &= ~INPCK;
//设置停止位
opt.c_cflag &= ~CSTOPB;
//更新配置
tcsetattr(fd, TCSANOW, &opt);
printf("Device %s is set to 9600bps,8N1\n",path);
//第四部分代码/
//write函数串口发送字符串
write(fd, send_buf, strlen(send_buf));
int send_time=0; //发送次数
while (1)
{
// 切换为printf串口输出(重定向)
dup2(fd,STDOUT_FILENO);
send_time++;
printf("lubancat %s output message 第%d次\n",path,send_time);
// 切换回printf标准输出(重定向)
dup2(save_fd,STDOUT_FILENO);
printf("完成%d次串口数据发送\n",send_time);
sleep(2);
}
close(fd);
return 0;
}
|
运行以下命令
1 2 3 4 5 6 7 | #打开一个终端,配置UART2并监听
stty -F /dev/ttyAS2 ispeed 9600 ospeed 9600
cat /dev/ttyAS2
#打开另一个终端,编译运行程序
gcc uart_send.c -o uart_send
sudo ./uart_send
|
运行结果如下:

6.6.2. 串口接收实验¶
该实验只需连接一根杜邦线。当然您也可以连接两根,但需要关闭回显。
1 2 | 板卡 - 板卡
UART2_TX(5) --- UART5_RX(10)
|
1 | quick_start/uart/uart_receive.c
|
代码较长,文档不作展示,可以直接下载我们提供的源码 uart_receive.c
注意
波特率太低容易导致接收的数据分段显示,请参考例程波特率进行设置
运行以下命令
1 2 3 4 5 6 7 8 9 | #打开一个终端,配置UART2波特率
stty -F /dev/ttyAS2 ispeed 115200 ospeed 115200
#打开另一个终端,编译运行程序
gcc uart_receive.c -o uart_receive
sudo ./uart_receive
#返回第一个终端,进行数据发送
echo "hello lubancat" > /dev/ttyAS2
|
运行结果如下:
