5 Commits

Author SHA1 Message Date
jixishi 5bf90d1b63 TCP|UDP 客户端数据转发支持更新 2024-04-19 22:42:28 +08:00
jixishi dffb269247 RT 2024-04-19 17:03:28 +08:00
JiXieShi d450a8a019 多平台构建 2024-04-19 16:18:03 +08:00
JiXieShi 8b1e5bfb06 多平台构建 2024-04-19 16:15:28 +08:00
JiXieShi 437f309ab9 多平台构建 2024-04-19 16:08:55 +08:00
8 changed files with 151 additions and 26 deletions
+3
View File
@@ -1 +1,4 @@
/build/ /build/
.idea
dist/
/go.sum
+52
View File
@@ -0,0 +1,52 @@
#file: noinspection YAMLSchemaValidation
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
# The lines below are called `modelines`. See `:help modeline`
# Feel free to remove those if you don't want/need to use them.
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
version: 1
before:
hooks:
# You may remove this if you don't use go modules.
# - go mod tidy
# you may remove this if you don't need go generate
# - go generate ./...
builds:
- env:
- CGO_ENABLED=0
goos:
- linux
- windows
- darwin
archives:
- format: tar.gz
# this name template makes the OS and Arch compatible with the results of `uname`.
name_template: >-
{{ .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
{{- if .Arm }}v{{ .Arm }}{{ end }}
# use zip for windows archives
format_overrides:
- goos: windows
format: zip
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: 'v1.0.0-snapshot'
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
+14 -5
View File
@@ -1,10 +1,19 @@
# SerialTerminalForWindowsTerminal # SerialTerminalForWindowsTerminal
编写这个项目之前在windows Terminal对串口设备的支持不是很棒, 开始这个项目之前,我发现Windows Terminal对串口设备的支持并不理想。
用过一段时间的 我试用了一段时间[Zhou-zhi-peng的SerialPortForWindowsTerminal](https://github.com/Zhou-zhi-peng/SerialPortForWindowsTerminal/)项目。
[SerialPortForWindowsTerminal](https://github.com/Zhou-zhi-peng/SerialPortForWindowsTerminal/)
项目。 然而,这个项目存在着编码转换的问题,导致数据显示乱码,并且作者目前并没有进行后续支持。因此,我决定创建了这个项目。
此项目没有编码转换能力在使用过程中有乱码的问题,并且作者截至目前并没有进行后续支持,于是我便编写了此项目
## 功能进展
* [x] Hex接收发送(大写hex与原文同显)
* [x] 双向编码转换
* [x] 活动端口探测
* [x] 数据日志保存
* [ ] 自动断帧设置
* [ ] 文件接收发送
* [ ] UDP数据转发
* [ ] TCP数据转发
## 运行示例 ## 运行示例
+3 -1
View File
@@ -14,11 +14,13 @@ type Command struct {
function func() function func()
} }
var commands []Command
func cmdhelp() { func cmdhelp() {
var page = 0 var page = 0
fmt.Printf(">-------Help(%v)-------<\n", page) fmt.Printf(">-------Help(%v)-------<\n", page)
for i := 0; i < len(commands); i++ { for i := 0; i < len(commands); i++ {
strout(config.outputCode, fmt.Sprintf(" %-10v --%v\n", commands[i].name, commands[i].description)) strout(out, config.outputCode, fmt.Sprintf(" %-10v --%v\n", commands[i].name, commands[i].description))
} }
} }
func cmdexit() { func cmdexit() {
+41 -1
View File
@@ -1,14 +1,54 @@
package main package main
import (
"log"
"net"
)
type Config struct { type Config struct {
portName string portName string
baudRate int baudRate int
dataBits int dataBits int
stopBits int stopBits int
parityBit int
outputCode string outputCode string
inputCode string inputCode string
endStr string endStr string
enableLog bool enableLog bool
logFilePath string logFilePath string
parityBit int forWard int
address string
}
type FoeWardMode int
const (
NOT FoeWardMode = iota
TCPS
TCPC
UDPS
UDPC
)
var config Config
func setForWard() (conn net.Conn) {
switch FoeWardMode(config.forWard) {
case TCPS:
case TCPC:
conn, err = net.Dial("tcp", config.address)
if err != nil {
log.Fatal(err)
}
case UDPS:
case UDPC:
conn, err = net.Dial("udp", config.address)
if err != nil {
log.Fatal(err)
}
default:
panic("未知模式设置")
}
return conn
} }
+3 -1
View File
@@ -38,8 +38,10 @@ var (
endStr = Flag{ptrVal{string: &config.endStr}, "e", "end", Val{string: "\n"}, "终端换行符"} endStr = Flag{ptrVal{string: &config.endStr}, "e", "end", Val{string: "\n"}, "终端换行符"}
enableLog = Flag{ptrVal{bool: &config.enableLog}, "l", "log", Val{bool: false}, "是否启用日志保存"} enableLog = Flag{ptrVal{bool: &config.enableLog}, "l", "log", Val{bool: false}, "是否启用日志保存"}
logFilePath = Flag{ptrVal{string: &config.logFilePath}, "P", "Path", Val{string: "./Log.txt"}, "日志保存路径"} logFilePath = Flag{ptrVal{string: &config.logFilePath}, "P", "Path", Val{string: "./Log.txt"}, "日志保存路径"}
forWard = Flag{ptrVal{int: &config.forWard}, "f", "forward", Val{int: 0}, "转发模式(0: 无 1:TCP-S 2:TCP-C 3:UDP-S 4:UDP-C)"}
address = Flag{ptrVal{string: &config.address}, "a", "address", Val{string: "127.0.0.1:12345"}, "转发服务地址"}
parityBit = Flag{ptrVal{int: &config.parityBit}, "v", "verify", Val{int: 0}, "奇偶校验(0:无校验、1:奇校验、2:偶校验、3:1校验、4:0校验)"} parityBit = Flag{ptrVal{int: &config.parityBit}, "v", "verify", Val{int: 0}, "奇偶校验(0:无校验、1:奇校验、2:偶校验、3:1校验、4:0校验)"}
flags = []Flag{portName, baudRate, dataBits, stopBits, outputCode, inputCode, endStr, enableLog, logFilePath, parityBit} flags = []Flag{portName, baudRate, dataBits, stopBits, outputCode, inputCode, endStr, enableLog, logFilePath, forWard, address, parityBit}
) )
type ValType int type ValType int
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 41 KiB

+33 -16
View File
@@ -13,13 +13,18 @@ import (
) )
var ( var (
config Config
commands []Command
serialPort serial.Port serialPort serial.Port
err error err error
args []string args []string
) )
var (
in io.Reader = os.Stdin
out io.Writer = os.Stdout
ins = []io.Reader{os.Stdin}
outs = []io.Writer{os.Stdout}
)
func checkPortAvailability(name string) ([]string, error) { func checkPortAvailability(name string) ([]string, error) {
ports, err := serial.GetPortsList() ports, err := serial.GetPortsList()
if err != nil { if err != nil {
@@ -47,8 +52,8 @@ func init() {
cmdinit() cmdinit()
} }
func input() { func input(in io.Reader) {
input := bufio.NewScanner(os.Stdin) input := bufio.NewScanner(in)
var ok = false var ok = false
for input.Scan() { for input.Scan() {
ok = false ok = false
@@ -76,8 +81,8 @@ func input() {
} }
} }
func strout(cs, str string) { func strout(out io.Writer, cs, str string) {
err = charsetconv.EncodeWith(strings.NewReader(str), os.Stdout, charsetconv.Charset(cs), false) err = charsetconv.EncodeWith(strings.NewReader(str), out, charsetconv.Charset(cs), false)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -85,10 +90,13 @@ func strout(cs, str string) {
func output(out io.Writer) { func output(out io.Writer) {
if strings.Compare(config.inputCode, "hex") == 0 { if strings.Compare(config.inputCode, "hex") == 0 {
b, _ := bufio.NewReader(io.LimitReader(serialPort, 16)).Peek(16) b := make([]byte, 16)
_, err = fmt.Fprintf(out, "% X %q \n", b, b) r, _ := io.LimitReader(serialPort, 16).Read(b)
if r != 0 {
strout(out, config.outputCode, fmt.Sprintf("% X %q \n", b, b))
}
} else { } else {
err = charsetconv.ConvertWith(io.LimitReader(serialPort, 1024), charsetconv.Charset(config.inputCode), out, charsetconv.Charset(config.outputCode), false) err = charsetconv.ConvertWith(serialPort, charsetconv.Charset(config.inputCode), out, charsetconv.Charset(config.outputCode), false)
} }
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -118,20 +126,29 @@ func main() {
} }
}(serialPort) }(serialPort)
go input() if FoeWardMode(config.forWard) != NOT {
conn := setForWard()
ins = append(ins, conn)
outs = append(outs, conn)
defer conn.Close()
}
if len(ins) != 1 {
in = io.MultiReader(ins...)
}
go input(in)
if config.enableLog { if config.enableLog {
f, err := os.OpenFile(config.logFilePath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) f, err := os.OpenFile(config.logFilePath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
out := io.MultiWriter(os.Stdout, f) outs = append(outs, f)
}
if len(outs) != 1 {
out = io.MultiWriter(outs...)
}
for { for {
output(out) output(out)
} }
} else {
for {
output(os.Stdout)
}
}
} }