代码之家  ›  专栏  ›  技术社区  ›  Doug

linux环境下串行端口数据到tcp/ip的转换

  •  26
  • Doug  · 技术社区  · 16 年前

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

    9 回复  |  直到 7 年前
        1
  •  29
  •   Peter Mortensen icecrime    7 年前

    在Linux中不需要编写程序来完成这项工作。只是 pipe 串行端口通过 netcat :

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

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

        2
  •  10
  •   Peter Mortensen icecrime    7 年前

    我在谷歌搜索一个非常相似的问题时偶然发现了这个问题(通过TCP/IP使用Linux客户机服务器上的串行端口),所以,尽管这不是一个确切的原始问题的答案,但一些代码可能对原始海报有用,我想:

    • 使带有串行端口的Linux盒侦听TCP端口以共享调制解调器: ser2net
    • 从另一个Linux工作站使用此“共享”调制解调器: remtty
        3
  •  8
  •   Peter Mortensen icecrime    7 年前

    您可以使用 socat . 它可用于将ttys“转发”到另一台计算机,使其显示为本地ttys,或者您可以通过tcp/ip端口访问它。

        4
  •  4
  •   Peter Mortensen icecrime    7 年前

    在大多数现代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 以匹配要与之连接的串行设备。

        5
  •  3
  •   Peter Mortensen icecrime    7 年前

    我也有同样的问题。

    我不太确定开源应用程序,但我已经测试了命令行 Serial over Ethernet for Linux 还有…对我有用。

    也要感谢梅园法官的指示。

        6
  •  2
  •   Peter Mortensen icecrime    7 年前

    使用netcat在服务器中打开一个端口并开始侦听:

    nc -lvp port number
    

    在您正在读取串行端口的机器上,以根目录netcat发送:

    nc <IP address> portnumber < /dev/ttyACM0
    

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

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

    touch data.txt
    

    然后开始保存数据

    nc -lvp port number > data.txt
    
        7
  •  1
  •   Peter Mortensen icecrime    7 年前

    我认为你的问题不太清楚。这里有几个关于如何捕获进入Linux串行端口的数据的答案,但也许您的问题是另一种方法?

    如果您需要捕获Linux串行端口中的数据并将其发送到服务器,有几个小的硬件小发明可以做到这一点,首先是简单的串行打印服务器,如 Lantronix gizmo .

    不,我和兰特罗尼没有任何关系。

        8
  •  1
  •   Peter Mortensen icecrime    7 年前

    我这几天一直在努力解决这个问题。

    我的问题源于 VirtualBox / Ubuntu。我的机器上有很多USB串行端口。当我试图将其中一个分配给虚拟机时,它彻底摧毁了所有虚拟机——即主机和其他虚拟机不再能够使用它们的USB串行设备。

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

    我试着用ser2net把串行端口连接到线路上,但remtty没有成功。我需要把端口作为虚拟机上的tty。

    索卡特工作得很好。

    这里有很好的说明:

    Example for remote tty (tty over TCP) using socat

        9
  •  0
  •   Peter Mortensen icecrime    7 年前

    你可能会发现 Perl Python 从串行端口获取数据很有用。 要将数据发送到服务器,如果服务器是(比方说)一个http应用程序,甚至是一个流行的数据库,那么解决方案可能很容易。如果是定制/专有的tcp应用程序,解决方案就不那么容易了。