Licence Pro SIRI Année 2010 2011 UE1 : Architecture Travaux Dirigés Programmation de la liaison série A. Programmation au niveau du composant 1. Définition des adresses des différents registres Si l adresse de base de COM1 est égale à 0x3F8 et celle de COM2 à 0x2F8, donnez l adresse des registres accessibles indiqués dans le cours. Présentez vos résultats sous la forme d un tableau. 2. Accès aux différents registres En utilisant HyperTerminal, configurer la liaison série avec les caractéristiques suivantes 9600, parité paire, 1 bit de stop, 7 bits de données et aucun contrôle de flux. Relevez le contenu des registres du composant en utilisant l outil debug en ligne de commande. Rappel : i 3F8 permet de lire le registre en 0x3F8 o 3F8,00 permet d écrire 00 dans le registre en Ox3F8 Toutes les valeurs sont en hexadécimales Comparez vos résultats avec ceux proposés dans le cours. Concluez et Relevez différentes vitesses. Programmez le composant avec debug avec les caractéristiques suivantes : 4800, parité impaire, 2 bits de stop, 8 bits de données et aucun contrôle de flux. Vérifiez votre programmation en utilisant la valeur par défaut dans la configuration d HyperTerminal. TD Programmation de la liaison série page 1
B. Communication série avec le SDK Windows 3. Complétez le programme d exemple pour l initialisation #include <windows.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) DCB dcb; HANDLE hcom; BOOL fsuccess; char *pccommport = "COM1"; hcom = CreateFile (... ); if (hcom ==... ) printf ("CreateFile failed with error %d.\n", GetLastError()); return (1); If(!GetCommState(... )) printf ("GetCommState failed with error %d.\n", GetLastError()); return (2); dcb.baudrate =... // 9600 bits / secondes dcb.bytesize =... // 8 bits de données dcb.parity =... // Parité paire dcb.stopbits =... // Un bit de stop if(!setcommstate(... )) printf ("SetCommState failed with error %d.\n", GetLastError()); return (3); printf ("Serial port %s successfully reconfigured.\n", pccommport); return (0); 4. Lecture et Ecriture d un tampon sur le port série Compléter le code pour la lecture et l écriture d un tampon #include <windows.h> int LireCom(char * tampon, HANDLE hcom) int nbbytealire ; long nbbytelus ; int result; TD Programmation de la liaison série page 2
// se bloque sur une opération de lecture result = ReadFile(......... ) ; // Check for end of file. if (... ) // this is the end of the file return result ; int EcrireCom(char * tampon, HANDLE hcom) int result; long nbbyteecrit; long nbbyteaecrire; result = WriteFile(............. ); return result; C. Programmation avec MsComm 5. Installation du composant ActiveX MsComm (s-il ne l est pas déjà!) a) Copier MSComm32.OCX dans c:\windows\system32 b) Lancer en ligne de commande : regsvr32 MSComm32.OCX pour enregistrer le contrôle ActiveX c) Mettre à jour la base de registre en double cliquant sur vb6controls.reg ou en utilisant en ligne de commande regedit puis importer vb6controls.reg 6. Utilisation du composant ActiveX MsComm Sous Visual studio réalisez un projet Windows nommé TestLCB utilisant les MFC sur la base d une boîte de dialogue. Comme le montre les figures suivantes : TD Programmation de la liaison série page 3
Complétez la boîte de dialogue comme le montre les figures suivantes : Contrôle ActiveX Microsoft Communication Control MSComm Zone d'édition Propriétés : IDC_EDIT_CODE_BARRES Lecture seule Configurer le contrôle ActiveX pour une liaison série correspondant aux caractéristiques de votre lecteur de code à Barres en modifiant ces propriétés. Ajouter une variable associée à la zone d édition et une autre au composant ActiveX MsComm puis associez un événement au contrôle ActiveX comme l indique les figures suivantes : Dans la méthode BOOL CTestLCBDlg::OnInitDialog(), complétez le code afin d ouvrir le port en utilisant la propriété : put_portopen TD Programmation de la liaison série page 4
Complétez le code de la méthode comme le montre l extrait du programme suivant : void CTestLCBDlg::OnCommMscomm1() COleVariant monvariant ; monvariant = m_mscomm.get_input(); CString Text(monVariant.bstrVal); m_editcodebarres = Text; UpdateData(FALSE); Le code à Barres s affiche t il correctement? Commpléter en testant l événement qui a déclenché la méthode en utilisant : short Evenement = m_mscomm.get_commevent() ; Quelle est la valeur de cet événement? Déterminez la constante correspondante et complétez le code de la méthode pour afficher correctement le code à barres. Vous pouvez ajouter un bouton pour effacer la zone d édition avec la méthode : m_editcodebarres.empty(); En étudiant la classe CString supprimez le retour chariot à la fin de la chaine composant le code à barres avant de l afficher. TD Programmation de la liaison série page 5