自学内容网 自学内容网

Linux串口设备的使用<ubuntu>

在 Ubuntu 系统中,使用 USB 转串口适配器通常涉及几个步骤,从确认适配器被系统识别到安装必要的驱动程序,以及实际使用该设备。这些适配器通常基于某些常见的芯片,如 FTDI、Prolific PL2303 或 Silicon Labs CP210x 等。下面是如何在 Ubuntu 上操作 USB 转串口设备的步骤:

一:串口设备识别:

步骤 1: 连接设备并检查识别

  1. 连接 USB 转串口适配器到 Ubuntu 系统。

  2. 打开终端。

  3. 输入以下命令来检查系统是否识别了设备:

    dmesg | grep tty
    

    这个命令会在系统消息中搜索 tty,因为串口设备通常被识别为 /dev/ttyUSB0/dev/ttyUSB1 等。如果设备被正确识别,你应该会看到包含这些设备名的消息。

步骤 2: 安装驱动程序

大多数现代 Linux 发行版,包括 Ubuntu,已经预装了最常见的 USB 转串口芯片的驱动程序。如果设备没有被自动识别,可能需要手动安装驱动程序:

  • FTDI: 通常已经包含在 Linux 内核中,无需额外安装。
  • Prolific PL2303: 同样通常已包含在现代 Linux 发行版中。
  • Silicon Labs CP210x: 对于一些较新的设备,如果没有预装驱动,可以从 Silicon Labs 的官方网站下载并安装。

如果确定需要安装驱动,可以使用以下命令安装(以常见的驱动为例):

sudo apt-get update
sudo apt-get install linux-headers-$(uname -r) build-essential

步骤 3: 配置串口通信【不好用别尝试】

使用任何标准的串口通信程序,如 minicomscreenpicocom,可以与串口设备进行通信。例如,使用 minicom一个在终端上运行的类似):

  1. 安装 minicom

    sudo apt-get install minicom
    
  2. 运行 minicom 配置向导:

    sudo minicom -s
    
  3. minicom 的设置菜单中,设置串口设备(如 /dev/ttyUSB0)和波特率等参数。

  4. 保存配置并启动 minicom

步骤 4: 测试通信

一旦配置好,你可以开始通过串口发送和接收数据,以验证设备的功能性。

常见问题处理

  • 权限问题:如果在尝试访问设备时遇到权限错误,可能需要将当前用户添加到 dialout 组:

/dev/ttyUSB0 permission denied. 因为一般情况下不是root用户,对端口没有权限. 遇到这种情况,

一般这样做:
sudo chmod 777 /dev/ttyUSB0
修改权限为可读可写可执行,但是这种设置电脑重启后,又会出现这种问题,还要重新设置.因此查询资料,可以用下面这条指令:

如 :

sudo usermod -a -G dialout $USER

然后重新登录或重启计算机。

  • 驱动不兼容:如果设备不工作,检查是否有针对你的设备型号的特定驱动或更新的内核模块。

因为默认情况下,只有root用户和属于dialout组的用户会有读写权限,因此直接把自己的用户加入到dialout组就可以了。操作完命令后要logout一下,就永久生效了。这样下次重启也不用修改权限了。

通过以上步骤,你应该能够在 Ubuntu 上成功设置和使用 USB 转串口适配器。如果有任何问题或需要进一步的帮助,请提供更多的信息,例如具体的设备型号和遇到的错误消息。

在 Linux 系统中,你可以通过命令行工具直接向串口设备发送数据,而无需编写专门的程序。这可以通过多种方式完成,包括使用内置的命令如 echo 结合重定向操作符,或使用更专业的工具如 screenminicom。这里我将展示几种方法来实现这一目的。

二:串口发送:

方法 1: 使用 echo 和重定向

这是最简单的方法,使用 echo 命令将数据发送到串口设备:

echo "Hello, this is a test message" > /dev/ttyUSB0

这条命令会将字符串 “Hello, this is a test message” 发送到 /dev/ttyUSB0。请确保你已经正确配置了串口的波特率和参数,否则设备可能无法正确解读发送的数据。

方法 2: 使用 stty 设置串口参数

在使用 echo 发送数据之前,你可能需要先设置串口的波特率和参数以确保设备可以正确接收数据。使用 stty 命令来配置这些参数:

# 设置波特率为 9600
stty -F /dev/ttyUSB0 9600

# 设置数据位、停止位和无奇偶校验
stty -F /dev/ttyUSB0 cs8 -cstopb -parenb

# 现在发送数据
echo "Hello, this is a test message" > /dev/ttyUSB0

方法 3: 使用 screen 作为终端程序

screen 是一个功能强大的终端复用器,它也可以用来作为串口终端程序。使用 screen 可以在命令行中开启一个会话,直接与串口设备交互:

screen /dev/ttyUSB0 9600

这条命令会打开一个新的 screen 会话,连接到 /dev/ttyUSB0,波特率设置为 9600。你可以直接在 screen 会话中输入文本,输入的文本会发送到串口。要退出 screen,可以按 Ctrl-A 然后按 K,再确认退出。

方法 4: 使用 minicom

minicom 是一个基于文本的视窗程序,用于与串口设备进行交互。首先确保 minicom 已经安装在你的系统上:

sudo apt install minicom

然后运行 minicom 配置向导来设置串口参数:

