2013-04-09 21 views
5

現在、私はArduinoにMacアプリケーション経由でデータを送信しようとしています。私Arduino Unoのコードは次のようになります。ここではCocoa(IOKit)を使用して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"); 

私はアプリケーションを実行するときに、それが5秒間待機しますが、それがフリーズします。コンソールの出力は次のとおりです。

before 
after 

私はここで間違っていますか?私は

fcntl(serialFileDescriptor, F_SETFL, 0); 

からこの行をコメントので、プログラムがフリーズしませんが、私のArduinoのはまだすべてのデータを取得doesntの:

UPDATE。

+0

これはIOKitのコードではありません、それはありますか? –

+0

私はここに提供されているコードを使用しています:http://playground.arduino.cc/Interfacing/Cocoa#IOKit – Jan

+1

これはあなたの質問に直接答えるものではありませんが(ジョシュ・フリーマンの答えはそうです)、あなたは[ORSSerialPort] (https://github.com/armadsen/ORSSerialPort)、Objective-C/Cocoaのシリアルポートを使用するのが簡単です。 –

答えて

0

Arduinoのスケッチはではなく、uint8_tである必要があります。また、write()のIOKit呼び出しでもuint8_tを使用する必要があります。

+0

それは変更されましたが、まだ動作しません。私はarduinoに何のメッセージも受け取りません。 – Jan

+0

Hmm。 Xcodeからのデモ・プロジェクトの実行と、私のArduinoのデモ・スケッチの実行。それらを相違させ始める時間。 –

2

1)write()の呼び出しの2番目のパラメータが不正です。 - write()は、書き込まれるバイトへのポインタを必要とします。ローカルのtermiosの変更 https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/write.2.html

2):書き込みに

write(serialFileDescriptor, (const void *) &val, 1); 

詳細情報():バイトとして数値変数の値を書き込むために、ではなく、変数自体の変数のアドレスを渡します変数、cfmakeraw()の呼び出しなどのオプションは、端末設定に影響を与えません。変更されたオプションを持つ端末の設定を更新するためには、(のtcsetattrを呼び出す):MacのOS Xのシリアル通信の

cfmakeraw(&options); 

// ...other changes to options... 

tcsetattr(serialFileDescriptor, TCSANOW, &options); 

さらに詳しい情報: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html

+0

こんにちは、ありがとうございました。残念ながら、それはまだ私のために働いていません(プログラムはまだフリーズしています。私はそれが書き込み時にフリーズするため、答えを待っていると思います)。これは私の新しいコードです:http://pastebin.com/ax4tvLbg – Jan

関連する問題