Vinalys21
Messages postés17Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention11 avril 2008
-
9 avril 2008 à 10:01
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 2009
-
11 avril 2008 à 16:13
Bonjour à tous,
Je suis actuellement entrain de coder un programme en langage C permettant d'intéragir avec un lecteur RFID Skyetek M9. Skyetek fournit une API qui ma fois ne fonctionne pas trop mal hormis un petit détail. En effet, les tableaux de caractères contenu à l'intérieur des structures sont remplis à l'aide de caractères et de '\0' qui sortent de nul part. Supposons que j'ai un pointeur sur structure, cette structure contient un tableau nommé nom de 128 caractères. Ce tableau contient alors les données suivantes : {'S', '\0', 'k', '\0', 'y', '\0', etc...}Ce qui fait que lorsque je fais un printf du genre printf("Nom : %s", ptr->nom) et bien il ne m'affiche que le 'S', ce qui est normal puisqu'une fin de chaine est détectée après ce premier caractère. Ma question est, à quoi cela pourrait t'il être du? Je développe à l'aide de Dev C++ sur un environnement Windows.
Bien sur je pourrais contourner le problème en écrivant une fonction qui me réorganise le tableau bien correctement, mais travaillant sur un système embarqué, je n'ai pas des ressources processeurs illimités.
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 9 avril 2008 à 14:17
Si l'API fournie est en UNICODE, il faut faire un programme UNICODE ! Ca sera plus simple que de convertir d'un format à l'autre. Mais peut être y-a-t'il une version ASCII de cette API ?
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 9 avril 2008 à 15:42
Le compilateur (le préprocesseur en fait) n'a aucune raison de refuser un #define ASCII mais c'est pas pour ça que cela sera pris en compte ! La constante ASCII sera créée tout simplement ! A ma connaissance il faut mettre #define UNICODE pour passer en UNICODE, si on ne le met pas on reste en ASCII, c'est comme cela que je l'utilise.
Pouvez-vous poster l'exemple qui est fourni avec l'API (ou un extrait avec la structure) ?
Jean-François
//
// FUNCTION: SelectLoopCallback(LPSKYETEK_TAG, void *)
//
// PURPOSE: Callback called by SkyeTek_SelectTags whenever
// a tag is selected. This returns 1 to continue
// and zero to stop.
//
//
unsigned char SelectLoopCallback(LPSKYETEK_TAG lpTag, void *user)
{
if( !isStop )
{
if( lpTag != NULL )
{
printf("Tag: %s; Type: %s\n", lpTag->friendly, SkyeTek_GetTagTypeNameFromType(lpTag->type));
SkyeTek_FreeTag(lpTag);
}
}
return( !isStop );
}
//
// FUNCTION: ThreadProc(LPVOID)
//
// PURPOSE: Main thread function. It sits in a loop until the
// reader is discovered and then it calls the
// SkyeTek_SelectTags function, which does not return
// until the loop stops. To stop the loop, the
// SelectLoopCallback needs to return zero.
//
//
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
LPSKYETEK_DEVICE *devices = NULL;
LPSKYETEK_READER *readers = NULL;
SKYETEK_STATUS st;
unsigned int numDevices;
unsigned int numReaders;
// comment this out to disable debug
SkyeTek_SetDebugger(debug);
// set reader info
printf("Found reader: %s\n", readers[0]->friendly);
// the SkyeTek_SelectTags function does not return until the loop is done
printf("Entering select loop...\n");
st = SkyeTek_SelectTags(readers[0],AUTO_DETECT,SelectLoopCallback,0,1,NULL);
if( st != SKYETEK_SUCCESS )
printf("Select loop failed\n");
printf("Select loop done\n");
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 9 avril 2008 à 16:13
Par contre la structure SKYETEK_READER est compatible UNICODE avec ces TCHAR !
Tout cela donne vraiment à penser que l'API est compilée en mode UNICODE, vu ce qu'elle retourne dans la structure readers. En ajoutant le #define UNICODE tout au début ça ne change rien ?
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 9 avril 2008 à 16:21
En cherchant des infos sur Google je tombe sur un autre post ici qui parle du même programme mais pas de ce problème ! Peut-être pourra-t'il donner des infos sur sa façon de compiler ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 9 avril 2008 à 18:09
Salut,
Pour compiler en unicode, il faut definir UNICODE et _UNICODE, et si
possible c'est quand même mieux de faire ca dans les options du compilo
plutot que dans le code, comme ça, aucun probleme et tu ne te
retrouvera pas avec un cpp compilé en ansi et un en unicode.
A noter qu'il existe aussi plein de macro pratiques pour faire un code
qui compile en unicode ou en ansi au choix: TCHAR, TEXT, LPTSTR,
_tcslen, etc.
Vinalys21
Messages postés17Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention11 avril 2008 10 avril 2008 à 14:15
Alors la j'avoue que je suis bluffé, ça marche niquel. Un grand merci ! Donc si j'ai bien compris cette fonction permet d' encoder une chaine UNICODE en ASCII? Il faudrait donc que je compile en ASCII ? Je suis entrain de regarder comment passer ca en option au compilateur