【发布时间】:2010-10-05 03:25:13
【问题描述】:
我与嵌入式设备的唯一通信方式是串行端口。默认情况下,嵌入式 Linux 使用此端口作为终端。如何禁用此终端并使用串行链路传输二进制数据?我听说过 rx 和 tx 之类的命令,但我找不到它们。
我想我可以从 /dev/tty 中读取()和写入()内容,但我想确保没有错误消息或任何与我的数据流混淆的东西。
【问题讨论】:
标签: linux embedded binary terminal
我与嵌入式设备的唯一通信方式是串行端口。默认情况下,嵌入式 Linux 使用此端口作为终端。如何禁用此终端并使用串行链路传输二进制数据?我听说过 rx 和 tx 之类的命令,但我找不到它们。
我想我可以从 /dev/tty 中读取()和写入()内容,但我想确保没有错误消息或任何与我的数据流混淆的东西。
【问题讨论】:
标签: linux embedded binary terminal
你不能把终端设置成原始的吗?
【讨论】:
您可以在终端上运行将通过应用程序级协议传输数据的命令。您引用的 rx 和 tx 命令实现了XMODEM file transfer protocol。这可能是一个解决方案,如果您要传输的二进制数据由文件组成,吞吐量需求很低,并且您不介意运行命令的管理开销。或者,您可能希望复用串行端口来处理数据传输和终端。禁用串行终端驱动程序命令 (getty),并通过串行线路运行 PPP 协议以建立与您的设备的 IP 连接。然后您可以通过 ssh 或 telnet 登录设备并通过 IP 套接字传输数据。
【讨论】:
是的,您所有的串口都在/dev/ttyxx 中。请注意,/dev/tty 是代表您当前终端的快捷方式,而不是特定的串行端口。通常,这些由 root 拥有,并且需要您拥有特权或在 adm 组中才能直接从您的应用程序访问设备。
您可能想chown 设备,以便您可以访问它。我不确定更改设备所有权的后果是什么; IIRC,它很容易做到并且效果很好。另一种方法是使用setuid 将您的程序提升到特权状态。
有一个名为getty 的程序允许用户从串行端口登录。您的inittab 将在串行端口上启动getty,以便人们可以登录。
您想禁用getty。在某些情况下,有一个端口管理器可以帮助做到这一点。
在某些情况下,您可以将inittab 更改为使用mgetty,这是getty 的更智能且更易于控制的版本。
【讨论】:
要禁用 Linux 控制台,您必须更改引导加载程序创建的 Linux 命令行: 控制台=/dev/ttyS? 到 : 控制台=null
【讨论】:
您可以使用 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)
如果您仍然想要一个性能良好的终端,请不要忘记在程序结束时恢复设置。
【讨论】:
正如其他笔记所暗示的,有几件事需要检查,收集在这里:
除非您可以在嵌入式设备上运行相同的程序来管理连接的另一端,否则终端程序可能对您没有用处。
【讨论】: