在Linuux下可以通过创建虚拟终端的方法来做为虚拟串口使用,创建的虚拟终端,在建立一个软链接,原来的串口程序可以直接当串口访问,不需要改动原程序的代码。
代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#define BUFFER_SIZE 256
// 配置串口参数
void configure_serial(int fd, int baud_rate) {
structtermios options;
tcgetattr(fd, &options); // 获取当前串口配置
cfsetispeed(&options, baud_rate); // 设置输入波特率
cfsetospeed(&options, baud_rate); // 设置输出波特率
options.c_cflag |= (CLOCAL | CREAD); // 本地连接,接收使能
options.c_cflag &= ~PARENB; // 无奇偶校验
options.c_cflag &= ~CSTOPB; // 1个停止位
options.c_cflag &= ~CSIZE; // 清除数据位掩码
options.c_cflag |= CS8; // 设置8位数据
tcsetattr(fd, TCSANOW, &options); // 应用配置
}
int main() {
int master_fd, slave_fd;
char *slave_name;
char buffer[BUFFER_SIZE];
int n;
// 打开伪终端主设备
master_fd = posix_openpt(O_RDWR | O_NOCTTY);
if (master_fd == -1) {
perror("posix_openpt");
return EXIT_FAILURE;
}
// 授权访问
if (grantpt(master_fd) == -1) {
perror("grantpt");
close(master_fd);
return EXIT_FAILURE;
}
// 解锁伪终端
if (unlockpt(master_fd) == -1) {
perror("unlockpt");
close(master_fd);
return EXIT_FAILURE;
}
// 获取从设备的名称
slave_name = ptsname(master_fd);
if (slave_name == NULL) {
perror("ptsname");
close(master_fd);
return EXIT_FAILURE;
}
printf("Virtual Serial Port created: %sn", slave_name);
// 配置主设备的串口参数
configure_serial(master_fd, B9600);
// 主循环:监听数据并处理
while (1) {
// 从主设备读取数据
n = read(master_fd, buffer, BUFFER_SIZE - 1);
if (n > 0) {
buffer[n] = ''; // 确保字符串以空字符结尾
printf("Received: %sn", buffer);
// 处理数据(这里简单地返回相同的数据)
write(master_fd, buffer, strlen(buffer));
} elseif (n == 0) {
printf("Connection closedn");
break;
} else {
perror("read");
break;
}
}
// 关闭文件描述符
close(master_fd);
return0;
}
编译运行
这里设置的波特率好像不生效的
aarch64-linux-gnu-gcc virtual_tty_main.cpp -o vcom
下载到板子上运行
./vcom
Virtual Serial Port created: /dev/pts/3
/dev/pts/3即为虚拟终端的节点,为了方便使用,可以在代码里将这个节点建立个软链接,比如:
ln -s /dev/pts/3 /dev/com4
阅读全文
1521