sudo minicom -s

在配置界面中选择 “Serial port setup” 并配置串口参数和波特率。保存配置后,可以直接在 minicom 中发送和接收数据。

三:串口接收:

在 Linux 系统中,要查询通过特定串口端口接收的信息,可以使用几种方法。这些方法包括使用命令行工具如 catscreenminicom,这些工具能够帮助你监听和显示从串口收到的数据。

方法 1: 使用 cat 命令

cat 命令可以用来输出串口接收到的数据。要做到这一点,你可以简单地将串口设备文件作为 cat 命令的输入。这样,所有从该串口接收到的数据都会被显示在终端上:

cat /dev/ttyUSB0

这条命令会显示从 /dev/ttyUSB0 接收到的所有数据。请注意,你需要确保串口的配置(如波特率和参数设置)是正确的,以匹配你期望通信的设备配置。

方法 2: 使用 screen 查看实时数据

如前所述,screen 可以用作串口终端,用来发送和接收数据。它同样可以用来查看从串口接收到的数据:

screen /dev/ttyUSB0 9600

这会打开一个 screen 会话,连接到 /dev/ttyUSB0 串口设备,波特率设置为 9600。此会话将显示从该端口接收到的所有数据,直到你退出 screen

方法 3: 使用 minicom 查看数据

minicom 是一个交互式的通信程序,它可以被用来管理串口通信。首先确保配置了 minicom,然后启动它来查看数据:

sudo minicom -s  # 进入配置模式
# 配置串口和波特率
minicom

配置好后,minicom 会话会显示所有通过配置的串口接收到的数据。

方法 4: 使用 socat 工具

socat 是一个多功能的网络工具,可以用来读取和发送串口数据。要实时查看从串口接收到的数据,可以使用:

socat - /dev/ttyUSB0,b9600,raw,echo=0

这条命令设置了波特率为 9600,并连接到 /dev/ttyUSB0,同时关闭了回声,这意味着输入不会被直接发送到输出。

注意

在使用以上方法之前,请确保你的用户有足够的权限访问串口设备。通常,你可能需要将你的用户账户添加到 dialout 用户组:

sudo usermod -a -G dialout $USER

然后重启或重新登录以使改动生效。这些方法为你提供了灵活的方式来查看通过 Linux 系统的串口接收到的数据。

四:DEMO程序:

在 C++ 中编写一个使用串口通信的程序相较于 Python 更为复杂,因为 C++ 没有标准的串口通信库。在 Linux 系统下,通常使用 POSIX API 直接操作串口。以下是一个简单的 C++ 程序示例,它使用 /dev/ttyUSB0 串口进行收发操作:

步骤 1: 创建串口操作的 C++ 程序

这个程序将使用 POSIX API 打开串口,配置串口参数,并进行基本的读写操作。

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <cstring>

int main() {
    const char* port = "/dev/ttyUSB0";
    int fd = open(port, O_RDWR | O_NOCTTY);

    if (fd == -1) {
        std::cerr << "Failed to open port " << port << std::endl;
        return -1;
    }

    // 获取并修改串口设置
    struct termios tty;
    memset(&tty, 0, sizeof tty);

    if (tcgetattr(fd, &tty) != 0) {
        std::cerr << "Error from tcgetattr: " << strerror(errno) << std::endl;
        return -1;
    }

    tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity (most common)
    tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication (most common)
    tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size
    tty.c_cflag |= CS8; // 8 bits per byte (most common)
    tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common)
    tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)

    tty.c_lflag &= ~ICANON;
    tty.c_lflag &= ~ECHO; // Disable echo
    tty.c_lflag &= ~ECHOE; // Disable erasure
    tty.c_lflag &= ~ECHONL; // Disable new-line echo
    tty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSP
    tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
    tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); // Disable any special handling of received bytes

    tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars)
    tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed

    tty.c_cc[VTIME] = 10;    // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.
    tty.c_cc[VMIN] = 0;

    // Set in/out baud rate to be 9600
    cfsetispeed(&tty, B9600);
    cfsetospeed(&tty, B9600);

    if (tcsetattr(fd, TCSANOW, &tty) != 0) {
        std::cerr << "Error from tcsetattr: " << strerror(errno) << std::endl;
        return -1;
    }

    // Write to serial port
    std::string data = "Hello from C++";
    write(fd, data.c_str(), data.size());

    // Read from serial port
    char buffer[100];
    int n = read(fd, buffer, sizeof(buffer));
    if (n > 0) {
        std::cout << "Received: " << std::string(buffer, n) << std::endl;
    }

    close(fd);
    return 0;
}

如何编译和运行

  1. 保存上面的代码为 serial_comm.cpp

  2. 使用 g++ 编译器编译代码:

    g++ -o serial_comm serial_comm.cpp
    
  3. 运行编译后的程序:

    ./serial_comm
    

注意事项

  • 确保你有权限访问 /dev/ttyUSB0。如果没有权限,你可能需要使用 sudo 命令运行程序,或者将用户添加到 dialout 组。
  • 上述程序仅进行了基本的错误检查。在生产环境中,你可能需要增加更完整的错误处理和异常管理。

这个示例程序展示了如何在 Linux 上使用 C++ 和 POSIX API 实现串口通信。


原文地址:https://blog.csdn.net/a15236617777/article/details/140341411

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!