python虚拟串口_Linux下的虚拟串口对(可用于在本机上模拟串口进行调试)

本文介绍了如何通过Python在Linux环境下创建虚拟串口对,以便在本地进行串口通讯程序的调试。通过pty库实现伪终端,创建一对设备名,并给出了如何使用这些虚拟串口进行数据发送和接收的C语言示例程序。
摘要由CSDN通过智能技术生成

今日编写了一个串口通讯程序,但是本机只有一个串口,无法验证程序的正确性,于是想到在linux下面增加一对虚拟串口

Python:

e768079cf448ab16752da501a576ee33.gif

#! /usr/bin/env python

#coding=utf-8

import pty

import os

import select

def mkpty():

# 打开伪终端

master1, slave = pty.openpty()

slaveName1 = os.ttyname(slave)

master2, slave = pty.openpty()

slaveName2 = os.ttyname(slave)

print '\nslave device names: ', slaveName1, slaveName2

return master1, master2

if __name__ == "__main__":

master1, master2 = mkpty()

while True:

rl, wl, el = select.select([master1,master2], [], [], 1)

for master in rl:

data = os.read(master, 128)

print "read %d data." % len(data)

if master==master1:

os.write(master2, data)

else:

os.write(master1, data)

eff48229d3febb3de63be0955f487d33.gif

程序名叫mkptych.py,在终端里运行“python mkptych.py &”,这样就可以生成一个基于pty(伪终端)的虚拟端口对,两个设备名会显示在终端里。然后就可以利用这两个设备名在本机上进行虚拟串口之类的调试,使用完后用ps查看这个python进程的pid号,然后kill掉即可。

下面编写一个用上述虚拟串口的使用程序:

receiver.c

813cb0b2d492bacbc9b3da19824fc10e.gif

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAX_BUFFER_SIZE 512

int fd, s;

int open_serial()

{

//这里的/dev/pts/27是使用mkptych.py虚拟的两个串口名字之一

fd = open("/dev/pts/27", O_RDWR|O_NOCTTY|O_NDELAY);

if(fd == -1)

{

perror("open serial port error!\n");

return -1;

}

printf("open /dev/ttyS0.\n");

return 0;

}

int main()

{

char hd[MAX_BUFFER_SIZE], *rbuf;

int flag_close, retv;

struct termios opt;

retv = open_serial();

if(retv < 0)

{

printf("Open serrial port error!\n");

return -1;

}

tcgetattr(fd, &opt);

cfmakeraw(&opt);

cfsetispeed(&opt, B9600);

cfsetospeed(&opt, B9600);

tcsetattr(fd, TCSANOW, &opt);

rbuf = hd;

printf("Ready for receiving data...\n");

while(1)

{

while((retv = read(fd, rbuf, 1)) > 0)

printf( "%c ", *rbuf);

}

printf("\n");

flag_close = close(fd);

if(flag_close == -1)

printf("Close the device failure!\n");

return 0;

}

84afc878c12140a964d4e788148f4caf.gif

send.c

1d3718ae2e4950fdd08bf6864791594b.gif

#include

#include

#include

#include

#include

#include

#include

#include

#define MAX_BUFFER_SIZE 512

int fd, flag_close;

int open_serial()

{

//这里的/dev/pts/28是使用mkptych.py虚拟的两个串口名字之一

fd = open("/dev/pts/28", O_RDWR | O_NOCTTY | O_NONBLOCK);

if(fd == -1)

{

perror("open serial port error!\n");

return -1;

}

printf("Open serial port success!");

return 0;

}

int main(int argc, char* argv[])

{

char sbuf[] = {"Hello, this is a serial port test!\n"};

int retv;

struct termios option;

retv = open_serial();

if(retv < 0)

{

perror("open serial port error!\n");

return -1;

}

printf("Ready for sending data...\n");

tcgetattr(fd, &option);

cfmakeraw(&option);

cfsetispeed(&option, B9600);

cfsetospeed(&option, B9600);

tcsetattr(fd, TCSANOW, &option);

int length = sizeof(sbuf);

retv = write(fd, sbuf, length);

if(retv == -1)

{

perror("Write data error!\n");

return -1;

}

printf("The number of char sent is %d\n", retv);

return 0;

}

a87d22d2e24f264a1ec5400dcb5bc36f.gif

编译运行即可,呵呵.

简单测试:

echo 123456798 >> /dev/pts/2 这个命令是在linux下发送信息到对端的设备

收的命令很简单就是 cat /dev/pts/3 你接收的那个串口名。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值