5

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

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

4

6 回答 6

3

您不能将终端设置为原始吗?

看看这个教程

于 2009-02-03T12:08:08.410 回答
3

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

于 2009-02-03T13:26:16.693 回答
3

您可以使用 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)

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

于 2009-02-03T14:18:05.573 回答
2

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

于 2009-02-03T12:14:46.727 回答
2

正如其他注释所暗示的那样,有几件事需要检查,收集在这里:

  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 系列例程来设置线路速度和纪律。

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

于 2009-02-09T04:34:49.133 回答
1

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

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

有一个名为getty让用户从串行端口登录的程序。您inittab将从getty串行端口开始,以便人们可以登录。

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

在某些情况下,您可以更改您inittab的使用mgetty,这是一个更智能且更易于控制的getty.

于 2009-02-03T12:29:05.403 回答