首页 > 系统相关 >【linux】一种基于虚拟串口的方式使两个应用通讯

【linux】一种基于虚拟串口的方式使两个应用通讯

时间:2024-09-12 18:25:02浏览次数:15  
标签:buffer 串口 dev 虚拟 fd linux include options

在Linux系统中,两个应用之间通过串口(Serial Port)进行通信是一种常见的通信方式,特别是在嵌入式系统、工业自动化等领域。串口通信通常涉及到对串口设备的配置和读写操作。以下是一个基本的步骤指南,说明如何在Linux中设置两个应用以通过串口进行通信:

1. 确认串口设备

首先,你需要确认你的Linux系统上有哪些串口设备。通常,串口设备在/dev目录下,如/dev/ttyS0/dev/ttyUSB0等。你可以使用dmesg命令查看系统启动时串口设备的识别信息,或者使用ls /dev/tty*来列出所有tty设备。

2. 配置串口参数

串口通信需要配置一些参数,如波特率(Baud Rate)、数据位(Data Bits)、停止位(Stop Bits)、校验位(Parity)等。在Linux中,你可以使用stty命令来配置这些参数。例如,要将/dev/ttyS0配置为9600波特率,8数据位,1停止位,无奇偶校验,可以使用以下命令:

 

3. 编写通信程序

接下来,你需要编写两个程序,一个作为发送方,另一个作为接收方。这些程序可以使用Linux系统调用(如open()read()write()close())来操作串口设备。

示例代码(C语言)

发送方(sender.c)

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <string.h> 


int main() { 
int fd = open("/dev/ttyS0", O_WRONLY); 
if (fd < 0) { 
perror("Error opening serial port"); 
return -1; 
} 


const char *msg = "Hello, Serial Port!"; 
write(fd, msg, strlen(msg)); 


close(fd); 
return 0; 
}

 

接收方(receiver.c)

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <termios.h> 


#define BUFFER_SIZE 1024 


int main() { 
int fd = open("/dev/ttyS0", O_RDONLY | O_NOCTTY | O_NDELAY); 
if (fd < 0) { 
perror("Error opening serial port"); 
return -1; 
} 


// 清除非阻塞标志 
fcntl(fd, F_SETFL, 0); 


char buffer[BUFFER_SIZE]; 
int num_bytes = read(fd, buffer, BUFFER_SIZE); 
if (num_bytes < 0) { 
perror("Error reading from serial port"); 
return -1; 
} 


buffer[num_bytes] = '\0'; 
printf("Received: %s\n", buffer); 


close(fd); 
return 0; 
}

 

4. 编译和运行程序

使用gcc编译你的C程序,并运行它们。确保发送方在接收方之前运行,或者确保接收方能够处理串口数据的到达。

5. 调试

如果通信没有按预期工作,检查以下几点:

  • 串口设备是否正确配置。
  • 串口参数(如波特率)在两个程序中是否一致。
  • 是否有其他程序正在使用同一个串口。
  • 使用dmesgtail -f /var/log/syslog(取决于你的系统)来查看系统日志,了解是否有错误信息。

通过以上步骤,你应该能够在Linux系统中设置两个应用通过串口进行通信。

另附一段串口测试源码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main() {
    int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1) {
        perror("open_port: Unable to open /dev/ttyS0 - ");
        return(-1);
    }

    struct termios options;
    tcgetattr(fd, &options);

    // 设置波特率
    cfsetispeed(&options, B9600);
    cfsetospeed(&options, B9600);

    // 设置数据位数
    options.c_cflag &= ~CSIZE; // Mask the character size bits
    options.c_cflag |= CS8;

    // 设置为无奇偶校验位
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;

    // 设置为一个字符一个停止位
    options.c_cflag &= ~CRTSCTS;

    // 应用设置
    tcsetattr(fd, TCSANOW, &options);

    // 写数据
    char *write_buffer = "Hello World";
    write(fd, write_buffer, sizeof(write_buffer));

    // 读数据
    char read_buffer[100];
    read(fd, read_buffer, sizeof(read_buffer));
    printf("Received: %s\n", read_buffer);

    close(fd);
    return 0;
}

