串行终端上的二进制数据

时间:2009-02-03 11:49:30

标签: linux embedded binary terminal

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

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

6 个答案:

答案 0 :(得分:3)

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

查看this tutorial

答案 1 :(得分:3)

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

答案 2 :(得分: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)

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

答案 3 :(得分:2)

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

答案 4 :(得分: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系列例程来设置行速度和纪律。
  5. 除非您可以在嵌入式设备上运行相同的程序来管理连接的另一端,否则终端程序可能对您没用。

答案 5 :(得分:1)

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

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

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

您想要停用getty。在某些情况下,有一个端口管理器可以帮助实现这一目标。

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