36 votes

Connexion du port série (RS -232) en C++

J'ai réalisé la connexion du port série RS-232 en C++ à l'aide d'un compilateur 16 bits (j'utilisais l'IDE Turbo C++). Il comprenait le fichier d'en-tête bios.h qui contiennent toutes les fonctions nécessaires à la lecture des valeurs du port. Maintenant je veux lire la valeur du port série en utilisant le compilateur C++ 32-bit Mingw. J'utilise Dev CPP comme IDE. Ici, je n'ai pas pu trouver bios.h . Existe-t-il des fichiers d'en-tête spéciaux disponibles à cet effet dans Mingw ? J'utilise le compilateur 32 bits maintenant parce que dans mon projet universitaire, je dois utiliser la gestion des exceptions qui, je suppose, n'est pas prise en charge par Turbo C. Veuillez m'aider.

62voto

ollo Points 8620

Jetez un coup d'œil ici :

1) Vous pouvez l'utiliser aussi bien avec Windows (y compris MinGW) qu'avec Linux. Alternativement, vous ne pouvez utiliser le code qu'à titre d'exemple.

2) Tutoriel étape par étape sur l'utilisation des ports série sous Windows

3) Vous pouvez l'utiliser littéralement sur MinGW

Voici un code très, très simple (sans aucune gestion des erreurs ni aucun paramètre) :

#include <windows.h>

/* ... */

// Open serial port
HANDLE serialHandle;

serialHandle = CreateFile("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

// Do some basic settings
DCB serialParams = { 0 };
serialParams.DCBlength = sizeof(serialParams);

GetCommState(serialHandle, &serialParams);
serialParams.BaudRate = baudrate;
serialParams.ByteSize = byteSize;
serialParams.StopBits = stopBits;
serialParams.Parity = parity;
SetCommState(serialHandle, &serialParams);

// Set timeouts
COMMTIMEOUTS timeout = { 0 };
timeout.ReadIntervalTimeout = 50;
timeout.ReadTotalTimeoutConstant = 50;
timeout.ReadTotalTimeoutMultiplier = 50;
timeout.WriteTotalTimeoutConstant = 50;
timeout.WriteTotalTimeoutMultiplier = 10;

SetCommTimeouts(serialHandle, &timeout);

Vous pouvez maintenant utiliser WriteFile() / ReadFile() pour écrire/lire des octets. N'oubliez pas de fermer votre connexion :

CloseHandle(serialHandle);

3voto

Mi Po Points 73

Pour la réponse ci-dessus, le port série par défaut est

        serialParams.BaudRate = 9600;
        serialParams.ByteSize = 8;
        serialParams.StopBits = TWOSTOPBITS;
        serialParams.Parity = NOPARITY;

3voto

Chris Points 31

Ou vous pouvez simplement utiliser boost::asio::serial_port !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X