6. 串口通讯

本章主要讲解LubanCat-H618系列板卡的pin引脚中串口的基本使用。

6.1. 串口引脚关系

下图为LubanCat-A1的UART引脚。

未找到图片

6.2. 使能串口接口

串口在默认情况是关闭状态的,需要使能才能使用

可以通过打开 /boot/uEnv.txt 查看是否启用了uart相关设备设备树插件。

注意

开启UART2和UART5设备树插件时,需要将其对应物理引脚的其他功能设备树插件删除

这里以激活 UART2UART5 为例,选择需要开启的设备树插件,粘贴到 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.1. 连接串口

实验前需要使用杜邦线连接起来。

1
2
3
    板卡       -     板卡
UART2_RX(3)  --- UART5_TX(8)
UART2_TX(5)  --- UART5_RX(10)

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.4. 关闭回显

默认串口是开启回显的 可以使用以下命令关闭回显

注意

下面测试需要用到回显,即无需执行以下命令

1
stty -F /dev/ttyS3 -echo

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

quick_start/uart/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

运行结果如下:

未找到图片