日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Linux串口转远程串口,linux虚拟串口及远程访问

發(fā)布時(shí)間:2025/3/19 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux串口转远程串口,linux虚拟串口及远程访问 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 虛擬終端概念

linux中有很多終端,如下簡(jiǎn)單介紹下各種終端或串口的概念。

1.1 tty:終端設(shè)備的統(tǒng)稱(chēng)

tty是Teletype或TeletypeWriter的縮寫(xiě),中文翻譯為電傳打字機(jī)。電傳打字機(jī)通常有鍵盤(pán)、收發(fā)報(bào)器和印字機(jī)等組成,是傳真機(jī)使用以前的通信設(shè)備,原理近似電報(bào)。后被顯示器和鍵盤(pán)所取代,所以現(xiàn)在叫終端比較合適。

終端是一種字符型設(shè)備,他有多種類(lèi)型,通常使用tty來(lái)簡(jiǎn)稱(chēng)各種類(lèi)型的終端設(shè)備。

目前,tty一般指控制終端(man 4 tty),設(shè)備文件是/dev/ttyx,常用的就是linux默認(rèn)提供的6個(gè)命令行終端,可通過(guò)Ctrl+Alt+Fn切換圖形界面或終端窗口。在Ubuntu命令行輸入tty顯示終端:

$ tty

/dev/tty2

1.2 pty:虛擬終端

A pseudoterminal縮寫(xiě)為pty,是虛擬終端或偽終端,可以在終端模擬器(terminal emulator)中運(yùn)行,man pty查看。pty是成對(duì)的邏輯終端設(shè)備(即master和slave設(shè)備,對(duì)master的操作會(huì)反映到slave上,對(duì)slave的操作也會(huì)反映到master上),與實(shí)際物理設(shè)備無(wú)關(guān)。A pty is a pair of virtual character devices that provide a bidirectional communication channel. one end is called master; the other end is called the slave.

linux提供了兩套虛擬終端接口,BSD-style和System V-style,System V-style終端也被稱(chēng)為UNIX 98 pseudoterminals,是目前使用的偽終端樣式。

An unused UNIX 98 pseudoterminal master is opened by calling posix_openpt(3). (This function opens the master clone device, /dev/ptmx; see pts(4).) After performing any program-specific initializations, changing the ownership and permissions of the slave device using grantpt(3), and unlocking the slave using unlockpt(3)), the corresponding slave device can be opened by passing the name returned by ptsname(3) in a call to open(2).

PTM指pseudoterminal master,PTS指pseudoterminal slave。

/dev/ptmx (UNIX 98 master clone device),所有主設(shè)備對(duì)應(yīng)的設(shè)備文件都指向/dev/ptmx

