go开发虚拟串口服务器,vspd.go

/*

* @Author: Robin

* @Date: 2020-02-20 17:38:31

* @LastEditors: Robin

* @LastEditTime: 2020-02-21 12:55:25

* @Description: 虚拟串口,仅适用与Linux/Mac

*/

package main

import (

"flag"

"fmt"

"log"

"os"

"sync"

"github.com/creack/pty"

"golang.org/x/crypto/ssh/terminal"

)

var wg sync.WaitGroup

func main() {

// 处理启动参数

num := flag.Int("num", 1, "serial number")

flag.Parse()

for i := 0; i < *num; i++ {

pty1, t1, err := pty.Open()

if err != nil {

log.Fatalln(err)

}

terminal.MakeRaw(int(t1.Fd())) // 设置为Raw模式,防止控制字符丢失

pty2, t2, err := pty.Open()

if err != nil {

log.Fatalln(err)

}

terminal.MakeRaw(int(t2.Fd())) // 设置为Raw模式,防止控制字符丢失

go tty1(t1, t2, pty1, pty2)

go tty2(t1, t2, pty1, pty2)

fmt.Println("Virtual Serial Port:", t1.Name(), "<===>", t2.Name())

}

wg = sync.WaitGroup{}

wg.Add(1)

wg.Wait()

}

// 串口1

func tty1(tty1, tty2, pty1, pty2 *os.File) {

var n int

var err error

buf := make([]byte, 1024)

for {

n, err = pty1.Read(buf)

if err != nil {

log.Fatalln(tty1.Name(), "Read Error", err.Error())

}

_, err = pty2.Write(buf[:n])

if err != nil {

log.Fatalln(tty2.Name(), "Write Error", err.Error())

}

}

}

// 串口2

func tty2(tty1, tty2, pty1, pty2 *os.File) {

var n int

var err error

buf := make([]byte, 1024)

for {

n, err = pty2.Read(buf)

if err != nil {

log.Fatalln(tty2.Name(), "Read Error", err.Error())

}

_, err = pty1.Write(buf[:n])

if err != nil {

log.Fatalln(tty1.Name(), "Write Error", err.Error())

}

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值