【发布时间】:2010-10-03 20:09:42
【问题描述】:
我需要从 Linux 系统的串行端口获取数据并将其转换为 TCP/IP 以发送到服务器。这很难做到吗?我有一些基本的编程经验,但对 Linux 的经验并不多。是否有开源应用程序可以做到这一点?
【问题讨论】:
标签: linux tcp serial-port
我需要从 Linux 系统的串行端口获取数据并将其转换为 TCP/IP 以发送到服务器。这很难做到吗?我有一些基本的编程经验,但对 Linux 的经验并不多。是否有开源应用程序可以做到这一点?
【问题讨论】:
标签: linux tcp serial-port
【讨论】:
我认为你的问题不是很清楚。这里有几个关于如何捕获进入 Linux 串行端口的数据的答案,但也许你的问题是相反的?
如果您需要捕获来自 Linux 串行端口的数据并将其发送到服务器,有几个小硬件小工具可以做到这一点,从简单的串行打印服务器开始,例如 Lantronix gizmo。
不,我与 Lantronix 没有任何关系。
【讨论】:
【讨论】:
这几天我一直在为这个问题苦苦挣扎。
我的问题源于VirtualBox/Ubuntu。我的机器上有很多 USB 串行端口。当我尝试将其中一个分配给 VM 时,它破坏了所有这些 - 即主机和其他 VM 不再能够使用它们的 USB 串行设备。
我的解决方案是在壁橱里碰巧有的上网本上设置一个独立的串行服务器。
我尝试了 ser2net,它可以将串行端口放在电线上,但 remtty 不起作用。我需要将端口作为虚拟机上的 tty。
socat 运行良好。
这里有很好的说明:
【讨论】:
用 netcat 在你的服务器上打开一个端口并开始监听:
nc -lvp port number
在你正在读取串口的机器上,以 root 身份使用 netcat 发送:
nc <IP address> portnumber < /dev/ttyACM0
如果您想将数据存储在服务器上,您可以将数据重定向到文本文件。
首先创建一个保存数据的文件:
touch data.txt
然后开始保存数据
nc -lvp port number > data.txt
【讨论】:
您需要的所有工具都已在大多数现代 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 以匹配您尝试与之交互的串行设备。
【讨论】:
当您的 Linux 机器运行 systemd(大多数情况下)时,您可以创建一个简洁的服务来使 (USB) 串行设备通过 TCP (telnet) 可用。
安全警告:通过 TCP 暴露串行设备存在安全风险。
在这个例子中我使用的是:
5900
/dev/ttyUSB0(使用2次)115200 Bps您可以在下面的示例中编辑这些内容。查看stty和nc (netcat)的手册了解更多选项。
以下所有命令都假定您是用户 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
【讨论】: