Bonjour,
Je débute en objective-C, et je m'arrache le peu de cheveux que j'ai depuis 2 heures sur un problème qui paraitra surement tout bête aux spécialistes... Je veux récupérer les codes hexadécimaux des caractères d'une chaine pour pouvoir envoyer une requete à un périphérique bluetooth.
Donc j'ai une méthode :
que j'appelle comme ça :
Pour comprendre un peu la structure de la chaine que je veux envoyer au périphérique, voilà ce que contient la chaine faite à la main qui fonctionne :
\x08 : octet 0 : LSB, pseudo-unités de long du message moins les 2 octets du début
\x00 : octet 1 : MSB, pseudo-dizaines de long du message moins les 2 octets du début
\x01 : octet 2 : code pour dire que c'est une requete
\x86 : octet 3 : code de la requete (ici requete sur le 1er element d'une liste de fichiers)
\x2a : octet 4 : caractere ascii *
\x2e : octet 5 : caractere ascii .
\x72 : octet 6 : caractere ascii r
\x78 : octet 7 : caractere ascii x
\x65 : octet 8 : caractere ascii e
\x00 : octet 9 : octet NULL
Je comprends toujours pas pourquoi les octets 0 et 1 sont inversés, ni ce que veulent dire LSB et MSB, rien dans la doc du protocole de communication du périphérique ne l'indique, comme si c'était un acronyme très très connu... si quelqu'un sait je veux bien une explication (d'ailleurs tous les octets qui concernent une taille sont inversés dans les communications c'est étrange, peut etre que ça a une utilité pratique).
Donc cette chaine, construite à la main, fonctionne, je reçois ce qu'il faut du périphérique.
Par contre quand j'utilise ma fonction, je ne reçois pas la bonne réponse, alors que la requête est censée être la même. Je pense que je me plante dans la construction de la chaine, mais j'ai beau chercher je vois pas trop où... et comme je débute complètement en objective-C je me dis qu'il y a peut être une grosse bourde ailleurs que j'ai pas vue...
Je débute en objective-C, et je m'arrache le peu de cheveux que j'ai depuis 2 heures sur un problème qui paraitra surement tout bête aux spécialistes... Je veux récupérer les codes hexadécimaux des caractères d'une chaine pour pouvoir envoyer une requete à un périphérique bluetooth.
Donc j'ai une méthode :
Bloc de code:
- (void)envoiRequetePremierFichier:(NSString *)extension {
if ( mRFCOMMChannel != nil ) {
unsigned char lenPf = 3 + [extension length];
unsigned char lenPfDeux = 5 + [extension length];
const char *extensionPf = [extension UTF8String];
RFCOMMChannel writeSync:[[NSString stringWithFormat:@"%c\x00\x01\x86%s\x00",lenPf,extensionPf] UTF8String] length:lenPfDeux];// ça ne fonctionne pas
//RFCOMMChannel writeSync:"\x08\x00\x01\x86\x2a\x2e\x72\x78\x65\x00" length:10]; //ça fonctionne très bien quand je remplis 'à la main' comme ça
}
}
que j'appelle comme ça :
Bloc de code:
NSString *extension = @"*.rxe";
[self envoiRequetePremierFichier:extension];
Pour comprendre un peu la structure de la chaine que je veux envoyer au périphérique, voilà ce que contient la chaine faite à la main qui fonctionne :
\x08 : octet 0 : LSB, pseudo-unités de long du message moins les 2 octets du début
\x00 : octet 1 : MSB, pseudo-dizaines de long du message moins les 2 octets du début
\x01 : octet 2 : code pour dire que c'est une requete
\x86 : octet 3 : code de la requete (ici requete sur le 1er element d'une liste de fichiers)
\x2a : octet 4 : caractere ascii *
\x2e : octet 5 : caractere ascii .
\x72 : octet 6 : caractere ascii r
\x78 : octet 7 : caractere ascii x
\x65 : octet 8 : caractere ascii e
\x00 : octet 9 : octet NULL
Je comprends toujours pas pourquoi les octets 0 et 1 sont inversés, ni ce que veulent dire LSB et MSB, rien dans la doc du protocole de communication du périphérique ne l'indique, comme si c'était un acronyme très très connu... si quelqu'un sait je veux bien une explication (d'ailleurs tous les octets qui concernent une taille sont inversés dans les communications c'est étrange, peut etre que ça a une utilité pratique).
Donc cette chaine, construite à la main, fonctionne, je reçois ce qu'il faut du périphérique.
Par contre quand j'utilise ma fonction, je ne reçois pas la bonne réponse, alors que la requête est censée être la même. Je pense que je me plante dans la construction de la chaine, mais j'ai beau chercher je vois pas trop où... et comme je débute complètement en objective-C je me dis qu'il y a peut être une grosse bourde ailleurs que j'ai pas vue...