虚拟串口

虚拟串口#

以下是一个使用 /dev/ptmx 创建虚拟串口的示例程序。这个程序会创建一个主从伪终端对,允许在两个进程之间进行通信。

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

int main() {
    int master_fd;
    char slave_name[256];
    char buffer[256];
    ssize_t bytes_read;

    // 创建虚拟串口
    master_fd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
    if (master_fd == -1) {
        perror("Failed to open /dev/ptmx");
        exit(EXIT_FAILURE);
    }

    if (grantpt(master_fd) == -1 || unlockpt(master_fd) == -1) {
        perror("Failed to setup pseudo-terminal");
        close(master_fd);
        exit(EXIT_FAILURE);
    }

    if (ptsname_r(master_fd, slave_name, sizeof(slave_name)) != 0) {
        perror("Failed to get slave device name");
        close(master_fd);
        exit(EXIT_FAILURE);
    }

    printf("Virtual serial port ready:\n");
    printf("Slave device: %s\n", slave_name);
    printf("Waiting for incoming data...\n");

    // 持续读取数据
    while (1) {
        bytes_read = read(master_fd, buffer, sizeof(buffer) - 1);

        if (bytes_read == -1) {
            perror("Read error");
            break;
        } else if (bytes_read == 0) {
            // 连接关闭
            printf("Connection closed\n");
            break;
        } else {
            buffer[bytes_read] = '\0';
            printf("Received: %s", buffer);

            // 这里可以添加数据处理逻辑
            // 例如:解析数据、响应等
        }
    }

    close(master_fd);
    return 0;
}

另一个进程持续向虚拟串口写入数据:

#!/bin/bash

if [ $# -eq 0 ]; then
    echo "Usage: $0 <slave_device>"
    echo "Example: $0 /dev/pts/2"
    exit 1
fi

SLAVE_DEVICE=$1

echo "Writing to slave device: $SLAVE_DEVICE"
echo "Type your messages (Ctrl+D to exit):"

while read line; do
    echo "$line" > $SLAVE_DEVICE
    sleep 0.1
done
echo "Hello from terminal" > /dev/pts/2