标签:buffer,串口,dev,虚拟,fd,linux,include,options
From: https://blog.csdn.net/qq_34217861/article/details/142182832

相关文章

  • ArchLinux安装简明指南
    本指南将介绍如何不借用archinstall脚本来安装纯命令行界面的ArchLinux到64位系统上。(UEFI+GPT)零、安装前准备首先当然是先进入liveiso环境。增大字号:setfontter-132n测试网络连接是否顺畅:pingarchlinux.org-c5验证系统是否在UEFI模式下启动ls/sys/firmware/efi/......
  • VCSA基于ansible批量创建虚拟机
    基于ansible批量创建虚拟机安装模块pipinstall--upgradeansiblepipinstallPyVmomiansible-galaxycollectioninstallcommunity.vmwareansiblevmware_guest如果需要配置IP和计算机名需要安装VMwaretools----hosts:localhost##在本机执行gather_facts:......
  • 深入剖析 USB 转串口的工作原理与实际应用
    在现代电子设备和计算机硬件的交互中,USB转串口技术扮演着至关重要的角色。它不仅提供了一种便捷的连接方式,还极大地扩展了设备的通信能力。本文将深入剖析USB转串口的工作原理及其在实际应用中的重要性。工作原理USB转串口设备的核心是一个集成电路,它负责将USB接口的信号转换为串行......
  • USB转串口设备在不同通信协议下的性能表现如何?
    USB转串口设备在不同通信协议下的性能表现主要取决于其硬件设计和驱动程序的支持。以下是对几种常见通信协议下USB转串口设备性能的分析:RS-232:这是一种传统的串行通信标准,使用非平衡信号传输,通常用于短距离通信。USB转串口设备在RS-232协议下通常能够提供最高115200bps的波特率,但由......
  • 搭建基于Grafana+Prometheus+Node_exporter的性能监控与分析平台(Linux版)
    搭建基于Grafana+Prometheus+Node_exporter的性能监控与分析平台(Linux版)在现代IT环境中,系统监控与分析是确保应用稳定性和高效性的关键。Prometheus与Grafana的结合,为我们提供了一个强大而灵活的监控解决方案,能够实时地收集、处理并展示系统性能指标。本文将详细介绍如何在Linux......
  • linux管理命令-7
    RPM软件包简介RPM包文件名特征软件名-版本信息.操作系统.硬件架构.rpmfirefox-91.9.0-1.el8_5.x86_64.rpm软件名:firefox软件包名:firefox-91.9.0-1.el8_5.x86_64.rpm[root@nb~]# mount  /dev/cdrom    /mntmount:/dev/sr0写保护,将以只读方式挂载[root@nb~]# ls  /m......
  • linux管理命令-7
    用户账号简介作用:1.可以登陆操作系统2.不同的用户具备不同的权限唯一标识:UID(编号从0开始的编号,默认最大60000)管理员root的UID:永远为0普通用户的UID:默认从1000开始组账号简介作用:方便管理用户唯一标识:GID(编号从0开始的编号,默认最大60000)原则:Linux一个用户必须至少属于一个组组......
  • linux字体安装
    fc-cache命令安装fc-cache是字体配置的一部分,它是fontconfig包的一部分。fc-cache命令用于建立字体信息的缓存,这有助于提高系统识别已安装字体的速度。如果你需要安装fc-cache命令,通常意味着你需要安装fontconfig包。具体安装方法取决于你的操作系统。yuminstallfontconfig涮新......
  • Linux指令记不住的笔记
    ls查看当前路径下内容cd下一级路径名称或者别的路径进入下一级或别的路径cd..退回上一级路径rm文件名删除文件,文件名可以带路径rmdir文件夹名删除文件夹chmod更改文件或目录的权限rwx分别是读(read)、写(write)和执行(execute)ugoa分别是所有者(owner)、所在组(gr......
  • Linux环境C语言pthread多线程
    pthread线程库介绍pthread库是POSIX线程(PortableOperatingSystemInterfaceforuniXthreads)库的简称,它提供了一套创建和管理线程、以及线程间同步的机制。pthread库是UNIX系统上实现多线程编程的一个标准接口,也被广泛支持在类UNIX系统(Linux和macOS)中。头文件#in......