2013-04-09 11 views
5

Obecnie próbuję wysyłać dane do mojego Arduino za pośrednictwem aplikacji Mac. Kod w moim Arduino Uno wygląda następująco:Nie mogę wysłać danych do mojego Arduino Uno za pomocą Cocoa (IOKit)

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

Oto mój kod w projekcie 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"); 

Więc kiedy uruchomić aplikację, czeka pięć sekund, ale potem zamarza. Wyjście w konsoli jest następujące:

before 
after 

Co ja tu robię źle?

UPDATE: Więc, kiedy skomentować ten wiersz z

fcntl(serialFileDescriptor, F_SETFL, 0); 

program nie zamarza, ale mój Arduino nadal robi się żadnych danych.

+0

To nie jest kod IOKit, prawda? –

+0

Korzystam z kodu podanego tutaj: http://playground.arduino.cc/Interfacing/Cocoa#IOKit – Jan

+1

To nie odpowiada bezpośrednio na twoje pytanie (odpowiedź Josh Freeman to robi), ale możesz rzucić okiem na [ORSSerialPort] (https://github.com/armadsen/ORSSerialPort), co sprawia, że ​​używanie portów szeregowych w Objective-C/Cocoa jest całkiem łatwe. –

Odpowiedz

0

Twój szkic Arduino powinien brzmieć uint8_t, a nie int, a twoje wywołanie funkcji IOKit do zapisu() powinno również używać uint8_t.

+0

Zmieniono, ale nadal nie działa. Nie otrzymuję żadnych wiadomości na moim arduino. – Jan

+0

Hmm. Uruchomienie projektu demo akcji z Xcode oraz szkicu demo w moich pracach Arduino. Czas zacząć je rozróżniać. –

2

1) Drugi parametr wywołania funkcji write() jest niepoprawny - write() oczekuje, że wskaźnik zostanie zapisany w bajcie. Aby wpisać wartość zmiennej liczbowej jako bajtach, przekazać adres zmiennej, nie zmienna sama:

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

Więcej informacji na write(): https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/write.2.html

2) Zmienia się do lokalnych termios zmienna, opcje - takie jak wywołanie cfmakeraw() - nie wpływają na ustawienia terminala; W celu aktualizacji ustawień terminal z zmienionych opcji, zadzwoń tcsetattr():

cfmakeraw(&options); 

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

tcsetattr(serialFileDescriptor, TCSANOW, &options); 

Więcej informacji na temat komunikacji szeregowej Mac OS X: http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html

+0

Witam i dziękuję za odpowiedź. Niestety, nadal nie działa dla mnie (Program nadal zawiesza się (myślę, że czeka na odpowiedź lub coś, ponieważ zamarza przy pisaniu} .To jest mój nowy kod: http://pastebin.com/ax4tvLbg – Jan

Powiązane problemy