Code source permettant d'établir une communication par liaison série RS232 (compatible avec Windows uniquement)
Si vous utilisez Visual Studio, il y a un paramètre essentiel à régler, au quel cas, le code ci-dessous ne fonctionnera pas.
Dans l'explorateur de solutions, faites un clic droit sur votre projet, puis allez dans Propriétés -> Panneau de configuration -> Général -> Jeu de caractères, sélectionner le second choix à savoir Utiliser le jeu de caractères multioctet.
PortSerie.h
#ifndef __PortSerie_H__
#define __PortSerie_H__
#include <windows.h>
#include <winbase.h>
class CPortSerie{
private:
HANDLE m_hComm;
DCB m_OldConfig;
DCB m_NewConfig;
public:
CPortSerie(void);
~CPortSerie(void);
bool open(const char* com, DWORD vitesse, BYTE NbreBits, BYTE parite, BYTE BitDeStop);
void close();
bool send(LPVOID Trame, DWORD NbreCaract);
DWORD receive(LPVOID Trame, DWORD NbreCaract);
};
#endif
PortSerie.cpp
#include "StdAfx.h"
#include "PortSerie.h"
CPortSerie::CPortSerie(void){}
CPortSerie::~CPortSerie(void){}
bool CPortSerie::open(const char* com, DWORD vitesse, BYTE NbreBits, BYTE parite, BYTE BitDeStop){
m_hComm = CreateFile(com, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(m_hComm == INVALID_HANDLE_VALUE){
return false;
}
else{
GetCommState(m_hComm, &m_OldConfig);
GetCommState(m_hComm, &m_NewConfig);
m_NewConfig.BaudRate = vitesse;
m_NewConfig.ByteSize = NbreBits;
m_NewConfig.StopBits = BitDeStop;
m_NewConfig.Parity = parite;
SetCommState(m_hComm, &m_NewConfig);
}
return true;
}
void CPortSerie::close(){
GetCommState(m_hComm, &m_OldConfig);
CloseHandle(m_hComm);
}
bool CPortSerie::send(LPVOID Trame, DWORD NbreCaract){
unsigned long dd;
bool test;
test = WriteFile(m_hComm, Trame, NbreCaract, &dd, NULL);
if(test == true){
return true;
}
if(test == false){
return false;
}
}
DWORD CPortSerie::receive(LPVOID Trame, DWORD NbreCaract){
unsigned long dd;
bool test;
test = ReadFile(m_hComm, Trame, NbreCaract, &dd, NULL);
return dd;
}
main.cpp
#include "stdafx.h"
#include <iostream>
#include "PortSerie.h"
#include <windows.h>
#include <winbase.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CPortSerie myPort;
int iChoix;
char* Chaine = NULL;
Chaine = new char[64];
DWORD NbreCaract;
DWORD NbreCaractRecu;
DWORD vitesse = CBR_9600;
BYTE NbreBits = 8;
BYTE parite = EVENPARITY;
BYTE BitDeStop = ONESTOPBIT;
if(myPort.open("COM1", vitesse, NbreBits, parite, BitDeStop) == 0){
cout<<"erreur ouverture"<<endl;
}
else{
do{
char* Chaine = NULL;
Chaine = new char[64];
cout<<endl<<" === Menu ==="<<endl;
cout<<" 1. Recevoir des caracteres"<<endl;
cout<<" 2. Envoyer des caracteres"<<endl;
cout<<" 3. Quitter"<<endl;
cin>>iChoix;
switch(iChoix){
case 1 :
cout<<endl<<"Reception de donnees"<<endl<<endl;
NbreCaractRecu = myPort.receive(Chaine, 64);
Chaine[NbreCaractRecu] = '\0';
cout<<"Contenu de la chaine : "<<Chaine<<endl;
break;
case 2 :
cout<<endl<<"Emission de donnees"<<endl<<endl;
cout<<"Entrez une chaine de caractere : ";
cin>>Chaine;
//cin.getline(Chaine, 64);
NbreCaract = strlen(Chaine);
myPort.send(Chaine, NbreCaract);
break;
case 3 :
myPort.close();
break;
}
}while(iChoix != 3);
}
delete[] Chaine;
system("pause");
return 0;
}
Note
Il est possible d'utiliser la liaison série sans l'aide de librairie ou quoique ce soit d'autre(mis à part le driver si il y en a pour reconnaître périphérique) pour communiquer avec les périphériques adaptés à ce type de communication.
Vous pouvez utiliser la liaison série à partir du moment où vous connaissez le protocole de communication qu'il y a entre le périphérique et votre ordinateur. Au quel cas une librairie dynamique (Windows) ou librairie serait nécessaire pour que la communication se fasse correctement.