/dev/pts/* (UNIX 98 slave devices)

ssh或Telnet登錄遠(yuǎn)程主機(jī)時(shí)的終端就是pty,運(yùn)行tty查看:

$ tty

/dev/pts/11

偽終端是一對(duì)虛擬的字符設(shè)備,linux內(nèi)核使用一種符合tty線(xiàn)規(guī)程(line discipline)的雙向管道連接偽終端的主從設(shè)備。主設(shè)備上的任何寫(xiě)入操作都會(huì)反映到從設(shè)備上,反之亦然。從設(shè)備上的應(yīng)用進(jìn)程可以像使用傳統(tǒng)終端一樣讀取來(lái)自主設(shè)備上應(yīng)用程序的輸入,以及向主設(shè)備應(yīng)用輸出信息。偽終端從設(shè)備應(yīng)用通常是主設(shè)備應(yīng)用的子進(jìn)程,主應(yīng)用打開(kāi)一對(duì)偽終端并fork一個(gè)子進(jìn)程,然后子進(jìn)程打開(kāi)并使用從設(shè)備。

1.3 串行端口終端

與計(jì)算機(jī)串行端口(RS-232)連接的終端設(shè)備,對(duì)應(yīng)的設(shè)備文件名稱(chēng)為/dev/tty+類(lèi)型+設(shè)備編號(hào),如/dev/ttyS0,S表示設(shè)備類(lèi)型,0為指定類(lèi)型下的設(shè)備編號(hào)。這里的串行端口可以是通過(guò)硬件或軟件模擬的,如USB轉(zhuǎn)串口,虛擬串口。

2. 多個(gè)虛擬終端

Unix 98偽終端使用流程如下:

1.使用posix_openpt打開(kāi)master;

使用grantpt設(shè)置調(diào)用進(jìn)程為slave的屬主并允許其對(duì)slave進(jìn)行讀寫(xiě)操作;

使用unlockpt對(duì)slave解鎖;

使用ptsname返回slave的設(shè)備名;

使用open打開(kāi)slave設(shè)備并進(jìn)行讀寫(xiě)操作。

上述函數(shù)都來(lái)自glibc庫(kù)。偽終端編程更常用的API是openpty,直接實(shí)現(xiàn)了上述流程的所有步驟。login_tty函數(shù)用于實(shí)現(xiàn)在指定的終端上啟動(dòng)登錄會(huì)話(huà)。forkpty函數(shù)整合了openpty、fork和login_tty,在網(wǎng)絡(luò)服務(wù)程序可用于為新登錄用戶(hù)打開(kāi)一對(duì)偽終端,并創(chuàng)建相應(yīng)的會(huì)話(huà)子進(jìn)程。

注意:使用opentty,login_pty和forkpty需要鏈接util庫(kù)。

#include #include#include#include#include#include

#define SLAVE_DEV_NAME_MAX_LEN 128

#define PTY_BUFF_MAX_LEN 1024

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

{int mpty = 0, spty = 0;int rv = 0, n = 0;char spty_name[SLAVE_DEV_NAME_MAX_LEN]={0};char buf[PTY_BUFF_MAX_LEN] = {0};

fd_set rfds;

rv= openpty(&mpty, &spty, spty_name, NULL, NULL);if(-1 ==rv){

perror("Failed to get a pty");return -1;

}

printf("Get a pty pair, FD -- master[%d], slave[%d]\n", mpty, spty);

printf("Slave name is %s\n", spty_name);

FD_ZERO(&rfds);

FD_SET(mpty,&rfds);while(1){

rv= select(mpty+1, &rfds, NULL, NULL, NULL);if(rv < 0){

perror("Failed to select");return -1;

}if(FD_ISSET(mpty, &rfds)){

n=read(mpty, buf, PTY_BUFF_MAX_LEN);if(n > 0){//memset(buf+n, 0, PTY_BUFF_MAX_LEN-n);

printf("recv [%d] bytes:[%s]\n", n, buf);

}else if (n == 0){

printf("Slave closed\n");break;

}else{if(errno ==EINTR){continue;

}

perror("Failed to read the master\n");return -1;

}

}

}

close(mpty);

close(spty);return 0;

}

編譯及運(yùn)行:

gcc pty_test.c -o pty_test -lutil -Wall

$ ./pty_test

Get a pty pair, FD-- master[3], slave[4]

Slave nameis /dev/pts/6recv [1] bytes:[1]

recv [11] bytes:[hello world]

另一終端:

$ echo -n "1" > /dev/pts/6$ echo-n "hello world" > /dev/pts/6

每次運(yùn)行上述程序,生成一個(gè)虛擬終端口(slave),由此同一主機(jī)可運(yùn)行多個(gè)虛擬終端口(slave)。可通過(guò)文件/proc/sys/kernel/pty/max查詢(xún)或修改偽終端數(shù)量。

$ cat /proc/sys/kernel/pty/max4096

遠(yuǎn)程訪(fǎng)問(wèn)串口

通過(guò)網(wǎng)絡(luò)遠(yuǎn)程訪(fǎng)問(wèn)串口,首先需要把串口虛擬化網(wǎng)絡(luò)端口,之后在網(wǎng)絡(luò)中的另外一個(gè)主機(jī)上通過(guò)Telnet等工具直接訪(fǎng)問(wèn)該網(wǎng)絡(luò)端口,或者把網(wǎng)絡(luò)端口逆向?yàn)橐粋€(gè)虛擬串口,進(jìn)而通過(guò)minicom等工具進(jìn)行訪(fǎng)問(wèn)。

socat工具可以實(shí)現(xiàn)上述功能。如本地(虛擬串口)/dev/pts6,主機(jī)IP:192.168.134.144,主機(jī)端口54321,對(duì)端主機(jī)虛擬串口文件tty.virt001,可通過(guò)如下步驟測(cè)試。

主機(jī)1串口轉(zhuǎn)TCP端口:

sudo socat tcp-l:54321,reuseaddr,fork file:/dev/pts/6,waitlock=/var/run/ttypts.lock,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,raw,echo=0,crtscts=0

主機(jī)2將TCP端口轉(zhuǎn)虛擬串口:

sudo socat pty,link=/dev/tty.virt001,waitslave tcp:192.168.134.144:54321

主機(jī)2遠(yuǎn)程訪(fǎng)問(wèn)串口:

sudo minicom -D /dev/tty.virt001

telnet 192.168.134.144 54321

虛擬終端雙向收發(fā)

上述程序測(cè)試示例中由于ptm與pts在一個(gè)程序中,沒(méi)有控制ptm的發(fā)送,不便于測(cè)試觀察,網(wǎng)上有程序?qū)崿F(xiàn)用兩組虛擬終端中兩個(gè)slave配對(duì),從而基于串口的雙向數(shù)據(jù)收發(fā)。

#!/usr/bin/env python3#--coding = utf-8 --

importptyimportosimportselectdefmkpty():

master1, slave=pty.openpty()

slaveName1=os.ttyname(slave)

master2, slave=pty.openpty()

slaveName2=os.ttyname(slave)print ('\nslave device names:', slaveName1, slaveName2)returnmaster1, master2if __name__ == "__main__":

master1, master2=mkpty()whileTrue:

rl, wl, el= select.select([master1, master2], [], [], 1)for master inrl:

data= os.read(master, 128)print ("read %d data:" %len(data))if master ==master1:

os.write(master2, data)else:

os.write(master1, data)

上述程序用python實(shí)現(xiàn)了兩個(gè)虛擬終端slave雙向收發(fā)。

參考:

總結(jié)

以上是生活随笔為你收集整理的Linux串口转远程串口,linux虚拟串口及远程访问的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。