2013-04-09 26 views
5

Şu anda bir Mac uygulamasıyla veriyi Arduino'ya göndermeye çalışıyorum.Verileri Arduino Uno'yu Cocoa (IOKit) kullanarak gönderemiyorum

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

İşte XCode projesinde benim kodudur: my Arduino Uno kod şöyle Uygulamayı çalıştırdığınızda

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

Yani, beş saniye bekler, ama sonra donar. Konsoldaki çıktı şudur: Burada neyi yanlış yapıyorum?

GÜNCELLEME: Ben

fcntl(serialFileDescriptor, F_SETFL, 0); 

üzerinden bu satırı yorum yaparken programı dondurmak değil, ama benim Arduino hala herhangi bir veri olsun yok Yani.

+0

Bu IOKit kodu değil, değil mi? –

+0

Burada sağlanan kodu kullanıyorum: http://playground.arduino.cc/Interfacing/Cocoa#IOKit – Jan

+1

Bu, doğrudan sorunuzu yanıtlamıyor (Josh Freeman'ın cevabı böyle yapıyor), ancak [ORSSerialPort] 'a bir göz atabilirsiniz. (https://github.com/armadsen/ORSSerialPort), Objective-C/Cocoa'da seri portları kullanmayı oldukça kolaylaştırır. –

cevap

0

Arduino taslağınız uint8_t'u değil, int'u okumalı ve IOKit çağrıcınız uint8_t'yi de kullanmalıdır.

+0

Değiştirildi, ancak hala çalışmıyor. Arduino'mda hiç mesaj alamıyorum. – Jan

+0

Hmm. Hisse senedi demo projesini Xcode'un yanı sıra Arduino çalışmalarımdaki demo taslağını çalıştırıyorum. Onları farklılaştırma zamanı. –

2

1) Write() işlevinin ikinci parametresi yanlış - write(), yazılacak bayt (lar) a işaretçiyi bekler. Yerel termios için değiştirir https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/write.2.html

2): yazma üzerine

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

diğer bilgiler(): bayt olarak sayısal bir değişkenin değerini yazmak için değil, değişken kendisi değişkenin adresini geçmesi değişken, seçenekler - cfmakeraw() çağrısı gibi - terminal ayarlarını etkilemez; Değiştirilen seçenekleri ile Terminal ayarları güncellemek için, tcsetattr() çağrısı: Mac OS X seri iletişimi

cfmakeraw(&options); 

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

tcsetattr(serialFileDescriptor, TCSANOW, &options); 

diğer bilgiler: Bu http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html

+0

Merhaba ve cevabınız için teşekkürler. Ne yazık ki, hala benim için çalışmıyor (Program hala donuyor çünkü sanki cevapta donuyor diye bir cevap ya da bir şey gibi bekliyorum). Bu benim yeni kodum: http://pastebin.com/ax4tvLbg – Jan