所以,我有点过头了,我觉得我非常接近解决方案,但它还没有完成。这是我的情况:
我正在使用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中打开串行监视器是以某种方式初始化串口,这反过来允许我拖尾它没有问题。这反过来告诉我,我只是没有输入某种初始化命令。但是,我一直在高低搜索,似乎无法找到解决这个问题的任何东西。
解决方案是什么?
答案 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)
用于数据记录和对数据采取行动的 非常好 的单行内容:
摘要以下时间戳并发送到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