270 lines
6.3 KiB
C++
270 lines
6.3 KiB
C++
/*!
|
|
\file serialib.h
|
|
\brief Header file of the class serialib. This class is used for communication over a serial device.
|
|
\author Philippe Lucidarme (University of Angers)
|
|
\version 2.0
|
|
\date december the 27th of 2019
|
|
This Serial library is used to communicate through serial port.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM,
|
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
This is a licence-free software, it can be used by anyone who try to build a better world.
|
|
*/
|
|
|
|
|
|
#ifndef SERIALIB_H
|
|
#define SERIALIB_H
|
|
|
|
#if defined(__CYGWIN__)
|
|
// This is Cygwin special case
|
|
#include <sys/time.h>
|
|
#endif
|
|
|
|
// Include for windows
|
|
#if defined (_WIN32) || defined (_WIN64)
|
|
#if defined(__GNUC__)
|
|
// This is MinGW special case
|
|
#include <sys/time.h>
|
|
#else
|
|
// sys/time.h does not exist on "actual" Windows
|
|
#define NO_POSIX_TIME
|
|
#endif
|
|
// Accessing to the serial port under Windows
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
// Include for Linux
|
|
#if defined (__linux__) || defined(__APPLE__)
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
#include <sys/shm.h>
|
|
#include <termios.h>
|
|
#include <string.h>
|
|
#include <iostream>
|
|
#include <sys/time.h>
|
|
// File control definitions
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/ioctl.h>
|
|
#endif
|
|
|
|
/*! To avoid unused parameters */
|
|
#define UNUSED(x) (void)(x)
|
|
|
|
/**
|
|
* number of serial data bits
|
|
*/
|
|
enum SerialDataBits {
|
|
SERIAL_DATABITS_5, /**< 5 databits */
|
|
SERIAL_DATABITS_6, /**< 6 databits */
|
|
SERIAL_DATABITS_7, /**< 7 databits */
|
|
SERIAL_DATABITS_8, /**< 8 databits */
|
|
SERIAL_DATABITS_16, /**< 16 databits */
|
|
};
|
|
|
|
/**
|
|
* number of serial stop bits
|
|
*/
|
|
enum SerialStopBits {
|
|
SERIAL_STOPBITS_1, /**< 1 stop bit */
|
|
SERIAL_STOPBITS_1_5, /**< 1.5 stop bits */
|
|
SERIAL_STOPBITS_2, /**< 2 stop bits */
|
|
};
|
|
|
|
/**
|
|
* type of serial parity bits
|
|
*/
|
|
enum SerialParity {
|
|
SERIAL_PARITY_NONE, /**< no parity bit */
|
|
SERIAL_PARITY_EVEN, /**< even parity bit */
|
|
SERIAL_PARITY_ODD, /**< odd parity bit */
|
|
SERIAL_PARITY_MARK, /**< mark parity */
|
|
SERIAL_PARITY_SPACE /**< space bit */
|
|
};
|
|
|
|
/*! \class serialib
|
|
\brief This class is used for communication over a serial device.
|
|
*/
|
|
class serialib
|
|
{
|
|
public:
|
|
|
|
//_____________________________________
|
|
// ::: Constructors and destructors :::
|
|
|
|
|
|
|
|
// Constructor of the class
|
|
serialib ();
|
|
|
|
// Destructor
|
|
~serialib ();
|
|
|
|
|
|
|
|
//_________________________________________
|
|
// ::: Configuration and initialization :::
|
|
|
|
|
|
// Open a device
|
|
char openDevice(const char *Device, const unsigned int Bauds,
|
|
SerialDataBits Databits = SERIAL_DATABITS_8,
|
|
SerialParity Parity = SERIAL_PARITY_NONE,
|
|
SerialStopBits Stopbits = SERIAL_STOPBITS_1);
|
|
|
|
// Check device opening state
|
|
bool isDeviceOpen();
|
|
|
|
// Close the current device
|
|
void closeDevice();
|
|
|
|
|
|
|
|
|
|
//___________________________________________
|
|
// ::: Read/Write operation on characters :::
|
|
|
|
|
|
// Write a char
|
|
int writeChar (char);
|
|
|
|
// Read a char (with timeout)
|
|
int readChar (char *pByte,const unsigned int timeOut_ms=0);
|
|
|
|
|
|
|
|
|
|
//________________________________________
|
|
// ::: Read/Write operation on strings :::
|
|
|
|
|
|
// Write a string
|
|
int writeString (const char *String);
|
|
|
|
// Read a string (with timeout)
|
|
int readString ( char *receivedString,
|
|
char finalChar,
|
|
unsigned int maxNbBytes,
|
|
const unsigned int timeOut_ms=0);
|
|
|
|
|
|
|
|
// _____________________________________
|
|
// ::: Read/Write operation on bytes :::
|
|
|
|
|
|
// Write an array of bytes
|
|
int writeBytes (const void *Buffer, const unsigned int NbBytes);
|
|
|
|
// Read an array of byte (with timeout)
|
|
int readBytes (void *buffer,unsigned int maxNbBytes,const unsigned int timeOut_ms=0, unsigned int sleepDuration_us=100);
|
|
|
|
|
|
|
|
|
|
// _________________________
|
|
// ::: Special operation :::
|
|
|
|
|
|
// Empty the received buffer
|
|
char flushReceiver();
|
|
|
|
// Return the number of bytes in the received buffer
|
|
int available();
|
|
|
|
|
|
|
|
|
|
// _________________________
|
|
// ::: Access to IO bits :::
|
|
|
|
|
|
// Set CTR status (Data Terminal Ready, pin 4)
|
|
bool DTR(bool status);
|
|
bool setDTR();
|
|
bool clearDTR();
|
|
|
|
// Set RTS status (Request To Send, pin 7)
|
|
bool RTS(bool status);
|
|
bool setRTS();
|
|
bool clearRTS();
|
|
|
|
// Get RI status (Ring Indicator, pin 9)
|
|
bool isRI();
|
|
|
|
// Get DCD status (Data Carrier Detect, pin 1)
|
|
bool isDCD();
|
|
|
|
// Get CTS status (Clear To Send, pin 8)
|
|
bool isCTS();
|
|
|
|
// Get DSR status (Data Set Ready, pin 9)
|
|
bool isDSR();
|
|
|
|
// Get RTS status (Request To Send, pin 7)
|
|
bool isRTS();
|
|
|
|
// Get CTR status (Data Terminal Ready, pin 4)
|
|
bool isDTR();
|
|
|
|
|
|
private:
|
|
// Read a string (no timeout)
|
|
int readStringNoTimeOut (char *String,char FinalChar,unsigned int MaxNbBytes);
|
|
|
|
// Current DTR and RTS state (can't be read on WIndows)
|
|
bool currentStateRTS;
|
|
bool currentStateDTR;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_WIN32) || defined( _WIN64)
|
|
// Handle on serial device
|
|
HANDLE hSerial;
|
|
// For setting serial port timeouts
|
|
COMMTIMEOUTS timeouts;
|
|
#endif
|
|
#if defined (__linux__) || defined(__APPLE__)
|
|
int fd;
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
/*! \class timeOut
|
|
\brief This class can manage a timer which is used as a timeout.
|
|
*/
|
|
// Class timeOut
|
|
class timeOut
|
|
{
|
|
public:
|
|
|
|
// Constructor
|
|
timeOut();
|
|
|
|
// Init the timer
|
|
void initTimer();
|
|
|
|
// Return the elapsed time since initialization
|
|
unsigned long int elapsedTime_ms();
|
|
|
|
private:
|
|
#if defined (NO_POSIX_TIME)
|
|
// Used to store the previous time (for computing timeout)
|
|
LONGLONG counterFrequency;
|
|
LONGLONG previousTime;
|
|
#else
|
|
// Used to store the previous time (for computing timeout)
|
|
struct timeval previousTime;
|
|
#endif
|
|
};
|
|
|
|
#endif // serialib_H
|