Files

611 lines
28 KiB
C

//**********************************************************************************************************************************************************************************
// Fichier SERIAL.C
//
// Contient toutes les fonctions liées aux ports série
//
//**********************************************************************************************************************************************************************************/
// Includes :
#include "main.h"
// Prototypes :
void gestion_rx_serial0(void);
void gestion_rx_serial1(void);
int init_serial0(void);
int init_serial1(void);
// Variables globales :
struct Struct_config_serial config_serial0;
struct Struct_config_serial config_serial1;
struct Struct_serial serial0;
struct Struct_serial serial1;
/**********************************************************************************************************************************************************************************
Fonction gestion_rx_serial0
Fonction de réception des caractères provenant de Serial0 et leur enregistrement dans un buffer tournant (avec gestion de dépassement si 'ptr_fin' rattrape 'ptr_début')
Ce port SERIAL 0 est affecté au M-Bus sur les CM3P (ShipBase V1)
Ce port SERIAL 0 est affecté au GNSS sur les CM4 (ShipBase V2)
**********************************************************************************************************************************************************************************/
void gestion_rx_serial0(void)
{
uint16_t i;
uint8_t tmp_rx_buffer[MAX_TAILLE_TMP_RX_BUFFER_UART];
int16_t lg_tmp_rx_buffer;
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
if ((config_serial0.validite == 1) && (config_serial0.filestream != -1))
{
lg_tmp_rx_buffer = read(config_serial0.filestream, tmp_rx_buffer, MAX_TAILLE_TMP_RX_BUFFER_UART); //Filestream, buffer to store in, number of bytes to read (max)
if (lg_tmp_rx_buffer > 0)
{
for (i=0; i<lg_tmp_rx_buffer; i++)
{
if (++ serial0.ptr_fin_buffer_rx == MAX_TAILLE_RX_BUFFER_UART) serial0.ptr_fin_buffer_rx = 0; // Recherche de la prochaine position dans le buffer.
if (serial0.ptr_fin_buffer_rx != serial0.ptr_debut_buffer_rx) // Cas où le buffer de réception n'est pas plein :
{
serial0.buffer_rx[serial0.ptr_fin_buffer_rx] = tmp_rx_buffer[i];
}
else // Cas où le buffer de réception est plein (car la fin rattrape le début) :
{
// Enregistrement log :
sprintf(tmp, "Buffer de réception de l'UART0 plein. Ecriture impossible...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
// Enregistrement dans l'historique :
// SDIR #84 : pour éviter de remplir l'historique Système dans le cas où l'appli est bloquée pendant un archivage par exemple.
// Il faudra voir s'il est possible de le remettre en fonctionnement après avoir vérifié que l'ajout du break ci-dessous limite le nombre d'entrées
// dans l'historique en cas de pb.
// enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_UART_BUFFER_RX_PLEIN, 0, 0, NULL);
// Repositionnement du ptr_fin_buffer_rx à sa valeur précédente :
if (serial0.ptr_fin_buffer_rx != 0) serial0.ptr_fin_buffer_rx --;
else serial0.ptr_fin_buffer_rx = MAX_TAILLE_RX_BUFFER_UART - 1;
break; // SDIR #84. Si le buffer est plein, il est inutile d'essayer de loger les autres caractères lus dans le driver... Cela évite de dupliquer plus que nécessaires les messages d'erreur...
}
}
}
}
}
/**********************************************************************************************************************************************************************************
Fonction gestion_rx_serial1
Fonction de réception des caractères provenant de l'UART1 (serial1) et leur enregistrement dans un buffer tournant
(avec gestion de dépassement si 'ptr_fin' rattrape 'ptr_début')
Ce port SERIAL 1 est affecté à C-Bus sur les CM3P (ShipBase V1)
Ce port SERIAL 1 est affecté à C-Bus sur les CM4 (ShipBase V2)
**********************************************************************************************************************************************************************************/
void gestion_rx_serial1(void)
{
uint16_t i;
uint8_t tmp_rx_buffer[MAX_TAILLE_TMP_RX_BUFFER_UART];
int16_t lg_tmp_rx_buffer;
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
if ((config_serial1.validite == 1) && (config_serial1.filestream != -1))
{
lg_tmp_rx_buffer = read(config_serial1.filestream, tmp_rx_buffer, MAX_TAILLE_TMP_RX_BUFFER_UART); //Filestream, buffer to store in, number of bytes to read (max)
if (lg_tmp_rx_buffer > 0)
{
for (i=0; i<lg_tmp_rx_buffer; i++)
{
if (++ serial1.ptr_fin_buffer_rx == MAX_TAILLE_RX_BUFFER_UART) serial1.ptr_fin_buffer_rx = 0; // Recherche de la prochaine position dans le buffer.
if (serial1.ptr_fin_buffer_rx != serial1.ptr_debut_buffer_rx) // Cas où le buffer de réception n'est pas plein :
{
serial1.buffer_rx[serial1.ptr_fin_buffer_rx] = tmp_rx_buffer[i];
}
else // Cas où le buffer de réception est plein (car la fin rattrape le début) :
{
// Enregistrement log :
sprintf(tmp, "Buffer de réception de l'UART1 plein. Ecriture impossible...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
// Enregistrement dans l'historique :
// SDIR #84 : pour éviter de remplir l'historique Système dans le cas où l'appli est bloquée pendant un archivage par exemple.
// Il faudra voir s'il est possible de le remettre en fonctionnement après avoir vérifié que l'ajout du break ci-dessous limite le nombre d'entrées
// dans l'historique en cas de pb.
// enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_UART_BUFFER_RX_PLEIN, 0, 1, NULL);
// Repositionnement du ptr_fin_buffer_rx à sa valeur précédente :
if (serial1.ptr_fin_buffer_rx != 0) serial1.ptr_fin_buffer_rx --;
else serial1.ptr_fin_buffer_rx = MAX_TAILLE_RX_BUFFER_UART - 1;
break; // SDIR #84. Si le buffer est plein, il est inutile d'essayer de loger les autres caractères lus dans le driver... Cela évite de dupliquer plus que nécessaires les messages d'erreur...
}
}
}
}
}
/**********************************************************************************************************************************************************************************
Fonction init_serial0
Fonction d'initialisation de l'UART0
**********************************************************************************************************************************************************************************/
int init_serial0(void)
{
char chaine_temp[MAX_TAILLE_CHAINE_TEMP_UARTS];
struct termios options;
speed_t speed;
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
// Paramètres de configuration (en dur car inutile de les importer de la BDD) :
config_serial0.validite = 1;
config_serial0.vitesse = 9600; // 1200 à 115200
config_serial0.longueur = 8; // 7 ou 8
config_serial0.parite = 0; // 0=No, 1=Odd et 2=Even
config_serial0.stops = 1; // 1 ou 2
if (config_serial0.validite == 1) // Cas où la config en cours prévoit l'utilisation de l'UART0 :
{
config_serial0.filestream = -1;
sprintf(tmp, "Initialisation de l'UART0 (");
config_serial0.filestream = open("/dev/serial0", O_RDWR | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode
// O_NDELAY / O_NONBLOCK (same function) - Enables nonblocking mode. When set read requests on the file can return immediately with a failure status
// if there is no input immediately available (instead of blocking). Likewise, write requests can also return
// immediately with a failure status if the output can't be written immediately.
// O_NOCTTY - When set and path identifies a terminal device, open() shall not cause the terminal device to become the controlling terminal for the process.
if (config_serial0.filestream != -1)
{
//The flags (defined in /usr/include/termios.h - see http://pubs.opengroup.org/onlinepubs/007908799/xsh/termios.h.html):
// Baud rate:- B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000
// CSIZE:- CS5, CS6, CS7, CS8
// CLOCAL - Ignore modem status lines
// CREAD - Enable receiver
// IGNPAR = Ignore characters with parity errors
// ICRNL - Map CR to NL on input (Use for ASCII comms where you want to auto correct end of line characters - don't use for binary comms!)
// PARENB - Parity enable
// PARODD - Odd parity (else even)
//--------------------------------------------------------------------------------------------------------------------------------
// Lecture de la configuration en cours => variable locale options :
if (tcgetattr(config_serial0.filestream, &options) < 0)
{
sprintf(tmp, "Initialisation de l'UART0 impossible : erreur lors de lecture des paramètres du port...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
//--------------------------------------------------------------------------------------------------------------------------------
// Mise à jour des paramètres non configurables dans la BDD :
// Configuration du registre 'cflag' :
// options.c_cflag = 0;
options.c_cflag |= CLOCAL; // Ignore modem status lines
options.c_cflag |= CREAD; // Enable receiver
options.c_cflag &= ~CRTSCTS; // no hardware flowcontrol
// options.c_cflag |= CMSPAR; // force Even parity to SPACE
// Configuration du registre 'lflag' :
// options.c_lflag = 0;
options.c_lflag &= ~ECHO;
options.c_lflag &= ~ECHOE;
options.c_lflag &= ~ECHONL;
options.c_lflag &= ~ICANON;
options.c_lflag &= ~ISIG;
options.c_lflag &= ~IEXTEN;
// Configuration du registre 'iflag' :
// options.c_iflag = 0;
options.c_iflag &= ~IGNCR; // preserve carriage return
options.c_iflag &= ~INLCR; // Don't map NL to CR on input
options.c_iflag &= ~ICRNL; // Don't map CR to NL on input
options.c_iflag &= ~IUCLC; // Don't map upper-case to lower-case on input
options.c_iflag &= ~IUCLC; // Don't convert uppecase to lowercase on input
options.c_iflag &= ~IMAXBEL; // Don't beep on reception as input buffer is full
options.c_iflag &= ~IXANY; // Don't enable any character to restart outputno SW flowcontrol
options.c_iflag &= ~IXON; // Don't enable start output control
options.c_iflag &= ~IXOFF; // Don't enable stop output control (attention : doc pas très claire entre Xon et Xoff)
options.c_iflag |= IGNBRK; // ignore breaks
options.c_iflag &= ~ISTRIP; // Don't clear MSB (b8) on input
options.c_iflag &= ~IGNPAR; // Don't ignore (check) parity errors
options.c_iflag |= INPCK; // test parity
options.c_iflag &= ~PARMRK; // Don't use verbose parity error (Signaler les erreurs de parité par une séquence 255-0-car. )
// Configuration du registre 'oflag' :
options.c_oflag &= ~OPOST; // Don't use post-process output (?)
// Configuration des caractères de contrôle 'c_cc' :
// options.c_cc[VEOL] = 0;
// options.c_cc[VEOL2] = 0;
// options.c_cc[VEOF] = 0x04;
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation de la vitesse de communication :
switch(config_serial0.vitesse)
{
case 1200: { speed = B1200; break; }
case 2400: { speed = B2400; break; }
case 4800: { speed = B4800; break; }
case 9600: { speed = B9600; break; }
case 19200: { speed = B19200; break; }
case 38400: { speed = B38400; break; }
case 57600: { speed = B57600; break; }
case 115200: { speed = B115200; break; }
case 921600 : { speed = B921600; break; }
default :
{
sprintf(tmp, "\tInitialisation de l'UART0 impossible : vitesse de communication non valide (%i b/s) ...", config_serial0.vitesse);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
// Mise à jour de la valeur dans la structure :
cfsetospeed(&options, speed);
cfsetispeed(&options, speed);
// Mise à jour du message de configuration :
sprintf(chaine_temp, "%i b/s", config_serial0.vitesse);
strcat(tmp, chaine_temp);
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation du nombre de bits de données :
options.c_cflag &= ~CSIZE; // RAZ des bits concernés
switch(config_serial0.longueur)
{
case 8: { options.c_cflag |= CS8; break; }
case 7: { options.c_cflag |= CS7; break; }
case 6: { options.c_cflag |= CS6; break; }
case 5: { options.c_cflag |= CS5; break; }
default :
{
sprintf(tmp, "Initialisation de l'UART0 impossible : nombre de bits de données non valide (%i bits) ...", config_serial0.longueur);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
// Mise à jour du message de configuration :
sprintf(chaine_temp, ", %i bits", config_serial0.longueur);
strcat(tmp, chaine_temp);
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation de la parité :
// ATTENTION : les tests de parité ne semblent pas fonctionner !!! Leur configuration ne semble avoir aucun effet (pas d'erreur générée).
switch(config_serial0.parite)
{
case 0: // Pas de parité :
{
options.c_cflag &= ~PARENB; /* Disable parity */
strcat(tmp, ", pas de parité");
break;
}
case 1: // Parité impaire :
{
options.c_cflag |= PARENB; // Parité validée
options.c_cflag |= PARODD; /* Odd parity */
strcat(tmp, ", parité impaire");
break;
}
case 2: // Parité paire :
{
options.c_cflag |= PARENB; // Parité validée
options.c_cflag &= ~PARODD; /* Even parity */
strcat(tmp, ", parité paire");
break;
}
default :
{
sprintf(tmp, "\tInitialisation de l'UART0 impossible : parité non valide (%i) ...", config_serial0.parite);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation du nombre de bits de stop :
switch(config_serial0.stops)
{
case 1:
{
options.c_cflag &= ~CSTOPB; /* only need 1 stop bit */
strcat(tmp, ", un bit de stop");
break;
}
case 2:
{
options.c_cflag |= CSTOPB; /* activate double stop bits */
strcat(tmp, ", deux bits de stop");
break;
}
default :
{
sprintf(tmp, "Initialisation de l'UART0 impossible : nombre de bits de stop non valide (%i) ...", config_serial0.stops);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
//--------------------------------------------------------------------------------------------------------------------------------
// Mise à jour des nouveaux paramètres :
tcsetattr(config_serial0.filestream, TCSANOW, &options); // Mise à jour des nouvelles valeurs de configuration (depuis 'options')
delai_dixieme_sec(2); // Délai nécessaire pour que le flush fonctionne (testé avec délai = 1 : Ok)
tcflush(config_serial0.filestream, TCIOFLUSH); // Vidage du port (en Inputs et en Ouptuts)
//--------------------------------------------------------------------------------------------------------------------------------
// Finalisation du message de débug :
strcat(tmp, ")\t: OK");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_OK);
return(0);
}
else // Cas où l'ouverture du port ne s'est pas passée correctement :
{
sprintf(tmp, "Initialisation de l'UART0 impossible : erreur lors de l'ouverture du port...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
else // L'UART n'est pas validé :
{
sprintf(tmp, "La configuration en cours ne prévoit pas l'utilisation de l'UART0 (la configuration de celui-ci n'a pas été affectée par l'application)...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_WARNING);
return(0); // On ne considère pas cela comme une erreur et l'init peut continuer.
}
}
/**********************************************************************************************************************************************************************************
Fonction init_serial1
Fonction d'initialisation de la liaison 'serial1'.
**********************************************************************************************************************************************************************************/
int init_serial1(void)
{
char chaine_temp[MAX_TAILLE_CHAINE_TEMP_UARTS];
struct termios options;
speed_t speed;
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
// Paramètres de configuration (en dur car inutile de les importer de la BDD) :
config_serial1.validite = 1;
config_serial1.vitesse = 115200; // 1200 à 115200
config_serial1.longueur = 8; // 7 ou 8
config_serial1.parite = 0; // 0=No, 1=Odd et 2=Even
config_serial1.stops = 1; // 1 ou 2
if (config_serial1.validite == 1) // Cas où la config en cours prévoit l'utilisation de l'UART1 :
{
config_serial1.filestream = -1;
sprintf(tmp, "Initialisation de l'UART1 (");
config_serial1.filestream = open("/dev/serial1", O_RDWR | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode
// O_NDELAY / O_NONBLOCK (same function) - Enables nonblocking mode. When set read requests on the file can return immediately with a failure status
// if there is no input immediately available (instead of blocking). Likewise, write requests can also return
// immediately with a failure status if the output can't be written immediately.
// O_NOCTTY - When set and path identifies a terminal device, open() shall not cause the terminal device to become the controlling terminal for the process.
if (config_serial1.filestream != -1)
{
//The flags (defined in /usr/include/termios.h - see http://pubs.opengroup.org/onlinepubs/007908799/xsh/termios.h.html):
// Baud rate:- B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000
// CSIZE:- CS5, CS6, CS7, CS8
// CLOCAL - Ignore modem status lines
// CREAD - Enable receiver
// IGNPAR = Ignore characters with parity errors
// ICRNL - Map CR to NL on input (Use for ASCII comms where you want to auto correct end of line characters - don't use for binary comms!)
// PARENB - Parity enable
// PARODD - Odd parity (else even)
//--------------------------------------------------------------------------------------------------------------------------------
// Lecture de la configuration en cours => variable locale options :
if (tcgetattr(config_serial1.filestream, &options) < 0)
{
sprintf(tmp, "Initialisation de l'UART1 impossible : erreur lors de lecture des paramètres du port...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
//--------------------------------------------------------------------------------------------------------------------------------
// Mise à jour des paramètres non configurables dans la BDD :
// Configuration du registre 'cflag' :
// options.c_cflag = 0;
options.c_cflag |= CLOCAL; // Ignore modem status lines
options.c_cflag |= CREAD; // Enable receiver
options.c_cflag &= ~CRTSCTS; // no hardware flowcontrol
// options.c_cflag |= CMSPAR; // force Even parity to SPACE
// Configuration du registre 'lflag' :
// options.c_lflag = 0;
options.c_lflag &= ~ECHO;
options.c_lflag &= ~ECHOE;
options.c_lflag &= ~ECHONL;
options.c_lflag &= ~ICANON;
options.c_lflag &= ~ISIG;
options.c_lflag &= ~IEXTEN;
// Configuration du registre 'iflag' :
// options.c_iflag = 0;
options.c_iflag &= ~IGNCR; // preserve carriage return
options.c_iflag &= ~INLCR; // Don't map NL to CR on input
options.c_iflag &= ~ICRNL; // Don't map CR to NL on input
options.c_iflag &= ~IUCLC; // Don't map upper-case to lower-case on input
options.c_iflag &= ~IUCLC; // Don't convert uppecase to lowercase on input
options.c_iflag &= ~IMAXBEL; // Don't beep on reception as input buffer is full
options.c_iflag &= ~IXANY; // Don't enable any character to restart outputno SW flowcontrol
options.c_iflag &= ~IXON; // Don't enable start output control
options.c_iflag &= ~IXOFF; // Don't enable stop output control (attention : doc pas très claire entre Xon et Xoff)
options.c_iflag |= IGNBRK; // ignore breaks
options.c_iflag &= ~ISTRIP; // Don't clear MSB (b8) on input
options.c_iflag &= ~IGNPAR; // Don't ignore (check) parity errors
options.c_iflag |= INPCK; // test parity
options.c_iflag &= ~PARMRK; // Don't use verbose parity error (Signaler les erreurs de parité par une séquence 255-0-car. )
// Configuration du registre 'oflag' :
options.c_oflag &= ~OPOST; // Don't use post-process output (?)
// Configuration des caractères de contrôle 'c_cc' :
// options.c_cc[VEOL] = 0;
// options.c_cc[VEOL2] = 0;
// options.c_cc[VEOF] = 0x04;
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation de la vitesse de communication :
switch(config_serial1.vitesse)
{
case 1200: { speed = B1200; break; }
case 2400: { speed = B2400; break; }
case 4800: { speed = B4800; break; }
case 9600: { speed = B9600; break; }
case 19200: { speed = B19200; break; }
case 38400: { speed = B38400; break; }
case 57600: { speed = B57600; break; }
case 115200: { speed = B115200; break; }
case 921600 : { speed = B921600; break; }
default :
{
sprintf(tmp, "\tInitialisation de l'UART1 impossible : vitesse de communication non valide (%i b/s) ...", config_serial1.vitesse);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
// Mise à jour de la valeur dans la structure :
cfsetospeed(&options, speed);
cfsetispeed(&options, speed);
// Mise à jour du message de configuration :
sprintf(chaine_temp, "%i b/s", config_serial1.vitesse);
strcat(tmp, chaine_temp);
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation du nombre de bits de données :
options.c_cflag &= ~CSIZE; // RAZ des bits concernés
switch(config_serial1.longueur)
{
case 8: { options.c_cflag |= CS8; break; }
case 7: { options.c_cflag |= CS7; break; }
case 6: { options.c_cflag |= CS6; break; }
case 5: { options.c_cflag |= CS5; break; }
default :
{
sprintf(tmp, "Initialisation de l'UART1 impossible : nombre de bits de données non valide (%i bits) ...", config_serial1.longueur);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
// Mise à jour du message de configuration :
sprintf(chaine_temp, ", %i bits", config_serial1.longueur);
strcat(tmp, chaine_temp);
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation de la parité :
// ATTENTION : les tests de parité ne semblent pas fonctionner !!! Leur configuration ne semble avoir aucun effet (pas d'erreur générée).
switch(config_serial1.parite)
{
case 0: // Pas de parité :
{
options.c_cflag &= ~PARENB; /* Disable parity */
strcat(tmp, ", pas de parité");
break;
}
case 1: // Parité impaire :
{
options.c_cflag |= PARENB; // Parité validée
options.c_cflag |= PARODD; /* Odd parity */
strcat(tmp, ", parité impaire");
break;
}
case 2: // Parité paire :
{
options.c_cflag |= PARENB; // Parité validée
options.c_cflag &= ~PARODD; /* Even parity */
strcat(tmp, ", parité paire");
break;
}
default :
{
sprintf(tmp, "\tInitialisation de l'UART1 impossible : parité non valide (%i) ...", config_serial1.parite);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
//--------------------------------------------------------------------------------------------------------------------------------
// Initialisation du nombre de bits de stop :
switch(config_serial1.stops)
{
case 1:
{
options.c_cflag &= ~CSTOPB; /* only need 1 stop bit */
strcat(tmp, ", un bit de stop");
break;
}
case 2:
{
options.c_cflag |= CSTOPB; /* activate double stop bits */
strcat(tmp, ", deux bits de stop");
break;
}
default :
{
sprintf(tmp, "Initialisation de l'UART1 impossible : nombre de bits de stop non valide (%i) ...", config_serial1.stops);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
//--------------------------------------------------------------------------------------------------------------------------------
// Mise à jour des nouveaux paramètres :
tcsetattr(config_serial1.filestream, TCSANOW, &options); // Mise à jour des nouvelles valeurs de configuration (depuis 'options')
delai_dixieme_sec(2); // Délai nécessaire pour que le flush fonctionne (testé avec délai = 1 : Ok)
tcflush(config_serial1.filestream, TCIOFLUSH); // Vidage du port (en Inputs et en Ouptuts)
//--------------------------------------------------------------------------------------------------------------------------------
// Finalisation du message de débug :
strcat(tmp, ")\t: OK");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_OK);
return(0);
}
else // Cas où l'ouverture du port ne s'est pas passée correctement :
{
sprintf(tmp, "Initialisation de l'UART1 impossible : erreur lors de l'ouverture du port...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
}
else // L'UART n'est pas validé :
{
sprintf(tmp, "La configuration en cours ne prévoit pas l'utilisation de l'UART1 (la configuration de celui-ci n'a pas été affectée par l'application)...");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_WARNING);
return(0); // On ne considère pas cela comme une erreur et l'init peut continuer.
}
}