Linux下的虚拟终端(可用于在本机上模拟串口进行调试)

转载:http://blog.sina.com.cn/s/blog_6cb543ef0100x90j.html

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

Python:

#! /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)

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

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

receiver.c

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <math.h>

#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;
}

send.c

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>

#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;
}

编译运行即可,呵呵.

时间: 2024-10-08 04:37:16

Linux下的虚拟终端(可用于在本机上模拟串口进行调试)的相关文章

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gdb-7.2.tar.bz2 这个文件为例.2.解压缩: $ tar jxvf gdb-7.2.tar.bz2 注:小技巧:Linux下一般压缩文件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是一致的: xf(v),前者再加上j选项,后者再加上z选项. 3.进入该目录 $ cd g

Linux下搭建iSCSI共享存储详细步骤(服务器模拟IPSAN存储)

一.简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择.iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料. iSCSI是一种基于TCP/IP 的协议,用来建立和管理IP存储设备.主机和客户机等之间的相互连接,并创建存储区域网

linux下samba服务器的搭建(案列模拟)

模拟案列: ABC公司有4个部门:sales+design+develop+ops 现在要分别给这四个部门设立各自独立的共享文件夹和一个都能读写的share文件夹 考虑到误删或者恶意删除同部门其他员工的文件,需要用到sticky属性,sticky一般作用在目录上,一旦作用了,那么这么目录下的文件只能由文件创始人或者root删除. 开干! Step1 创建目录结构 mkdir -p /ABC/{design,sales,develop,ops,share{design,sales,develop,

Linux下串口编制【转】

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

Linux下如何使用ping命令

转自:http://q16964777.blog.163.com/blog/static/250555066201561744149503/ Linux下的ping命令用于查看网络上的主机是否在工作.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常.ping命令的一般格式为:ping [-dfnqrRv][-c<发送次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载 入&g

解决Linux下Oracle中文乱码的一些心得体会 ,转自

以下转自 http://blog.itpub.net/29151695/viewspace-1173238/ 最近在linux上安装完oracle 10gR2后,又遇到了字符集乱码的问题,之前在网上找了下,然后解决完后就不了了之了,这次又碰到此类问题,所以就认真下来花点时间去测试了一番,经过一些测试,现在已经解决了问题,现在把自己遇到的问题和解决方法记录一下,方便自己日后查找. 测试环境如下: 测试平台: VMware? Workstation 9.0.2 build-1031769 (注:VM

Linux下安装android手机ADB驱动

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Linux下开发安卓,少不了要用到真机进行调试,测试,所以首先要保证Linux能驱动你的手机,驱动安装步骤如下: 安装步骤: 1. 检测你的Linux是否能驱动你的手机 如果你已经下载sdk,但未加入环境变量,那么你可以进入sdk目录下的platform-tools文件夹下找到adb,比如我的adb目录为/home/jesson/develop/adt-bundle-linu

Linux系统下的shutdown命令用于安全的关闭/重启计算机

Linux系统下的shutdown命令用于安全的关闭/重启计算机,它不仅可以方便的实现定时关机,还可以由用户决定关机时的相关参数.在执行shutdown命令时,系统会给每个终端(用户)发送一条屏显,提示关机操作.定时关机只需要一个简单的参数,既可以是倒计时,也可以是确切的时间. 命令格式 1 shutdown [选项] [时间] [消息] 并有如下选项: - k 不执行任何关机操作,只发出警告信息给所有用户 - r 重新启动计算机 - h 关机并彻底断电 - f 快速关机且重启动时跳过fsck

17 个 Linux 下用于 C/C++ 的最好的 IDE

C++,一个众所周知的 C 语言的扩展,是一个优秀的.强大的.通用编程语言,它能够提供现代化的.通用的编程功能,可以用于开发包括视频游戏.搜索引擎.其他计算机软件乃至操作系统等在内的各种大型应用. C++,提供高度可靠性的同时还能够允许操作底层内存来满足更高级的编程要求. 虽然已经有了一些供程序员用来写 C/C++ 代码的文本编辑器,但 IDE 可以为轻松.完美的编程提供综合的环境和组件. 在这篇文章里,我们会向你展示一些可以在 Linux 平台上找到的用于 C++ 或者其他编程语言编程的最好的