串行终端上的二进制数据

5

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

我认为我只需从/dev/tty读取()和写入()即可,但我想确保没有错误消息或其他任何东西干扰我的数据流。

6个回答

3

你不能只是将终端设置为原始模式吗?

请查看这个教程


3

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


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)

不要忘记在程序结束时恢复设置,如果您仍然希望终端表现良好。

2

正如其他注释所示,有几个需要检查的问题,请参阅以下内容:

  1. 确保Linux内核未使用串行端口。确保在grub文件中的bootload命令上没有console=选项。通常情况下,这个选项不会存在。
  2. 确保串行端口上没有getty正在运行。在/etc/inittab中查找/dev/ttyS0(串行端口A)的条目,如果有请将其注释掉。
  3. 确保你的进程能够读写/dev/ttyS0。您可能需要创建一个特定的用户来运行控制程序,并拥有/dev/ttyS0,然后chmod 700 / dev/ttyS0。这将有助于确保其他用户/程序不会尝试使用串行端口。
  4. 使用open()打开ttyS0以获取fd,然后使用tcsetattr系列函数设置线速度和协议。

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


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

1

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

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

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

您想要禁用getty。在某些情况下,有一个端口管理器可以帮助您完成此操作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接