2011-09-30 2 views
7

J'utilise la programmation série pour se connecter câble série à mon iPhoneConnectez l'accessoire à mon Jailbreak iPhone Appareil

mon code est aussi sous

#include <stdio.h> /* Standard input/output definitions */ 
#include <string.h> /* String function definitions */ 
#include <unistd.h> /* UNIX standard function definitions */ 
#include <fcntl.h> /* File control definitions */ 
#include <errno.h> /* Error number definitions */ 
#include <termios.h> /* POSIX terminal control definitions */ 

static struct termios gOriginalTTYAttrs; 

static int OpenSerialPort() 
{ 
    int  fileDescriptor = -1; 
    int  handshake; 
    struct termios options; 

    // Open the serial port read/write, with no controlling terminal, and don't wait for a connection. 
    // The O_NONBLOCK flag also causes subsequent I/O on the device to be non-blocking. 
    // See open(2) ("man 2 open") for details. 

    fileDescriptor = open("/dev/tty.iap", O_RDWR | O_NOCTTY | O_NONBLOCK); 
    if (fileDescriptor == -1) 
    { 
     printf("Error opening serial port %s - %s(%d).\n", 
       "/dev/tty.iap", strerror(errno), errno); 
     goto error; 
    } 

    // Note that open() follows POSIX semantics: multiple open() calls to the same file will succeed 
    // unless the TIOCEXCL ioctl is issued. This will prevent additional opens except by root-owned 
    // processes. 
    // See tty(4) ("man 4 tty") and ioctl(2) ("man 2 ioctl") for details. 

    if (ioctl(fileDescriptor, TIOCEXCL) == -1) 
    { 
     printf("Error setting TIOCEXCL on %s - %s(%d).\n", 
      "/dev/tty.iap", strerror(errno), errno); 
     goto error; 
    } 

    // Now that the device is open, clear the O_NONBLOCK flag so subsequent I/O will block. 
    // See fcntl(2) ("man 2 fcntl") for details. 

    if (fcntl(fileDescriptor, F_SETFL, 0) == -1) 
    { 
     printf("Error clearing O_NONBLOCK %s - %s(%d).\n", 
      "/dev/tty.iap", strerror(errno), errno); 
     goto error; 
    } 

    // Get the current options and save them so we can restore the default settings later. 
    if (tcgetattr(fileDescriptor, &gOriginalTTYAttrs) == -1) 
    { 
     printf("Error getting tty attributes %s - %s(%d).\n", 
      "/dev/tty.iap", strerror(errno), errno); 
     goto error; 
    } 

    // The serial port attributes such as timeouts and baud rate are set by modifying the termios 
    // structure and then calling tcsetattr() to cause the changes to take effect. Note that the 
    // changes will not become effective without the tcsetattr() call. 
    // See tcsetattr(4) ("man 4 tcsetattr") for details. 

    options = gOriginalTTYAttrs; 

    // Print the current input and output baud rates. 
    // See tcsetattr(4) ("man 4 tcsetattr") for details. 

    printf("Current input baud rate is %d\n", (int) cfgetispeed(&options)); 
    printf("Current output baud rate is %d\n", (int) cfgetospeed(&options)); 

    // Set raw input (non-canonical) mode, with reads blocking until either a single character 
    // has been received or a one second timeout expires. 
    // See tcsetattr(4) ("man 4 tcsetattr") and termios(4) ("man 4 termios") for details. 

    cfmakeraw(&options); 
    options.c_cc[VMIN] = 1; 
    options.c_cc[VTIME] = 10; 

    // The baud rate, word length, and handshake options can be set as follows: 

    cfsetspeed(&options, B19200); // Set 19200 baud  
    options.c_cflag |= (CS8); // RTS flow control of input 


    printf("Input baud rate changed to %d\n", (int) cfgetispeed(&options)); 
    printf("Output baud rate changed to %d\n", (int) cfgetospeed(&options)); 

    // Cause the new options to take effect immediately. 
    if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1) 
    { 
     printf("Error setting tty attributes %s - %s(%d).\n", 
      "/dev/tty.iap", strerror(errno), errno); 
     goto error; 
    }  
    // Success 
    return fileDescriptor; 

    // Failure "/dev/tty.iap" 
error: 
    if (fileDescriptor != -1) 
    { 
     close(fileDescriptor); 
    } 

    return -1; 
} 

