Problème ASCII et fonction ftdi

Signaler
Messages postés
7
Date d'inscription
mardi 29 octobre 2013
Statut
Membre
Dernière intervention
6 décembre 2013
-
Bonjour à tous,


Je suis actuellement sur un projet ou je dois communiquer avec une IHM par une carte linux avec comme intermédiaire une carte avec 2 port com ( liaison USB entre la carte linux et la carte aux ports COM).

Je dois envoyer des trames avec des valeurs spécifiques pour certains octets et recevoir la trame de réponse de l'IHM.

Mais actuellement j'ai 1 gros problème:

-Donc j'ai fait un buffer a 57 octet, j'ai mis une valeur dans une trentaine de ces octets ( les autres ne sont pas hyper importants) j'ai ajouté une fonction à mon programme pour voir le résultat de ce que j'envoie mais le problème c'est que l'IHM les reçoit en ASCII!!!!! donc sa fausse quasiment tout les octets ( normalement il y a seulement une partie de la trame qui dois être transformée en ASCII est pas toute la trame) pourtant je n'ai pas fait de fonction pour convertir en ASCII donc je ne voit pas d'où cela peut venir??


J'aurais besoin d'aide aussi au niveau des fonctions FT_Write et FT_Read, parce que j'ai lu l'aide de ce site http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf je pense avoir compris comment envoyer et recevoir une trame mais je ne voit pas comment écrire une valeur spécifique dans un octet de la trame que j'envoie ( par exemple mettre 0xFF à l'octet 10 ) et aussi comment lire la valeur d'un octet à l'intérieur de la trame que je reçoit de l'IHM( par exemple dans mon programme je dois lire l'état de l'octet 13 pour savoir si une touche a été appuyé)?


Voila le programme que j'ai fait actuellement avec les explications du code:



#include <iostream>
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string>
#include "ftd2xx.h"
#include "WinTypes.h"
int main()
{
char text1[32]{ 0x20, 0x42, 0x6F, 0x6E, 0x6A, 0x6F, 0x75, 0x72,
0x20, 0x61, 0x70, 0x70, 0x75, 0x79, 0x65, 0x72, 0x20, 0x73, 0x75, 0x72,
0x20, 0x75, 0x6E, 0x65, 0x20, 0x74, 0x6F, 0x75, 0x63, 0x68, 0x65, 0x20
}; // texte à afficher sur l'écran de l'IHM il est codé en ASCII
char P1_Led[3]{ 0x01, 0x00, 0x00 }; // sur l'IHM il y a 4 rangés de 3 leds chaque leds montre 1 des 3 état possibles de l'IHM la je gère seulement une rangés de 3 leds
char inBuffer[16]; // buffer qui contient les 16 octets que ej dois recevoir de l'IHM
char data[] = "0x01"; // juste pour tester un truc
DWORD EventDWord;
int tailleinbuffer = 3; // idem pour tester un truc
std::string data_hexa[16]; // idem
FT_STATUS ftStatus; // le status du port com
FT_HANDLE ftHandle; // le handle
FT_DEVICE_LIST_INFO_NODE *devInfo; // liste des devices ( en gros les ports com)
DWORD BytesWritten;
DWORD RxBytes=16;
DWORD TxBytes;
int taillechaine =0;
DWORD numDevs;
DWORD BytesReceived;
char outBuffer[57]; // buffer qui contient les 57 octets que je dois envoyer à l'IHM
ftStatus = FT_CreateDeviceInfoList(&numDevs); // crée la liste des devices connecté
if (ftStatus == FT_OK)
printf("Number of devices is %d\n",numDevs);
if (numDevs > 0) {
devInfo =
(FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs);
// get the device information list
ftStatus = FT_GetDeviceInfoList(devInfo,&numDevs);
if (ftStatus == FT_OK) {
for (int i = 0; i < numDevs; i++) {
printf("Dev %d:\n",i);
printf(" Flags=0x%x\n",devInfo[i].Flags);
printf(" Type=0x%x\n",devInfo[i].Type);
printf(" ID=0x%x\n",devInfo[i].ID);
printf(" LocId=0x%x\n",devInfo[i].LocId);
printf(" SerialNumber=%s\n",devInfo[i].SerialNumber);
printf("Description=%s\n",devInfo[i].Description);
printf(" ftHandle=0x%x\n",devInfo[i].ftHandle);
}
}
}

// tout ce qui était avant me permettait de connaitre quelques caractéristiques des ports com connectés

ftStatus=FT_Open(1, &ftHandle); // le 1 représente le port que j'utilise en gros
if(ftStatus!=FT_OK)
{
//FT_Open failed
printf("\nproblem\n");
return 1;
}
else
printf("pas de probleme\t");
for (int i = 0; i < 56; i++)
{
outBuffer[i] = 0x00; // met les 57 octets que j'envoie à l'IHM à 0 au début
}
ftStatus = FT_SetBaudRate(ftHandle, 9600); // met la valeur du baudrate
ftStatus = FT_SetDataCharacteristics(ftHandle, FT_BITS_8,
FT_STOP_BITS_1,FT_PARITY_NONE); // 8 bits de données, 1 bit de stop et pas de bit de parité
FT_SetTimeouts(ftHandle,500,0); // temps entre 2 envoie
while(inBuffer[13] != 01) // boucle tant que l'on appuie pas sur une touche du clavier ( octet 13 de l'IHM représente la détection de l'appuie d'une touche)
{
int departoutbuffer = 3;
int longueur =sizeof(text1)/sizeof(*text1);
for (int i = 0; i < longueur; i++)
{
outBuffer[departoutbuffer] = text1[i];
departoutbuffer++;
} // boucle pour afficher le text1 codé en ASCII sur l'IHM
outBuffer[0] = 0xAA; // octet qui représente le sigle de l'entreprise
outBuffer[1] = 0x57; // nombre d'octet transmis
outBuffer[2] = 0x08; // pas important
outBuffer[3]= 0x42; // octet de 3 a 34 représente le texte a afficher en ASCII mais je me sers du for pour afficher le texte , j'ai essayé de les passer en binaire pour voir un changement mais aucun changement.
outBuffer[4]= 0x4F;
outBuffer[5]= 0x4E;
outBuffer[6]= 0x4A;
outBuffer[7]= 0x4F;
outBuffer[8]= 0x55;
outBuffer[9]= 0x52;
/* outBuffer[10]= 0x01110010;
outBuffer[11]= 0x00100000;
outBuffer[12]= 0x01100001;
outBuffer[13]= 0x01110000;
outBuffer[14]= 0x01110000;
outBuffer[15]= 0x01110101;
outBuffer[16]= 0x01111001;
outBuffer[17]= 0x01100101;
outBuffer[18]= 0x01110010;
outBuffer[19]= 0x00100000;
outBuffer[20]= 0x01110011;
outBuffer[21]= 0x01110101;
outBuffer[22]= 0x01110010;
outBuffer[23]= 0x00100000;
outBuffer[24]= 0x01110101;
outBuffer[25]= 0x01101110;
outBuffer[26]= 0x01100101;
outBuffer[27]= 0x00100000;
outBuffer[28]= 0x01110100;
outBuffer[29]= 0x01101111;
outBuffer[30]= 0x01110101;
outBuffer[31]= 0x01100011;
outBuffer[32]= 0x01101000;
outBuffer[33]= 0x01100101;
outBuffer[34]= 0x00100000; */
outBuffer[35]= 0x03; // octet type d'action, ici sa gère les leds, clavier 1 touche , et l'afficheur lcd
outBuffer[40] = 0x00;
outBuffer[41] = 0x00;
outBuffer[42] = 0x00;
outBuffer[43] = 0x00; // octet de 40 à 43 sont des octets réservés, a mettre à 0
outBuffer[44] = P1_Led[0];
outBuffer[45] = P1_Led[1];
outBuffer[46] = P1_Led[2]; // octet 44 à 46 sont les 3 état pour une rangés de leds
ftStatus = FT_Write(ftHandle, outBuffer, sizeof(outBuffer),&BytesWritten); // fonction d'écriture
if(ftStatus == FT_OK)
{
//FT_Write OK
printf("ecriture\t");
}
else
{
//FT_Write Failed
}
// FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
// data_hexa[i]= inBuffer[i];
ftStatus = FT_Read(ftHandle,inBuffer,RxBytes,&BytesReceived); //fonction de lecture
if (ftStatus == FT_OK) {
printf("%d octet recu:\r\n%s\r\n",BytesReceived,outBuffer);
if (BytesReceived == RxBytes) {
printf("\treception\t");
// FT_Read OK
}
else {
printf("probleme reception\n");
// FT_Read Timeout
}
}
}
FT_Close(ftHandle);

}



Donc voila pour le programme, quand je le lance il y a bien une communication mais dans 1 seul sans ( du pc vers l'IHM ) je suis quasi sur que c'est parce que la trame est transformée en ASCII , il m'affiche le texte que je veut envoyé sur l'écran d'ordi mais pas sur l'afficheur lcd et il m'informe qu'il écrit mais qu'il a des problème de réception.




Donc si quelqu'un aurait une solution à mes problèmes cela m'aiderais grandement.
Merci d'avance
Valentin