【问题标题】:Binary data over serial terminal串行终端上的二进制数据
【发布时间】:2010-10-05 03:25:13
【问题描述】:

我与嵌入式设备的唯一通信方式是串行端口。默认情况下,嵌入式 Linux 使用此端口作为终端。如何禁用此终端并使用串行链路传输二进制数据?我听说过 rx 和 tx 之类的命令,但我找不到它们。

我想我可以从 /dev/tty 中读取()和写入()内容,但我想确保没有错误消息或任何与我的数据流混淆的东西。

【问题讨论】:

    标签: linux embedded binary terminal


    【解决方案1】:

    你不能把终端设置成原始的吗?

    看看this tutorial

    【讨论】:

      【解决方案2】:

      您可以在终端上运行将通过应用程序级协议传输数据的命令。您引用的 rx 和 tx 命令实现了XMODEM file transfer protocol。这可能是一个解决方案,如果您要传输的二进制数据由文件组成,吞吐量需求很低,并且您不介意运行命令的管理开销。或者,您可能希望复用串行端口来处理数据传输和终端。禁用串行终端驱动程序命令 (getty),并通过串行线路运行 PPP 协议以建立与您的设备的 IP 连接。然后您可以通过 ssh 或 telnet 登录设备并通过 IP 套接字传输数据。

      【讨论】:

        【解决方案3】:

        是的,您所有的串口都在/dev/ttyxx 中。请注意,/dev/tty 是代表您当前终端的快捷方式,而不是特定的串行端口。通常,这些由 root 拥有,并且需要您拥有特权或在 adm 组中才能直接从您的应用程序访问设备。

        您可能想chown 设备,以便您可以访问它。我不确定更改设备所有权的后果是什么; IIRC,它很容易做到并且效果很好。另一种方法是使用setuid 将您的程序提升到特权状态。

        有一个名为getty 的程序允许用户从串行端口登录。您的inittab 将在串行端口上启动getty,以便人们可以登录。

        您想禁用getty。在某些情况下,有一个端口管理器可以帮助做到这一点。

        在某些情况下,您可以将inittab 更改为使用mgetty,这是getty 的更智能且更易于控制的版本。

        【讨论】:

          【解决方案4】:

          要禁用 Linux 控制台,您必须更改引导加载程序创建的 Linux 命令行: 控制台=/dev/ttyS? 到 : 控制台=null

          【讨论】:

            【解决方案5】:

            您可以使用 xmodem 等应用程序通过任何终端传输文件。您所说的串行端口是终端,还是内核控制台。

            如果您的内核不嘈杂,那么您可以使用您当前的连接来进行 xmodem 之类的传输。在主机端,您可以使用 kermit,它很好并且可编写脚本。

            如果你想让你的串口变成原始的,并且你已经打开了文件描述符 ttyfd, 这是一种方法:

            struct termios tty, orig_tty;
            
            ...
            
            if(tcgetattr(ttyfd, &tty) < 0)
            {
                // error checking
            }
            // backup tty, make it raw and apply changes
            orig_tty = tty;
            cfmakeraw(&tty);
            if(tcsetattr(ttyfd, TCSAFLUSH, &tty) < 0)
            {
                // error checking
            }
            
            ...
            //end of program or error path :
            tcsetattr(ttyfd, TCSAFLUSH, &orig_tty)
            

            如果您仍然想要一个性能良好的终端,请不要忘记在程序结束时恢复设置。

            【讨论】:

              【解决方案6】:

              正如其他笔记所暗示的,有几件事需要检查,收集在这里:

              1. 确保 linux 内核没有使用串行端口。确保 grub 文件中的 bootload 命令没有 console= 选项。默认情况下通常不存在。
              2. 确保串行端口上没有运行 getty。在 /etc/inittab 中查找 /dev/ttyS0(串行端口 A)的条目,如果存在则将其注释掉。
              3. 确保您的进程可以读写 /dev/ttyS0。您可以创建一个运行控制程序的特定用户,该用户拥有 /dev/ttyS0,然后 chmod 700 /dev/ttyS0。这将有助于确保其他一些用户/程序不会也尝试使用串行端口。
              4. 在 ttyS0 上使用 open() 获取 fd,然后使用 tcsetattr 系列例程设置线路速度和规则。

              除非您可以在嵌入式设备上运行相同的程序来管理连接的另一端,否则终端程序可能对您没有用处。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-08-11
                • 1970-01-01
                • 2012-09-10
                • 2021-05-15
                • 1970-01-01
                • 2015-02-27
                • 2011-09-07
                • 2018-09-11
                相关资源
                最近更新 更多