int main(int args, char *argv[]) 
{ 
    int fd; 
    char somechar[8]; 
    fd=OpenSerialPort(); // Open tty.iap with no hardware control, 8 bit, BLOCKING and at 19200 baud 
    if(fd>-1) 
    { 
     write(fd,"*",1); // Write handshaking message over serial 
     /////////////////////////////////////////////////////////////////////////////////////////////////// 
     // After this, our device or our PC program should be strobing serial ground to gain access to the Iphone Serial Line 
     ////////////////////////////////////////////////////////////////////////////////////////////////// 
     read(fd,&somechar[0],1); // Read 1 byte over serial. This will block (wait) untill the byte has been received 
     if(somechar[0]=='*') // Check if this byte is a "handshaking" message 
     { 
      printf("Serial connection established!\n"); // If it is, we have established a connection to the device and can freely read/write over serial! 
      while(1) // Do this forever or untill someone presses CTRL+C 
      { 
       read(fd,&somechar[0],1); // Read a character over serial! 
       putchar(somechar[0]); // Write the character to the Terminal!! 
      } 
     } 
    } 
    return 0; 
} 

mais quand je vais vérifier le câble est connecté ou pas j'ai eu une erreur comme celle-ci

Erreur lors de l'ouverture du port série /dev/tty.iap - Opération non autorisée (1).

est-il une connaître la solution et s'il vous plaît me donner la suggestion si je vais dans le mauvais sens en fait, je suis un nouveau dans le développement iOS donc plus confus.

Merci

+0

Je ne suis pas du tout familier avec ce niveau de codage sur un iPhone jb. Cependant, certains contrôles de type Unix peuvent éclairer les autres. Quelles sont les autorisations sur /dev/tty.iap et l'utilisateur que vous exécutez le code dispose-t-il des autorisations sur le périphérique (bien que j'imagine que vous exécutez le code ssh'd en tant que root?). – Diziet

+0

@Raj Comment avez-vous vu la sortie de vos instructions printf? Évidemment, la fenêtre de la console est Xcode ne fonctionnera pas parce que votre iDevice est connecté à votre périphérique série en utilisant un connecteur de dock personnalisé je présume? – Chris

Répondre

2

Peut-être les articles suivants iPhone Communication série peut aider?

iPhone/iPod Touch Serial Port Tutorial Par Collin Meyer

et

iPhone Serial Communication

+0

Je suis un succès pour communiquer jb iPhone à l'accessoire via la communication série, mais je fais face à un problème pour l'iPhone 4g. J'ai une erreur "Connexion série échouée" chaque fois que j'essaie de connecter cet accessoire à iPhoen4g. son travail bien avec 3g ou 3gs – Raj

+0

@ Raj Eh bien, vous devriez mettre à jour votre question initiale pour refléter cela alors. – fuzz

+0

@Fulvio, deuxième lien avait la réponse, au moins dans mon cas. +1 pour ça (c'était il y a un moment). – newenglander

0

j'ai eu la même erreur en essayant d'ouvrir le port série sur un iPod jailbreaké tactile fonctionnant sous iOS 5.0 en utilisant un binaire créé avec Xcode. Cependant, lorsque j'ai utilisé gcc (pour l'iPhone avec des drapeaux appropriés) sur la ligne de commande sur mon Mac au lieu de Xcode et créé une application de ligne de commande pour iOS, le binaire généré a pu ouvrir le port série et lire les commandes de mon accessoire externe. Cela devrait être possible de créer une bibliothèque et de la lier avec Xcode et avoir le même résultat (même si je ne l'ai pas encore essayé).

Mise à jour: Malheureusement, la création d'une bibliothèque dans gcc et sa liaison dans un projet Xcode ont provoqué la même erreur qu'avant. Solutions possibles:

  • appellent l'application de ligne de commande de l'application GUI iOS Xcode
  • compilent l'application elle-même avec gcc au lieu de Xcode

En fait, il est encore plus simple que cela, trouvé tout en passant par le second link dans la réponse de Fulvio: Vous avez juste besoin de déplacer l'application dans un répertoire différent de celui où Xcode les place normalement. Comme suggéré dans l'entrée du blog, j'ai mis mon application dans un répertoire pour les applications Cydia (/private/var/stash/Applications), et a été en mesure d'ouvrir le port série - pas de compilation gcc nécessaire.

Alors ma gcc application de ligne de commande -compiled a pu lire à partir du port série parce que j'exécutais dans le répertoire de la racine, qui ne dispose pas non plus les restrictions du répertoire normal des applications (/private/var/mobile/Applications) - -Quelles que soient ces restrictions.

Questions connexes