如何使用 Linux 的虚拟串口使 C 程序与 Python 程序通信?

Posted

技术标签:

【中文标题】如何使用 Linux 的虚拟串口使 C 程序与 Python 程序通信?【英文标题】:How to make C program communicate with Python program using Linux's virtual serial ports? 【发布时间】:2019-03-23 17:47:42 【问题描述】:

我想将数据从 C 程序发送到 Python 程序,该程序将可视化这些数据。开发环境是一台Linux(Ubuntu 18.04LTS)计算机。更清楚地说,这两个程序都在同一台计算机上运行。

我在 C 程序中使用 termios 打开串口,在 Python 端使用 pySerial。至于串口,我使用的是“ttyS0”。问题是,当我从 C 程序向 Python 程序发送“Hello”并在终端上打印时,我看到的是空格字符,基本上我得到了这个“”。

我的问题是,我可以为此目的使用“ttyS0”串行端口(我猜那是一个虚拟端口)吗?

这是 C 代码:

#include <stdint.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <time.h>

// Termios init functions are not posted because the configuration
// is correct and proved that they are working.

int main()

    char *portname = "/dev/ttyS0";
    int fd;
    int wlen;
    unsigned char writeBuffer[] = "Hello!";

    fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
    if (fd < 0) 
        printf("Error opening %s: %s\n", portname, strerror(errno));
        return -1;
    
    /*baudrate 115200, 8 bits, no parity, 1 stop bit */
    set_interface_attribs(fd, B115200);

    do
        wlen = write(fd, writeBuffer, sizeof(writeBuffer));
        printf("Sent data is: \"%s\"\n", writeBuffer);
        delay(500);
     while(1);

Python 代码:

import serial
from time import sleep

port = "/dev/ttyS0"
ser = serial.Serial(port, 115200, timeout=0.5)

while True:
    data = ser.readline()   
    print(str(data.decode('utf-8')))
ser.close()

【问题讨论】:

【参考方案1】:

ttyS0 是您计算机的串行端口——它没有什么“虚拟”的。写入此设备将尝试使用该端口将数据传输出计算机,从该设备读取将尝试从连接到该端口的外部设备接收数据。同一台计算机上的两个程序无法使用串行端口进行有效通信。

我认为您在这里寻找的是pipe、socket pair 或pty。哪一个最合适取决于您的具体要求。

【讨论】:

以上是关于如何使用 Linux 的虚拟串口使 C 程序与 Python 程序通信?的主要内容,如果未能解决你的问题,请参考以下文章

c语言 让计算机像单片机一样接收串口发来的数据

如何在ubuntu虚拟串口

Linux 中的串口设置是永久的吗?

虚拟机linux下用usb 转串口线,minicom连接SBC2410板,能接收数据,但是不能发送数据?

linux下,如何查看工控机的串口被哪个线程占用,能否使该线程强制释放串口

C与ARM汇编结合实现mini2440串口uart简单程序