如何让C程序使用Linux的虚拟串口与Python程序通信?
How to make C program communicate with Python program using Linux's virtual serial ports?
我想将数据从 C 程序发送到一个 Python 程序,该程序将可视化此数据。开发环境是 Linux (Ubuntu 18.04LTS) 计算机。更清楚地说,这两个程序 运行 在同一台计算机上。
我在 C 程序中使用 termios 打开串口,在 Python 端使用 pySerial。至于串口,我用的是"ttyS0"。问题是,当我从 C 程序发送 "Hello" 到 Python 程序并在终端上打印它时,我看到的是 space 字符,基本上我正在获取这个“”。
我的问题是,我可以为此目的使用 "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()
ttyS0 是您计算机的串行端口 -- 与它无关 "virtual"。写入该设备将尝试使用该端口将数据传输出计算机,而从该设备读取将尝试从连接到该端口的外部设备接收数据。同一台计算机上的两个程序无法使用串行端口进行有效通信。
我认为您在这里寻找的是 pipe, a socket pair, or a pty。哪一个最合适将取决于您的具体要求。
我想将数据从 C 程序发送到一个 Python 程序,该程序将可视化此数据。开发环境是 Linux (Ubuntu 18.04LTS) 计算机。更清楚地说,这两个程序 运行 在同一台计算机上。
我在 C 程序中使用 termios 打开串口,在 Python 端使用 pySerial。至于串口,我用的是"ttyS0"。问题是,当我从 C 程序发送 "Hello" 到 Python 程序并在终端上打印它时,我看到的是 space 字符,基本上我正在获取这个“”。
我的问题是,我可以为此目的使用 "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()
ttyS0 是您计算机的串行端口 -- 与它无关 "virtual"。写入该设备将尝试使用该端口将数据传输出计算机,而从该设备读取将尝试从连接到该端口的外部设备接收数据。同一台计算机上的两个程序无法使用串行端口进行有效通信。
我认为您在这里寻找的是 pipe, a socket pair, or a pty。哪一个最合适将取决于您的具体要求。