不到断气不罢休 发表于 2024-7-13 08:45:37

Linux串口设备的使用<ubuntu>

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

步调 1: 连接设备并检查辨认


[*] 连接 USB 转串口适配器到 Ubuntu 系统。
[*] 打开终端。
[*] 输入以下命令来检查系统是否辨认了设备:
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: 设置串口通信【欠好用别尝试】

使用任何标准的串口通信步调,如 minicom、screen 或 picocom,可以与串口设备举行通信。例如,使用 minicom(一个在终端上运行的类似):

[*] 安装 minicom:
sudo apt-get install minicom

[*] 运行 minicom 设置向导:
sudo minicom -s


[*] 在 minicom 的设置菜单中,设置串口设备(如 /dev/ttyUSB0)和波特率等参数。
[*] 保存设置并启动 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 结合重定向操纵符,或使用更专业的工具如 screen 或 minicom。这里我将展示几种方法来实现这一目的。
二:串口发送:

方法 1: 使用 echo 和重定向

这是最简单的方法,使用 echo 命令将数据发送到串口设备:
echo "Hello, this is a test message" > /dev/ttyUSB0
这条命令会将字符串 “Hello, this is a test message” 发送到 /dev/ttyUSB0。请确保你已经正确设置了串口的波特率和参数,否则设备可能无法正确解读发送的数据。
方法 2: 使用 stty 设置串口参数

在使用 echo 发送数据之前,你可能需要先设置串口的波特率和参数以确保设备可以正确吸收数据。使用 stty 命令来设置这些参数:
# 设置波特率为 9600stty -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 系统中,要查询通过特定串口端口吸收的信息,可以使用几种方法。这些方法包括使用命令行工具如 cat、screen 或 minicom,这些工具能够帮助你监听和显示从串口收到的数据。
方法 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 = 10;    // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.
    tty.c_cc = 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;
    int n = read(fd, buffer, sizeof(buffer));
    if (n > 0) {
      std::cout << "Received: " << std::string(buffer, n) << std::endl;
    }

    close(fd);
    return 0;
}
如何编译和运行


[*] 保存上面的代码为 serial_comm.cpp。
[*] 使用 g++ 编译器编译代码:
g++ -o serial_comm serial_comm.cpp

[*] 运行编译后的步调:
./serial_comm

注意事项



[*]确保你有权限访问 /dev/ttyUSB0。如果没有权限,你可能需要使用 sudo 命令运行步调,或者将用户添加到 dialout 组。
[*]上述步调仅举行了基本的错误检查。在生产环境中,你可能需要增加更完备的错误处理和非常管理。
这个示例步调展示了如何在 Linux 上使用 C++ 和 POSIX API 实现串口通信。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux串口设备的使用<ubuntu>