1. 程式人生 > >利用ptmx搭建本地虛擬串列埠迴環測試環境

利用ptmx搭建本地虛擬串列埠迴環測試環境

留個備份,執行這個搭建程式可以在當前目錄生成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;
}

相關推薦

利用ptmx搭建本地虛擬串列測試環境

留個備份,執行這個搭建程式可以在當前目錄生成ttyNeo1和ttyNeo2兩個互連的虛擬串列埠,在Linux上寫上位機和下位機串列埠通訊程式時就不需要利用物理串列埠測試了。 #define _XOPEN_SOURCE #include <stdio.h> #i

日常生活小技巧 -- UART (串列)測試

轉自https://blog.csdn.net/qq_29350001/article/details/77335721   新買的USB轉串列埠線。需要測試一下是否是OK的。該如何測試? 其實很簡單,就是講 Tx  和 Rx 短接,即DB9 的 2、3 兩針接在一起

Win7雙機除錯環境搭建之配置VMware的管道虛擬串列

轉:http://www.16boke.com/article/detail/171 WinDbg除錯核心時,被設計為雙機除錯,需要另一臺計算機(除錯機)來除錯被除錯的計算機(被除錯機),WinDbg必須安裝在除錯機上,除錯機與被除錯機通過串列埠相連線。   環境: 主機:

WinCE裝置模擬器+虛擬串列+GPS模擬器搭建開發測試環境

所需軟體: 1、WinCE 5.0裝置模擬器 2、虛擬串列埠工具Virtual Serial Port Driver 6.9 3、Virace GPS 模擬器0.3.1chs 模擬環境: COM2:連線WinCE裝置模擬器 COM7:連線GPS模擬器 環境搭建步驟: 1

Debian利用iso搭建本地軟件源

debianDebian利用iso搭建本地軟件源: mount -o loop debian-9.4.0-amd64-DVD-1.iso /space/deb/ vi /etc/apt/source.list (將原有內容註釋,前加#) :wq apt-cdrom -m -d /space/deb/ add

WIN7 64位系統 CDC類 虛擬串列驅動無法安裝的解決辦法(2)

(1)最近用STM32使用USB——CDC類出現驅動安裝失敗的情況。 百度了一些網頁,方法很多,大多數是按照如下步驟處理: 首先,確保C:\Windows\System32\drivers\usbser.sys檔案存在; 其次,修改C:\Windows\inf\mdmcpq.inf檔

轉 [經驗] STM32 USB虛擬串列(有原始碼)

原文出處:http://bbs.elecfans.com/jishu_467116_1_1.html   串列埠除錯在專案中被使用越來越多,串列埠資源的緊缺也變的尤為突出。很多本本人群,更是深有體會,不準備一個USB轉串列埠工具就沒辦法進行開發。本章節來簡單概述STM32低端晶片上

WIN7 64位系統 CDC類 虛擬串列驅動無法安裝的解決辦法

最近用STM32使用USB——CDC類出現驅動安裝失敗的情況。 百度了一些網頁,方法很多,但是我這裡按如下步驟處理: 首先,確保C:\Windows\System32\drivers\usbser.sys檔案存在; 其次,修改C:\Windows\inf\mdmcpq.inf檔案;

WIN7 CDC類 虛擬串列驅動無法安裝的解決辦法

最近用STM32做了個USB轉虛擬串列埠,但是驅動怎麼也安裝不上。因為曾經用清理工具把系統內不用的驅動清理過,所以關鍵的usbser.sys什麼的都沒有,但是下載後新增到系統內還是不行。 百度一番後,找到了解決辦法。 發一個關於cdc comms interface驅動無

Winform串列程式設計---接收資料demo(VSPD虛擬串列

參考地址:https://blog.csdn.net/memgxingfeixiang/article/details/52513970      https://blog.csdn.net/kevin_iot/article/details/53926599   一、需求概述  

cypress虛擬串列(CDC_ACM)在Linux下不出現的問題

網上找的高人帖子: https://community.cypress.com/thread/14010?start=0&tstart=0 關鍵的yidu一段話:, I managed to access the serial port in Linux: - chan

STM32F103 虛擬串列驅動安裝失敗的解決方法

拿到論壇的STM32F303RE的板子後,我的電腦就一直無法安裝Stlink虛擬出來的那個串列埠,只能枚舉出來Stlink下載和模擬U盤的裝置,試了很多方法都不行。因為我的電腦之前還正確安裝過ST的其他系列的片子上USB模擬的虛擬串列埠,而安裝驅動的本質就是使用ST的那個IN

WINCE5.0利用C#語言編寫的串列採集、顯示和儲存

          首先簡單說一下該程式實現的功能:定時採集現場的資料,在介面上實時顯示裝置資料,同時將採集到的裝置資料儲存到sqlite中,以方便第三方資料呼叫。該程式使用在wince5.0中,使用的是VS2008 C#語言。         內容涉及到wince同步的應

使用虛擬串列軟體和串列除錯助手來測試串列通訊程式碼

轉載自:http://blog.csdn.net/u013232740/article/details/49838233 為解決計算機的物理串列埠個數的限制,在進行串列埠除錯實驗時,應儘可能採用虛擬串列埠軟體。VSPD(Virtual Serial Ports Driv

USB虛擬串列

現代嵌入式系統中,非同步序列通訊介面往往作為標準外設出現在微控制器和嵌入式系統中。但是隨著個人計算機通用外圍裝置越來越少地使用串列埠,串列埠正在逐漸從個人計算機特別是行動式電腦上消失。於是嵌入式開發人員常常發現自己新買來的計算機上沒有串列埠,或者出現除錯現場使用者的計算機沒有串列埠的尷尬局面。相反,

虛擬串列軟體和串列除錯助手的簡單使用

為解決計算機的物理串列埠個數的限制,在進行串列埠除錯實驗時,應儘可能採用虛擬串列埠軟體。VSPD(Virtual Serial Ports Driver)虛擬串列埠軟體是由Eltima軟體公司設計的虛擬串列埠軟體,使用方便且穩定。同時,使用虛擬串列埠也是規避風險的好辦法,尤

C/C++編寫一個定時往串列虛擬串列)傳送資料的程式

利用C/C++來設計一個定時往串列埠(虛擬串列埠)傳送資料的程式,包括虛擬串列埠的配置與串列埠的接收顯示資料: 程式如下: #include<iostream> #include<windows.h> using namespace std;

USB虛擬串列實驗_STM32F1開發指南_第五十三章——USB學習筆記

前言     STM32F103系列晶片都自帶USB,不過STM32F103的USB都只能用來做裝置,而不能用作主機。 目錄: 53.1 USB簡介     USBF103自帶的USB符合USB2.0規範。     在USB主機上,D-和D+都接了15K下拉電

WinCE usb虛擬串列

1.Usb驅動程式的載入 識別到USB裝置插入到電腦上(姑且這麼認為吧) fRet = LoadDeviceDrivers(pDev, &fLoaded); if(fRet && !fLoaded) { //失敗了,提示使用者對話方塊, } 1.1L

嵌入式Linux驅動初探 虛擬串列裝置驅動編寫

文章目錄 1.說明 所謂虛擬串列埠裝置意為這個串列埠是虛擬的,不能用來實現與下位機的串列埠收發。但是他可以將從使用者那兒收到的資料,原封不動的回傳給使用者。相當於一個迴環。 這一功能的實現主要是在驅動中實現一個FIFO。驅動接收到使用者資料後,先將之放入FIFO