首页 文章

Bash,串行I / O和Arduino

提问于
浏览
25

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

我试图编写两个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并打开串口监视器,然后关闭串口监视器,然后回显"test">串口,一切正常 .

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

解决办法是什么?

10 回答

  • 0

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

    另外,你可能想看看你是否可以从切换到Xcode(在调试功能等方面)中受益 .

    见:Setting up Xcode to Compile & Upload to an Arduino ATMega328 (Duemilanove)

  • 2

    尝试使用工具stty

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

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

  • 1

    我也遇到了同样的问题 . 我使用Arduino Uno和Ubuntu 12.04 . 经过几个小时的搜索和尝试,我发现当串行设备打开 for the first time 时,Arduino将 reset ,但是当再次打开串行设备时不会重置 .

    因此,在bash中运行命令 - echo "input string"> / 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只猫<&3

    4)关闭/ dev / ttyXXX

    exec 3>& -

  • 28

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

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

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

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

  • 14

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

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

    或者你可以write a Python script这样做 .

  • 0

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

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

  • 0

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

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

  • 0
  • 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代码上) .

  • 4

    一个单行的东西,用于数据记录,并对数据采取行动:
    摘要

    • monitoring: arduino输出可以触发计算机上的操作

    • data-logging: 它同时将流数据保存到文件中

    • 未选中? sending-messages: 我还没有尝试将数据发送到arduino,但是看到第二个例子,可能能够通过一些cmdline util向串口发送消息 .

    the following timestamps and sends to stdout

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

    样本输出:

    enter image description here

    This method can even be adapted to monitor and act upon the data in real time:

    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

相关问题