Objective-C - Arduino 通信停止
Posted
技术标签:
【中文标题】Objective-C - Arduino 通信停止【英文标题】:Objective-C - Arduino communication stops 【发布时间】:2014-01-28 14:40:05 【问题描述】:我正在尝试使用我在 Objective-C 和我的 Arduino 板上编写的应用程序来控制一些步进电机。我使用 popen 向我的 Arduino 发送一个字节(字母 a)并计算所采取的步骤(Xc):
-(IBAction)PlusX:(id)sender
popen("echo a > /dev/tty.usbmodem621", "r");
Xc = Xc +1;
_lXc.stringValue = @(Xc);
[NSThread sleepForTimeInterval:0.16f];
我的 Arduino 在 void 循环中读取此内容并迈出一步。
if (Serial.available() > 0)
// read the incoming byte:
incomingByte = Serial.read();
Serial.println(incomingByte);
if(incomingByte == 'a')
MotorX->step(1, FORWARD, SINGLE);
这一切都和预期的差不多。除了 byte/step/action 144 之后,Objective-C 应用程序会继续正确计算步数,但是它们不会出现在 Arduino 的串行监视器中,并且电机会停止步数。有谁知道为什么会一直这样?
谢谢
【问题讨论】:
您真的不应该使用popen()
通过串行通信。通过 NSFileHandle 或 NSStream 打开 tty,然后根据需要将字节写入它。
【参考方案1】:
您正在打开许多文件(在 linux 中一切都是文件)但从不关闭它。然后您正在创建“垃圾”打开文件,因为您不能再使用该文件,但它就在那里。并且任何操作系统都会为您提供最大文件打开限制(文件描述符限制);在你的情况下大约 144。
当您“杀死”您的应用程序时,该描述符会被释放,因此您可以再次使用它们。
另外,因为您没有检查描述符是否有效,所以您没有调试 144 打开后它给出错误。
解决方案(不检查错误)是
pclose(popen("echo a > /dev/tty.usbmodem621", 'r'));
【讨论】:
以上是关于Objective-C - Arduino 通信停止的主要内容,如果未能解决你的问题,请参考以下文章