|
|
|
|
Configuration: Windows XP Internet Explorer 6.0
Salut.
Déjà un petit commentaire sur tes test : tu met "problème 1" à chaque fois, c'est pas très judicieu, tu devrais mettre "prolbème 1" puis "problème 2" etc. Je n'ai pas la solution à ton problème, mais j'ai deux ou trois piste: tu ne laisse pas le temps à ton analyseur de répondre, essai de mettre un sleep avant le readfile. En général, ce genre de communication (readfile, writefile) fonctionnent par le biais d'un tampon. Tant que le tampon n'a pas atteint une certaine taille, il n'est pas envoyer. En C++ standard, tu as fflush() pour forcer le vidage d'un tampon. Sinon, essai d'autre commande, peu être que la réponse pour la batterie est bugguer ou je ne sais quoi. Tu as peut être un ping ou un echo. Salutation ! Char Snipeur |
merci beaucoup de m'avoir repondu.
Oui c'est vrai que mes "probleme !" sont pas super jolis, mais vus que je n'est pas eu de problemes, je ne m'en suis pas trop occupe. Sinon j'ai essaye tout ce que tu m'as conseille, mais toujours rien. Je suis au bord de la crise de nerf :( |
Bon, il faut prendre le problème dans l'ordre...
selon ce que tu m'as dit, tu arrive à envoyer des données, qui sont corectement recptionner et traiter par l'analyseur de spectre (changement de langue). donc a priori, il n'y a pas de raison que ta demande de niveau batterie ne soit pas reçu et traité. Pour érif, met le changement de langue dans ce programme là. Si la langue est bien modifier, ce n'est pas un problème de flush sur le write(d'ailleur, tu dit que tu as essayer, mais quel fonction pour vider le tampon?) . Pourquoi le 13 dans ReadFile ? j'aurai mi 5. quelle valeur retourne le readFile? souvent il retourne le nombre d'octet reçu, ce qui peut être interessant pour le debug. Tu peut essayer une boucle infini genre : While(ReadFile==0){ Envoie de demande de batterie reception du niveau attente de 10ms }fin while Dernière idée : peut être la reception de donnée est-elle mal initialisé. Salutation ! Char Snipeur |
merci beaucoup. Maintenant j'arrive a recevoir des donnees. Par exemple, j'envoie le BYTE 13 pour recevoir les infos de la courbes. Normalement je dois recevoir 1950 Bytes. Je fais un affichage de ce qu'il me retourne, avec un printf, mais il me donne que les 40 premiers Byte ( date heure, nom de l'enregistrement).
Quand je fais un affichage avec : hStdout=GetStdHandle(STD_OUTPUT_HANDLE); WriteFile(hStdout,buf2,1960,&nbecrit,NULL); Je vois qu'il y a bien 1950 caractere, mais apres le 40ieme caractere, il y a 4 espace et les caracteres suivant sont vraiment bizarres ( comme du martiens ou qqchose comme ca^^). Je redonne mon script si vous avez une idee : #include <vcl.h> #include <stdio.h> #include <string.h> #include <windows.h> #include <windef.h> #include <stdlib.h> #include <time.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int main() { HANDLE handle,hStdout; DCB dcb; COMMTIMEOUTS timeouts={0}; BOOL fSuccess; unsigned long nBytesRead; int NbOctet; int SortieRemoteMode=255; char c; int i,Indice; BOOL bResult,PortReady; char *buf2[2000]={0}; DWORD nblu,nbecrit; int aenvoyer2,; hStdout=GetStdHandle(STD_OUTPUT_HANDLE); /*--------------------------------------------------------------------*/ /* Ouverture du port de communication pour l'ANALYSEUR DE SPECTRE */ /*--------------------------------------------------------------------*/ handle = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE , // acces pour lire et ecrire sur le port 0, NULL, OPEN_EXISTING, 0, NULL ) ; /*-----------------------------------------------------------*/ /* Verifier si handle ouvert correctement */ /*-----------------------------------------------------------*/ if(handle == INVALID_HANDLE_VALUE) { printf("Impossible d'ouvrir le port (erreur %d)\n", GetLastError()); return 0; } /*-----------------------------------------------------------*/ /* Ajustement des parametres */ /*-----------------------------------------------------------*/ /* On prend les valeurs de configuration initiale*/ PortReady=SetupComm(handle,5000,5000); fSuccess = GetCommState(handle, &dcb); if (!fSuccess) { printf("probleme 2"); getchar(); } dcb.BaudRate = CBR_9600 ; /* vitesse */ dcb.ByteSize =8 ; /* nombre de bits */ dcb.Parity=NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fNull=FALSE; dcb.fRtsControl=RTS_CONTROL_DISABLE; dcb.fInX=FALSE; dcb.fOutX=FALSE; dcb.fDtrControl=DTR_CONTROL_DISABLE; /*-----------------------------------------------------------*/ /* on applique les changements au port COM1 */ /*-----------------------------------------------------------*/ PortReady=SetCommState(handle,&dcb); if(!SetCommState(handle,&dcb)) { printf("probleme 3"); getchar(); } /*-----------------------------------------------------------*/ /* Les timeouts */ /*-----------------------------------------------------------*/ timeouts.ReadIntervalTimeout=500; timeouts.ReadTotalTimeoutMultiplier=550; timeouts.ReadTotalTimeoutConstant=550; timeouts.WriteTotalTimeoutMultiplier=550; timeouts.WriteTotalTimeoutConstant=550; /* On applique ces changements au port COM1*/ SetCommTimeouts(handle,&timeouts); if(!SetCommTimeouts(handle,&timeouts)) { printf("Impossible d'initialiser les timeouts (erreur %d)\n", GetLastError()); return 0; } aenvoyer=13; WriteFile(handle,&aenvoyer,1,&nbecrit,NULL); ReadFile(handle,&buf2,1960,&nblu,NULL); printf("\n char2= %s \n ",&buf2[1]); WriteFile(hStdout,buf2,1960,&nbecrit,NULL); WriteFile(handle,&SortieRemoteMode,1,&nbecrit,NULL); CloseHandle(handle); CloseHandle(hStdout); return(fSuccess); } |
je ne connait pas ReadFile et WriteFile, mais je suppose que le fonctionnement doit être proche de cin et cout.
lorsqu'on fait cin>>var1; l'entrée au clavier contient des espaces, seul la partie avant le premier espace sera affecter à var1. Pour contourner le problème, il y a une option qui dit à cin d'ignorer les espaces comme marqueur de séparation. du genre cin.setflag("nblksp"); Je suppose qu'il doit exister une fonction/option similaire pour readfile. Sinon, au lieu d'ouvrir ton port en char, il faut l'ouvrir en binaire . Salutation ! Char Snipeur |
bonjour et merci ,
j'ai toujours pas resolu mon probleme, j'ai une petite idee mais je sais pas comment la coder en C++. Je recois le bon nombre de bytes que l'analyseur de spectre m'envoie, mais ils sont imcomprehensibles. Il les envoie sous forme de BYTE. Je voudrais donc les recevoir sous forme de BYTE et les mettre dans un fichier, mais je sais pas comment faire. Meme en declarant : BYTE *buf2[2000]={0}; et en faisant : ReadFile(handle,&buf2,1960,&nblu,NULL); WriteFile(hStdout,buf2,1960,&nbecrit,NULL); ca ne marche pas On m'a dit d'utiliser la fonction fprintf pour faire la conversion en 0xFF , mais je suis pas sur. Avez vous une idee ? Merci beaucoup Revoici mon programme : //--------------------------------------------------------------------------- #include <vcl.h> #include <stdio.h> #include <string.h> #include <windows.h> #include <windef.h> #include <stdlib.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int main() { HANDLE handle,hStdout,handle_FILE_TEXT; DCB dcb; COMMTIMEOUTS timeouts={0}; BOOL fSuccess; int ExitRemoteMode=255; int EnterRemoteModeNow=70; BOOL bResult,PortReady; BYTE*buf2[2000]={0}; DWORD nblu,nbecrit; int tosend2,tosend1; /*--------------------------------------------------------------------*/ /* Ouverture du port de communication pour l'ANALYSEUR DE SPECTRE */ /*--------------------------------------------------------------------*/ hStdout=GetStdHandle(STD_OUTPUT_HANDLE); handle_FILE_TEXT = CreateFile( "c:\\\\TEST.txt", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_SYSTEM, NULL ) ; if(handle_FILE_TEXT == INVALID_HANDLE_VALUE) { printf("Impossible to open the port (error %d)\n", GetLastError()); return 0; getchar(); } handle = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE , 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ; /*-----------------------------------------------------------*/ /* Verifier si handle ouvert correctement */ /*-----------------------------------------------------------*/ if(handle == INVALID_HANDLE_VALUE) { printf("Impossible to open the port (error %d)\n", GetLastError()); return 0; } /*-----------------------------------------------------------*/ /* Ajustement des parametres */ /*-----------------------------------------------------------*/ PortReady=SetupComm(handle,5000,5000); fSuccess = GetCommState(handle, &dcb); if (!fSuccess) { printf("problem 1"); getchar(); } dcb.BaudRate = CBR_9600 ; /* speed */ dcb.ByteSize =8 ; dcb.Parity=NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fNull=FALSE; dcb.fRtsControl=RTS_CONTROL_DISABLE; dcb.fInX=FALSE; dcb.fOutX=FALSE; dcb.fDtrControl=DTR_CONTROL_DISABLE; PortReady=SetCommState(handle,&dcb); if(!SetCommState(handle,&dcb)) { printf("problem 2"); getchar(); } /*-----------------------------------------------------------*/ /* Les timeouts */ /*-----------------------------------------------------------*/ timeouts.ReadIntervalTimeout=500; timeouts.ReadTotalTimeoutMultiplier=550; timeouts.ReadTotalTimeoutConstant=550; timeouts.WriteTotalTimeoutMultiplier=550; timeouts.WriteTotalTimeoutConstant=550; SetCommTimeouts(handle,&timeouts); if(!SetCommTimeouts(handle,&timeouts)) { printf("Problem for timeouts (erreur %d)\n", GetLastError()); return 0; } /*-----------------------------------------------------------*/ /* reception de donnees */ /*-----------------------------------------------------------*/ tosend1=17; tosend2=0; /* je dois lui envoyer une serie de byte pour lui dire de m'envoyer les !)% BYTE qui m'enteressent */ WriteFile(handle,&EnterRemoteModeNow,1,&nbecrit,NULL); WriteFile(handle,&tosend1,1,&nbecrit,NULL); WriteFile(handle,&tosend2,1,&nbecrit,NULL); /*Receive Data from the spectrum analyser*/ ReadFile(handle,&buf2,1998,&nblu,NULL); /*Write to the screen*/ WriteFile(hStdout,buf2,1998,&nbecrit,NULL); /* save in TEXT.txt what the spectrum analyser has sent*/ WriteFile(handle_FILE_TEXT,buf2,1998,&nbecrit,NULL); WriteFile(handle,&ExitRemoteMode,1,&nbecrit,NULL); CloseHandle(handle_FILE_TEXT); CloseHandle(handle); CloseHandle(hStdout); getchar(); return(fSuccess); } //--------------------------------------------------------------------------- et voila ce que je recois: оノテ€ ・ ォ? ヤ '・・・・・ ー #( ー#x~ ー#x~ ーGG・ ーGG・ ーk ーk ー朱 ー朱 ーイミ^ ー #( ー#x~ ー#x~ ーGG・ ーGG・ ーk ーk ー朱 ー朱 ーイミ^ ー u0 ・ c 2ネNone ー ゥ* 0 鰆 ・ ・ 赳 茴 鵈 諤 ・ ロフ 綛 豢 ・ 璧 牴 纔 絮 褸 ・ ・ ヨ, ・ ル ラャ ユ@ ・ 赶 罟 弴 籤 ン ゚タ 磑 ルク 籵 笨 ヤワ ゙P マワ 謖 跖 ユ| ・ ヨ レ ・ ロ リt ・ ユ 雕 ゚ ミ ヨx ヘ0 ・ ホシ ゙ ゙ 犇 レエ ・ レ< ハエ モ4 ラャ ミ` ゙4 リ ホX ワミ ワミ 濾 ・ ユ@ ワL ゙ー ラミ ・ ミp ヘ レネ ロ< ン モ、 ン レト ユ` ゚ ユー ン, ン ラ ヨ< ユ ミ8 レt ラ, メ€ ン ヘタ ヒ リャ ミ ロ ヨh ルp 菎 ン メ$ 犇 レ ン` レ、 ノト ンp 饅 リt ワ ユエ ユL モ モ ワ ラX ハ ムl ユ ロ( ルX モ 罧 ユ@ ゚( ゙ ヨp レ, ヨャ マ ロL マ< ロp レL ワ` レ ホD 猜 ラ ヒク ミヤ ルヤ ゙ヤ ゙ ヨ$ タ 网 ヨ ホ( ン ヤd ワ\ ロ ゚ ル ミフ ナ モ@ ミ マ| レd ロ< ロ ユタ 猜 フp レ ンネ ミ€ ホ ム ヌ€ リ ・ ムx モ ヘャ ゙ リ ナト ヨ レp ユ マ@ マl サp ハ ヤリ レP ム ロタ ラ@ ヨH ヒ ヤ` ヤL ム` ラ レ` ヘ8 ゚ マ< ラ ヨ\ ワ4 ・ フt ラx メィ ハ ル| ム ムャ モ ワ ヤP ニシ フエ ロ ラ, ロ$ ヤク フ ラP リ ヒ トー レ8 レ リt ンリ リ ハ リ ハ4 レ ゚ ヨl ワ\ ホ ・ ハ ユク ラ マ< ラ、 レシ ミ ヤ タh ノ ヘx ミL メ ・ モl ヌt リク ヒx ミ ルh リヤ ムィ ミp 瀾 螟 ム ヨ マP ム0 ラ リィ モH ンT ラ ヤH ムャ ル ユ\ ネ ン\ リ ヤ 罧 レ、 メp リク ユミ リ` ・ フワ メ ミリ メh ラ0 ユシ 蚪 マL メ ミ ・ レ ム ・ ヤ ユ レH マ< マ ヨ( ム ミ、 ツ 皃 ヤd 篶 ネ、 ホX ゚ ンワ マX ヤ ゙ク 畊 ヨト ルl ハd リ ゚D フh ミx リ ムエ ミ ムィ ム ヨク ルX ゙8 ノL ム レ レ レ マ ヨL ホp ラ8 ユt ヤ リフ ル ラィ モ ゙ ヨ ン\ ミ ミフ ナ€ ゚ ン ロ ヨ ワx ロト モト リ ユ ヒフ 酳 ムエ ミ ム0 ナh ヒ ムエ ヒ、 ユ@ トT ヨ< ムX ラ ルエ ン< メ レ モ0 |
Salut.
Sans conviction, essai : WriteFile(hStdout,(int*)buf2,1998,&nbecrit,NULL); decidement, j'aime pas toute cette écriture MS ! C'est quoi 'BYTE" ? ça taille. Les caractère que tu écri comporte des symboles asiatiques. Je suppose qu'il interprete donc ton buf2 comme de l'unicode, c'est à dire un nombre important de bits par caractère, et ça m'étonne que l'analyseur de spectre utilise un tel codage. j'ai aussi un doute sur l'utilisation de ReadFile et WriteFile. Je te conseil de faire un test de readfile sur un fichier, tu lis ce qu'il y a dedans et tu essai de voir si tu affiche bien. Parceque là, aux problèmes de programmation, on ajoute les problèmes de matériel... Salutation ! Char Snipeur |
bonjour,
alors j'ai resolu mon probleme , j'ai fait : //on met dans le buffer ReadFile(handle,&buf2,1998,&nblu,NULL); // et on envoie dans le fichier texte for (q=0; q<2000;q++) { os << hex << setw(2) << static_cast< int >(buf2[q]); } comme ca , ca marche, je recois par exemple: 32124 0 320a4 0 321 8 0 32234 0 32068 0 324e8 0 32064 0 32198 0 31fcc 0 324d8 et ca correspond bien a ce que je veux, des suite de nombres en hexadecimal que je convertis en decimal apres. Mais comme il y a toujours des probleme, il y a des trou dans certains paquets. Le pre;ier paquet est 32124 , le second 320a4 , mais pour le troisieme il y a un trou -->>321 8 . Du coup pour ecrire un programme qui converti les paquet, c'est un peu galere, car ca decale tout . Je sais pas tro pcomment faire. Vous connaissez pas une fonction qui met des 0 a la place des espace dans les fichiers texte ?? |
C'était bien un problème de type comme j'ai dit alors. ça touche au but ton truc.
une fonction qui met des zéro à la place des espaces, je connait pas, mais c'est enfantin à créer. J'ai pas compris ton histoire de trous... il manque un 0 entre 321 et 8, c'est ça? Salutation ! Char Snipeur |
32124 0 320a4 0 321 8 0 32234 0 32068 0 324e8 0 32064 0 32198 0 31fcc 0 324d8
oui, entre le 321 et le 8 il devrait y avoir un nombre ( ou a b c d e f ), car ca doit etre par paquet de 5, comme 320a4. En plus je devrais recevoir que des paquet de 5 nombre hexa. Hors la, il m'envoie un paquet de %, puis un 0, puis un paquet de 5 nombre hexa, puis un 0 etc... Sans compter les trou dans certain paquet de % comme je l'ai dit avant. Ca vient peut etre de ma fonction readfile sur COM1. Doit y avoir un probleme. Pour le vitesse de lecture, je suis sur que c'est du 9600 bauds, donc ca doit pas venir de la. C'est quoi les fonction avec les stream pour lire directement sur COM1, un truc du genre buf2 << COM1; Merci beaucoup :) |
?
qu'est-ce qui te dit que 321 n'est pas entier ? si tu as 00321, il n'affiche pas les zéros en début d'écriture ! Pour lire, c'est plutot COM1>>buf2. (stream>>variable) je sais pas sur le com à quelle niveau est le traitement d'erreur. En reseau IP, c'est traiter par la sous couche, en COM, il est possible que tu doive te taper cette gestion. il est possible que le 8 indique une erreur tandis que le 0 indique que tout c'est bien passer, et permet de séparer les paquets. Si tu as le 8 à chaque fois, c'est que c'est pas ça. (ou peu de chance) Enfin, ce ne sont que des conjecture, et ça manque de doc ton truc. Salutation ! Char Snipeur |
Bonjour tout le monde!
Je suis très intéressé par ce petit projet, j'ai aussi une mini appli qui devra faire appel à du matos sur port COM. Peut-on savoir ou ça en est? et ces "0" éparses... ca serait pas simplement les bits de stop mal interpètés? Es-tu sur que tu a configuré ton port pour le mode de communication de ton matériel? merci d'avance! |
| 21/04 14h23 | Suivi de ports (Port Mapping/forwarding) | Réseaux |
| 04/09 18h05 | Contrôleur hôte USB à haut/bas débit | USB |
| 13/05 00h49 | Clavier portable et caractères espagnols | Logiciels |
| 02/04 18h49 | Crack / Patch no-cd / Serial / Keygen | Sécurité |
| 10/10 10h00 | [Windows] Economiser les batteries d'un ordinateur portable | Ordinateur portable |
| 07/02 10h40 | VB.NET - Communication de ports | 2 |
| 06/12 08h36 | Communication mobile/ portable par cle DONGLE | 0 |
| 17/07 02h41 | Communication 2 ports series | 0 |
| 18/01 19h34 | Pbs communication par port serie | 0 |
![]() | Mobile 3GP Converter - Le programme "Mobile 3GP Converter" permet de convertir des fichiers au format 3GP (extension *.3gp ou *.3g2) vers un... | Catégorie: Edition vidéo Licence: Freeware/gratuit |
![]() | Crimson Editor - Crimson Editor est un éditeur professionnel de code source pour Windows. Ce programme, très léger en terme de taille,... | Catégorie: Webmaster Licence: Freeware/gratuit |
![]() | Pidgin Portable - Pidgin Portable est un client de messagerie instantanée multi-protocoles. Il travaille en AOL, ICQ, MSN et Yahoo. Vous... | Catégorie: Messagerie instantanée Licence: Open Source |
![]() | PSP Video 9 - PSP Video 9 est un outil de conversion gratuit permettant de convertir des fichiers vidéo (avi, divx, mpeg, etc.) au formats... | Catégorie: Edition vidéo Licence: Freeware/gratuit |
![]() | Cisco Catalyst/Enet Port Switch | Catégorie: Hub/Switch | 2,605.86 € PriceMinister |
![]() | Canon VC-C50i Communication Camera | Catégorie: Webcam | 776.23 € Digit-Photo.fr |
![]() | Canon VC-C50iR Communication Camera | Catégorie: Webcam | 812.11 € Digit-Photo.fr |
![]() | Cisco 24-Port 10/100 Mops | Catégorie: Hub/Switch | 444.90 € MicroChoix |