我需要从 Linux 系统的串行端口获取数据并将其转换为 TCP/IP 以发送到服务器。这很难做到吗?我有一些基本的编程经验,但对 Linux 的经验并不多。是否有这样做的开源应用程序?
10 回答
您可以使用socat创建 LAN 上串行 (SOL) 连接。它可用于将 ttyS“转发”到另一台机器,使其显示为本地机器,或者您可以通过 TCP/IP 端口访问它。
在大多数现代 Linux 发行版上,您已经可以使用您需要的所有工具。
正如一些人指出的那样,您可以通过 netcat 管道传输串行数据。但是,每次有连接时,您都需要重新启动一个新实例。为了在连接之间保持这种状态,您可以使用以下配置创建 xinetd 服务:
service testservice
{
port = 5900
socket_type = stream
protocol = tcp
wait = yes
user = root
server = /usr/bin/netcat
server_args = "-l 5900 < /dev/ttyS0"
}
请务必更改/dev/ttyS0
以匹配您尝试与之交互的串行设备。
使用 netcat 在您的服务器中打开一个端口并开始监听:
nc -lvp port number
在您正在读取串行端口的机器上,以 root 身份使用 netcat 发送它:
nc <IP address> portnumber < /dev/ttyACM0
如果要将数据存储在服务器上,可以将数据重定向到文本文件。
首先创建一个保存数据的文件:
touch data.txt
然后开始保存数据
nc -lvp port number > data.txt
几天来我一直在努力解决这个问题。
我的问题源于VirtualBox /Ubuntu。我的机器上有很多 USB 串行端口。当我试图将其中一个分配给 VM 时,它破坏了所有这些 - 即主机和其他 VM 不再能够使用它们的 USB 串行设备。
我的解决方案是在壁橱里碰巧有的上网本上设置一个独立的串行服务器。
我尝试了 ser2net,它可以将串行端口放在电线上,但 remtty 不起作用。我需要将端口作为虚拟机上的 tty。
socat 工作得很好。
这里有很好的说明:
我觉得你的问题不是很清楚。这里有几个关于如何捕获进入 Linux 串行端口的数据的答案,但也许你的问题是相反的?
如果您需要捕获来自 Linux 串行端口的数据并将其发送到服务器,有几个小硬件 gizmo 可以做到这一点,从简单的串行打印服务器开始,例如这个Lantronix gizmo。
不,我与 Lantronix 没有任何关系。
TCP 到串行 Systemd 服务
当您的 Linux 机器运行 systemd(大多数都运行)时,您可以创建一个简洁的服务来使(USB)串行设备通过 TCP(telnet)可用。
安全警告:通过 TCP 暴露串行设备存在安全风险。
在这个例子中,我使用:
- TCP 端口
5900
- 串口设备
/dev/ttyUSB0
(使用2次) - 串行速度
115200
Bps
您可以在下面的示例中编辑这些。查看stty和nc (netcat)的手册以获取更多选项。
以下所有命令都假定您是 user root
。如果您不执行:sudo su -
该目录/etc/systemd/system
应该已经存在。如果不是,您的系统可能没有运行 Systemd。
创建/etc/systemd/system/tcp2serial.service
包含内容的文件:
[Unit]
Description=TCP to Serial
[Service]
TTYPath=/dev/ttyUSB0
ExecStartPre=/usr/bin/stty -F /dev/ttyUSB0 speed 115200
ExecStart=/usr/bin/nc -k -l 5900
StandardInput=tty
StandardOutput=tty
Restart=always
[Install]
WantedBy=default.target
创建文件后,您可以执行systemctl start tcp2serial
以启动服务。
从同一网络中的另一台 Linux 计算机,您可以使用telnet [server] 5900
. 要退出 telnet,请按Ctrl+]并键入quit
Enter
编辑服务文件后,执行以下两个命令:
systemctl daemon-reload
systemctl restart tcp2serial
要使服务在启动时启动,请执行:
systemctl enable tcp2serial