2013-04-09 18 views
5

Ich versuche gerade, Daten über eine Mac-Anwendung an meinen Arduino zu senden. Der Code in meinem Arduino Uno sieht wie folgt aus:Ich kann mit Cocoa (IOKit) keine Daten an meinen Arduino Uno senden

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); 
    } 
} 

Hier mein Code in der XCode-Projekt ist:

// 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"); 

Also, wenn ich die Anwendung ausführen, wartet die fünf Sekunden, aber es friert dann. Die Ausgabe in der Konsole ist dies:

before 
after 

Also, was mache ich hier falsch?

UPDATE: Also, wenn ich diese Zeile aus kommentieren

fcntl(serialFileDescriptor, F_SETFL, 0); 

das Programm friert nicht, aber mein Arduino noch keine Daten doesnt zu bekommen.

+0

Dies ist nicht IOKit Code ist es? –

+0

Ich verwende den hier angegebenen Code: http://playground.arduino.cc/Interfacing/Cocoa#IOKit – Jan

+1

Dies beantwortet nicht direkt Ihre Frage (Josh Freemans Antwort tut das), aber Sie könnten sich [ORSSerialPort] ansehen (https://github.com/armadsen/ORSSerialPort), was die Verwendung serieller Ports in Objective-C/Cocoa recht einfach macht. –

Antwort

0

Ihre Arduino Skizze sollte lesen uint8_t, nicht int und Ihr IOKit Aufruf zu schreiben() sollte auch Uint8_t verwenden.

+0

Geändert hat es aber immer noch nicht funktioniert. Ich erhalte auf meinem Arduino keine Nachrichten. – Jan

+0

Hmm. Ausführen des Stock-Demo-Projekts von Xcode sowie der Demo-Skizze auf meinen Arduino-Arbeiten. Zeit, sie zu beginnen. –

2

1) Der zweite Parameter des Aufrufs von write() ist falsch - write() erwartet einen Zeiger auf das Byte (s), das geschrieben werden soll. Um den Wert einer numerischen Variablen wie Bytes zu schreiben, übergeben Sie die Adresse der Variablen, nicht die Variable selbst:

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

Mehr Informationen zu write(): https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/write.2.html

2) Änderungen an den lokalen termios Variable, Optionen - wie der Aufruf von cfmakeraw() - haben keinen Einfluss auf die Terminaleinstellungen; Um die Terminal-Einstellungen mit den geänderten Optionen zu aktualisieren, rufen tcsetattr():

cfmakeraw(&options); 

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

tcsetattr(serialFileDescriptor, TCSANOW, &options); 

Weitere Informationen über Mac OS X serielle Kommunikation: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html

+0

Hallo und danke für deine Antwort. Leider funktioniert es immer noch nicht für mich (Programm friert immer noch ein (ich denke, es wartet wie eine Antwort oder etwas, weil es beim Schreiben einfriert). Das ist mein neuer Code: http://pastebin.com/ax4tvLbg – Jan