代码之家  ›  专栏  ›  技术社区  ›  Myk

bash、串行I/O和Arduino

  •  25
  • Myk  · 技术社区  · 14 年前

    所以,我有点头晕目眩,我觉得我很接近一个解决方案,但它还没有完全发挥作用。我的情况是:

    我正在和一个Arduino微控制器合作,我正在尝试编写两个bash脚本(现在在MacOSX 10.6中运行),它将(a)打印出Arduino单元的所有串行数据到标准输出,以及(b)允许我将串行数据发送到Arduino单元。然后将使用AdobeAir的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 端口,关闭串行监视器,然后回显“测试”串行端口,一切正常。

    这对我来说意味着在Arduino IDE中打开串行监视器以某种方式初始化串行端口,从而使我可以毫无问题地跟踪它。这反过来又告诉我,我只是没有输入某种初始化命令。然而,我已经搜索了好几天的高低,似乎找不到任何解决这个问题的方法。

    解决方案是什么?

    10 回复  |  直到 8 年前
        1
  •  13
  •   Shawn J. Goff    12 年前

    尝试使用该工具 stty :

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

    和往常一样,在应用上述内容之前阅读手册页。 cread 允许您接收数据。你可能想省略 clocal 如果您使用的是流量控制。如果你不确定上面的设置是什么,问我,我可以写一个更完整的答案。

        2
  •  28
  •   Yihui Xiong    12 年前

    我也有同样的问题。我在Ubuntu 12.04中使用ArduinoUno。经过几个小时的寻找和尝试,我发现阿杜诺会 重置 当串行设备打开时 第一次 但在再次打开串行设备时不会重置。

    所以,运行命令- echo“输入字符串”>/dev/ttyxxx 在bash中,将重置arduino并发送 “输入字符串” 立即。Arduino需要花费一些时间来初始化,但速度不够快,无法接收此字符串。 CAT/DEV/TTYXXX 也会重置Arduino。

    什么时候? /DEV/TTYXXX 首先在某个地方打开,这些命令将起作用。

    这是我的解决方案:

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

    执行3<>/dev/ttyxxx

    2)等待Arduino的初始化

    睡眠1

    3)与Arduino沟通

    echo“输入某物”>&3

    CAT & L&&3

    4)关闭/dev/ttyxxx

    执行3>&。-

        3
  •  4
  •   chrism    13 年前

    我也在这个问题上挣扎着,尝试着不停止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

        4
  •  2
  •   Community Egal    7 年前

    在Linux上,在正确读/写端口之前,需要调用setserial来配置串行端口选项(波特率、奇偶校验、流控制等)。

    您需要找到一种方法来使用您的MacOSXbash系统来实现这一点。

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

        5
  •  1
  •   Community Egal    7 年前

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

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

        6
  •  0
  •   bm7150    14 年前

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

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

        8
  •  0
  •   tol    14 年前

    通过使用不同的应用程序(如Cornflake(Mac OS X的串行终端)),而不是使用Arduino IDE和串行监视器,检查向Arduino单元发送数据或从Arduino单元接收数据是否正常工作。

    此外,您可能希望检查是否可以从切换到Xcode中获益(在调试特性等方面)。

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

        9
  •  0
  •   ceeit    14 年前

    还有苹果的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

    另一个展示如何通过串行连接与Arduino微控制器通信的Cocoa示例代码是Objective Candaduino(托管在Google代码上)。

        10
  •  0
  •   gskielian    10 年前

    一个一行程序的东西,它工作得很好,对于数据记录,并且作用于数据:

    总结
    • 监控: The Arduino output can trigger actions on the computer
    • 数据记录: 它同时将该流数据保存到文件
    • 有缺口? 发送消息: 我还没有尝试向Arduino发送数据,但请参阅第二个示例,可能能够通过一些命令行实用程序向串行端口发送消息。

    以下时间戳并发送到stdout

    cat/dev/cu.usbmodem1421 awk'for(i=0;i<nf;i++)printf$i+system(“echo,`date`”)
    < /代码> 
    
    

    样本输出:

    此方法甚至可以调整为实时监控并对数据采取行动:

    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

    数据记录,并对数据进行操作:

    总结
    • 监测:Arduino输出可以触发计算机上的操作
    • 数据记录:它同时将流数据保存到文件中
    • 没有检查吗?发送消息:我还没有尝试将数据发送到Arduino,但请参阅第二个示例,它可能能够通过一些命令行实用程序将消息发送到串行端口。

    以下时间戳并发送到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