【问题标题】:Converting serial port data to TCP/IP in a Linux environmentLinux环境下串口数据转TCP/IP
【发布时间】:2010-10-03 20:09:42
【问题描述】:

我需要从 Linux 系统的串行端口获取数据并将其转换为 TCP/IP 以发送到服务器。这很难做到吗?我有一些基本的编程经验,但对 Linux 的经验并不多。是否有开源应用程序可以做到这一点?

【问题讨论】:

  • 您可能会发现this 对 TCP/IP 部分很有用,而串行端口您可能会得到很多帮助 here。请记住,Linux 中的所有内容都是“文件”,因此您可能可以“捕获”串行端口。

标签: linux tcp serial-port


【解决方案1】:

您可能会发现PerlPython 对于从串行端口获取数据很有用。 要将数据发送到服务器,如果服务器是(比方说)HTTP 应用程序甚至是流行的数据库,则解决方案可能很简单。如果是一些自定义/专有的 TCP 应用程序,解决方案就不那么容易了。

【讨论】:

    【解决方案2】:

    您无需编写程序即可在 Linux 中执行此操作。只需pipe串口通过netcat

    netcat www.example.com port </dev/ttyS0 >/dev/ttyS0
    

    只需替换地址和端口信息即可。此外,您可能正在使用不同的串行端口(即更改 /dev/ttyS0 部分)。您可以使用sttysetserial命令更改串口的参数(波特率、奇偶校验、停止位等)。

    【讨论】:

    • 错字:将“
    • 你可能还想看看 socat
    • 我根据 Liudvikas 更改了 sn-p。因为家里有 3 周大的婴儿,我昨晚没机会检查!
    • 太棒了!将管道输入和输出到同一设备的目的是什么?
    • 如果有人可以编辑此答案并解释 背后的逻辑,那就太好了,首先发生了什么?那是怎么工作的?也许它看起来微不足道,但我还需要对日志文件进行一些重定向并发现具有挑战性的......
    【解决方案3】:

    我认为你的问题不是很清楚。这里有几个关于如何捕获进入 Linux 串行端口的数据的答案,但也许你的问题是相反的?

    如果您需要捕获来自 Linux 串行端口的数据并将其发送到服务器,有几个小硬件小工具可以做到这一点,从简单的串行打印服务器开始,例如 Lantronix gizmo

    不,我与 Lantronix 没有任何关系。

    【讨论】:

      【解决方案4】:

      我通过谷歌搜索一个非常相似的问题偶然发现了这个问题(通过 TCP/IP 使用来自 Linux 客户端的服务器上的串行端口),因此,即使这不是确切原始问题的答案,一些的代码可能对原始海报有用,我认为:

      • 制作一个带有串口的Linux机器监听TCP端口来共享调制解调器:ser2net
      • 从另一个 Linux 工作站使用这个“共享”调制解调器:remtty

      【讨论】:

      • 我也是这样过来的; +1 用于提供指向 ser2net 的链接,它看起来就像我要找的一样。
      【解决方案5】:

      我遇到了同样的问题。

      我不太确定开源应用程序,但我已经测试了命令行Serial over Ethernet for Linux 并且...它适用于我。

      也感谢梅加登法官的指示。

      【讨论】:

      • 我正在 -1-ing 这个答案,因为它看起来像是商业产品的广告。也许是这样,也许不是——我真的不知道在 Linux 上通过远程访问资源之类的东西是开箱即用的,不需要花哨的用户界面。
      【解决方案6】:

      您可以使用socat 创建 LAN 上串行 (SOL) 连接。它可用于将 ttyS '转发'到另一台机器,使其显示为本地机器,或者您可以通过 TCP/IP 端口访问它。

      【讨论】:

      • 根据this page,socat不直接支持RFC 2217,但提供了补丁支持。
      • ttyS?你的意思是ttys
      • 如果客户端期望串行 ioctls,这将不起作用。
      【解决方案7】:

      这几天我一直在为这个问题苦苦挣扎。

      我的问题源于VirtualBox/Ubuntu。我的机器上有很多 USB 串行端口。当我尝试将其中一个分配给 VM 时,它破坏了所有这些 - 即主机和其他 VM 不再能够使用它们的 USB 串行设备。

      我的解决方案是在壁橱里碰巧有的上网本上设置一个独立的串行服务器。

      我尝试了 ser2net,它可以将串行端口放在电线上,但 remtty 不起作用。我需要将端口作为虚拟机上的 tty。

      socat 运行良好。

      这里有很好的说明:

      Example for remote tty (tty over TCP) using socat

      【讨论】:

        【解决方案8】:

        用 netcat 在你的服务器上打开一个端口并开始监听:

        nc -lvp port number
        

        在你正在读取串口的机器上,以 root 身份使用 netcat 发送:

        nc <IP address> portnumber < /dev/ttyACM0
        

        如果您想将数据存储在服务器上,您可以将数据重定向到文本文件。

        首先创建一个保存数据的文件:

        touch data.txt
        

        然后开始保存数据

        nc -lvp port number > data.txt
        

        【讨论】:

        • 这将起作用,但它需要访问托管端口的计算机上的终端。一个更健壮的解决方案是使用 ser2net,其中服务器就像普通服务器一样访问远程资源。当然,这种方式更“安全”,因为您需要先使用 SSH 物理连接到远程系统,然后才能访问串行端口,但同时它远不如 ser2net 方便。有点取决于你需要什么......
        【解决方案9】:

        您需要的所有工具都已在大多数现代 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 以匹配您尝试与之交互的串行设备。

        【讨论】:

          【解决方案10】:

          TCP 到 Serial Systemd 服务

          当您的 Linux 机器运行 systemd(大多数情况下)时,您可以创建一个简洁的服务来使 (USB) 串行设备通过 TCP (telnet) 可用。

          安全警告:通过 TCP 暴露串行设备存在安全风险。

          在这个例子中我使用的是:

          • TCP 端口5900
          • 串口设备/dev/ttyUSB0(使用2次)
          • 串口速度115200 Bps

          您可以在下面的示例中编辑这些内容。查看sttync (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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-09
            • 1970-01-01
            • 2010-09-21
            • 1970-01-01
            相关资源
            最近更新 更多