Bash,串行I / O和Arduino

时间:2010-10-12 18:54:55

标签: bash command-line serial-port arduino

所以,我有点过头了,我觉得我非常接近解决方案,但它还没有完成。这是我的情况:

我正在使用Arduino微控制器,我正在尝试编写两个Bash脚本(现在在Mac OS X 10.6中运行),它将(a)将来自Arduino单元的所有串行数据打印到标准输出,(b)允许我将串行数据发送到Arduino单元。然后将使用Adobe AIR的NativeProcess API调用这些脚本,以允许Arduino单元和Flex Adobe AIR应用程序之间的紧密集成。

我的两个脚本非常简单 -

这是我的WriteToSerial.sh脚本:

echo $1 > $2

($ 1显然是我的字符串,$ 2是串口的位置 - 目前是/dev/tty.usbserial-A800eIUj)

这是我的ReadSerialOutput.sh脚本:

tail -f $1

($ 1是我的串口的位置,目前是/dev/tty.usbserial-A800eIUj)

当我调用这些脚本中的任何一个(或者即使我只是直接在Bash控制台中输入命令)时,我的计算机就会挂起 - 我可以输入字符,但在 Ctrl +之前没有任何反应 C 退出流程。

但是,如果我打开Arduino IDE并打开串行监视器,然后tail -f端口,关闭串行监视器,然后回显“test”>串口,一切都很棒。

这告诉我,在Arduino IDE中打开串行监视器是以某种方式初始化串口,这反过来允许我拖尾它没有问题。这反过来告诉我,我只是没有输入某种初始化命令。但是,我一直在高低搜索,似乎无法找到解决这个问题的任何东西。

解决方案是什么?

10 个答案:

答案 0 :(得分:28)

我也遇到同样的问题。我使用Arduino Uno和Ubuntu 12.04。经过几个小时的搜索和尝试,我发现当串行设备第一次打开时,Arduino将重置 ,但是当串行设备是再次开放。

因此,运行命令 - echo“输入字符串”> bash中的/ dev / ttyXXX 将重置Arduino并立即发送“input string”。 Arduino需要一些时间来初始化,并且不够快,无法接收此字符串。 cat / dev / ttyXXX 也将重置Arduino。

首先在某处打开 / dev / ttyXXX 时,这些命令将起作用。

这是我的解决方案:

1)通过将/ dev / ttyXXX重定向到文件描述3来打开/ dev / ttyXXX

  

exec 3<>的/ dev / ttyXXX

2)等待Arduino的初始化

  

睡1

3)与Arduino沟通

  

echo“输入内容”>& 3

     

cat<& 3

4)关闭/ dev / ttyXXX

  

exec 3>& -

答案 1 :(得分:13)

尝试使用工具stty

stty -F /dev/my_serial_port <baud_rate> cs8 cread clocal

与往常一样,请在应用上述内容之前阅读联机帮助页。 cread允许您接收数据。如果使用流量控制,则可能需要省略clocal。如果您不确定上述设置是什么,请询问,我可以写出更完整的答案。

答案 2 :(得分:4)

我也在努力解决这个问题,在站在一个脚趾等处时,尝试将我的文件放到/dev/tty.usbserial-FTF7YNJ5(在我的情况下)中没有结束stty设置和技巧。

然后我做了一个ls / dev并注意到/dev/cu.usbserial-FTF7YNJ5 - 哦,这是什么?显然,设备的“调用单元”版本不期望或提供任何流量控制。将字节转储到端口。正是我需要的。

所以这样做:cat super_file.bin&gt; /dev/cu.usbserial-XXXXX

希望这会有所帮助。直到现在我才知道答案,我发现了这个:http://stuffthingsandjunk.blogspot.com/2009/03/devcu-vs-devtty-osx-serial-ports.html

答案 3 :(得分:2)

在Linux上,您需要先调用setserial来配置串口选项(波特率,奇偶校验,流量控制等),然后才能正确读/写端口。

您需要找到一种方法来使用Mac OS X Bash系统执行此操作。

或者你可以write a Python script来做这件事。

答案 4 :(得分:1)

也许尝试一些类似于serial-1.0的串行命令行工具。

请参阅:Serial port loopback/duplex test, in Bash or C? (process substitution)

答案 5 :(得分:0)

尝试在命令末尾添加&符号(&amp;)以将进程置于后台。如果控制台挂起,那么这意味着脚本或进程仍在您当前的终端上运行,在完成该过程或脚本之前,您将无法输入或单击任何内容。

您也可以尝试在1终端窗口中运行该命令,然后打开一个新的终端窗口/选项卡,并尝试从那里进行拖尾。

答案 6 :(得分:0)

答案 7 :(得分:0)

检查是否使用其他应用程序(如Cornflake(Mac OS X的串行终端))向Arduino设备发送数据/从Arduino设备接收数据 - 而不是使用Arduino IDE&amp;串行监视器。

此外,您可能想知道是否可以从切换到Xcode(在调试功能等方面)中受益。

请参阅:Setting up Xcode to Compile & Upload to an Arduino ATMega328 (Duemilanove)

答案 8 :(得分:0)

Apple的SerialPortSample命令行工具允许您设置任意波特率:

// from: SerialPortSample/SerialPortSample.c
// ...
// Starting with Tiger, the IOSSIOSPEED ioctl can be used to set arbitrary baud rates
// other than those specified by POSIX. The driver for the underlying serial hardware
// ultimately determines which baud rates can be used. This ioctl sets both the input
// and output speed. 
// ...

有关详细信息,请参阅:http://www.arduino.cc/playground/Interfacing/Cocoa

另一段Cocoa示例代码向您展示如何通过串行连接与Arduino微控制器通信是objective-candarduino(托管在Google代码上)。

答案 9 :(得分:0)

用于数据记录和对数据采取行动的 非常好 的单行内容:

摘要
  • 监控:arduino输出可以触发计算机上的操作
  • 数据记录:它同时将该流数据保存到文件
  • notchecked? 发送消息:我还没有尝试过向arduino发送数据,但是看到第二个例子,可能可以通过一些cmdline util向串口发送消息。

以下时间戳并发送到stdout

cat /dev/cu.usbmodem1421 | awk '{ for (i=0; i<NF; i++) printf $i + system("echo  , `date`")}'

示例输出:

enter image description here

此方法甚至可以用于实时监控数据并采取相应措施:

cat /dev/cu.usbmodem1421 | awk '{ for (i=0; i<NF; i++) printf $i + system("echo , `date`)}'

这里有更多例子: https://github.com/gskielian/Arduino-DataLogging/tree/master/Bash-One-Liner