您的位置:首页 > 运维架构 > Linux

利用ptmx搭建本地虚拟串口回环测试环境

2017-12-16 13:06 645 查看
留个备份,执行这个搭建程序可以在当前目录生成ttyNeo1和ttyNeo2两个互连的虚拟串口,在Linux上写上位机和下位机串口通信程序时就不需要利用物理串口测试了。

#define _XOPEN_SOURCE

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>

#include <signal.h>

#include <poll.h>

static int alive = 0;

static char buf[8*1024] = {0};

static void neo_handler(int sig)

{

    printf("got signal(%d)\n", sig);

    alive = 0;

}

int main(int argc, char **argv)

{

    int ret = 0;

    int m1 = 0;

    int m2 = 0;

    char *pts = NULL;

    struct pollfd pollfds[2];
    signal(SIGTERM, neo_handler);

    signal(SIGINT, neo_handler);
    m1 = open("/dev/ptmx", O_RDWR);

    if (m1 < 0) {

        printf("open /dev/ptmx failed, errno=%d(%s)\n", errno, strerror(errno));

        return -1;

    }

    grantpt(m1);

    unlockpt(m1);
    m2 = open("/dev/ptmx", O_RDWR);

    if (m2 < 0) {

        printf("open /dev/ptmx failed, errno=%d(%s)\n", errno, strerror(errno));

        goto err_m2;

    }

    grantpt(m2);

    unlockpt(m2);
    pts = ptsname(m1);

    if (!pts)

        goto err_pts;

    remove("./ttyNeo1");

    ret = symlink(pts, "./ttyNeo1");

    if (ret < 0) {

        printf("create ./ttyNeo1 failed, errno=%d(%s)\n", errno, strerror(errno));

        goto err_pts;

    }

    pts = ptsname(m2);

    remove("./ttyNeo2");

    ret = symlink(pts, "./ttyNeo2");

    if (ret < 0) {

        printf("create ./ttyNeo2 failed, errno=%d(%s)\n", errno, strerror(errno));

        goto err_pts;

    }
    memset(&pollfds, 0, sizeof(pollfds));

    pollfds[0].fd = m1;

    pollfds[0].events = POLLIN;

    pollfds[1].fd = m2;

    pollfds[1].events = POLLIN;

    alive = 1;

    while (alive) {

        ret = poll(&pollfds[0], 2, 500);

        if ((ret < 0) && (errno == EINTR) || (ret == 0))

            continue;

        else if (ret < 0) {

            printf("poll failed, errno=%d(%s)\n", errno, strerror(errno));

            break;

        }

        if (pollfds[0].revents & POLLIN) {

            memset(buf, 0, sizeof(buf));

            ret = read(m1, buf, sizeof(buf));

            if (ret > 0)

                write(m2, buf, ret);

            pollfds[0].revents = 0;

        }

        if (pollfds[1].revents & POLLIN) {

            memset(buf, 0, sizeof(buf));

            ret = read(m2, buf, sizeof(buf));

            if (ret > 0)

                write(m1, buf, ret);

            pollfds[1].revents = 0;

        }

    }
err_pts:

    close(m2);

    m2 = -1;

err_m2:

    close(m1);

    m1 = -1;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux ptmx pts 串口 回环