【发布时间】:2013-04-09 13:49:44
【问题描述】:
我目前正在尝试通过 Mac 应用程序将数据发送到我的 Arduino。我的Arduino Uno 中的代码如下所示:
void setup()
{
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
Serial.begin (9600);
}
void loop ()
{
digitalWrite (2, HIGH);
if (Serial.available () > 0)
{
int c = Serial.read();
if (c == 255)
{
digitalWrite (3, HIGH);
}
else
digitalWrite (4, HIGH);
}
}
这是我在 XCode 项目中的代码:
// Open the serial like POSIX C
serialFileDescriptor = open(
"/dev/tty.usbmodemfa131",
O_RDWR |
O_NOCTTY |
O_NONBLOCK );
struct termios options;
// Block non-root users from using this port
ioctl(serialFileDescriptor, TIOCEXCL);
// Clear the O_NONBLOCK flag, so that read() will
// block and wait for data.
fcntl(serialFileDescriptor, F_SETFL, 0);
// Grab the options for the serial port
tcgetattr(serialFileDescriptor, &options);
// Setting raw-mode allows the use of tcsetattr() and ioctl()
cfmakeraw(&options);
speed_t baudRate = 9600;
// Specify any arbitrary baud rate
ioctl(serialFileDescriptor, IOSSIOSPEED, &baudRate);
NSLog (@"before");
sleep (5); // Wait for the Arduino to restart
NSLog (@"after");
int val = 255;
write(serialFileDescriptor, val, 1);
NSLog (@"after2");
因此,当我运行应用程序时,它会等待五秒钟,但随后会冻结。控制台的输出是这样的:
before
after
那么,我在这里做错了什么?
更新:所以,当我注释掉这一行时
fcntl(serialFileDescriptor, F_SETFL, 0);
程序没有冻结,但我的 Arduino 仍然没有得到任何数据。
【问题讨论】:
-
这不是 IOKit 代码吧?
-
这并不能直接回答你的问题(Josh Freeman 的回答就是这样做的),但你可以看看ORSSerialPort,这使得在 Objective-C/Cocoa 中使用串行端口变得非常容易。
-
ORSSerialPort 在编译我的应用程序时总是给我一个链接器错误 - 无法让它正常工作
-
Jan,请确保您链接的是 ORSSerialPort 所依赖的 IOKit.framework。为此,您可以将其添加到目标的“Link Binary with Libraries”构建阶段。见截图here。
标签: objective-c cocoa serial-port arduino iokit