UART BLE tested for IDB05A1 on STM32F411RE - communication between PC terminal and BLE terminal
Dependencies: mbed X_NUCLEO_IDB0XA1 BLE_API
Fork of BLE_UART_perso by
Diff: BLE-UART-IDB0XA1.cpp
- Revision:
- 11:266332086ba5
- Parent:
- 10:2d4a768ae727
--- a/BLE-UART-IDB0XA1.cpp Sat May 12 13:05:57 2018 +0000 +++ b/BLE-UART-IDB0XA1.cpp Wed Nov 21 14:32:20 2018 +0000 @@ -1,5 +1,3 @@ -// Tested: NUCLEO-F401RE - #include "mbed.h" #include "ble/BLE.h" #include "ble/services/UARTService.h" @@ -10,191 +8,143 @@ const static char DEVICE_NAME[] = "UART"; UARTService *uartServicePtr; -// Periferiche -DigitalOut Led1(LED1); // LED su scheda -Serial pcUSB(USBTX,USBRX); // USB di comunicazione con PC -DigitalOut myLED(PB_2); //LED aggiunto esternamente -DigitalIn myButton(USER_BUTTON); // USER BUTTON su scheda -DigitalOut myRelay(PA_15); // Relay Esterno +// Def Peripheriques +DigitalOut Led1(LED1); // LED +Serial pcUSB(USBTX,USBRX); // Terminal PC +DigitalIn myButton(USER_BUTTON); // USER BUTTON -// Array e indice di comunicazione con UART +// Tableau et index de communication avec UART static uint8_t uartBuff[UART_BUFFER]; static uint8_t uartBuffPos=0; -// routine di Error Handling +// Routine de traitement des erreurs void onBleError(ble_error_t error); - -// Ticker segnale di vita +// Signal de vie Ticker LifeTicker; - - /****************************************************/ -/* Ticker attivo quando presente la connessione BLE */ +/* Ticker actif lorsque la connexion BLE est présente */ /****************************************************/ void ConnectedBLE(void) { - // segnale di vita: accende e spegne il LED + // Signal de vie: allumer et éteindre la LED Led1 = !Led1; } -/************************/ -/* Rx da USB e Tx a BLE */ -/************************/ +/***************************/ +/* Rx d'USB et Tx vers BLE */ +/***************************/ void uartRx(void) { - // cattura i caratteri dalla USB fino alla fine del messaggio: a '\r' oppure '\n' oppure fino al raggiungimento della massima dimensione del messaggio - if(pcUSB.readable()) - { + // Capturez les caractères depuis le terminal jusqu'à la fin du message: a '\ r' ou '\ n' ou jusqu'à ce que la taille maximale du message soit atteinte + if(pcUSB.readable()) { uartBuff[uartBuffPos] = pcUSB.getc(); - if((uartBuff[uartBuffPos] == '\r') || (uartBuff[uartBuffPos] == '\n') || (uartBuffPos >= UART_BUFFER)) - { - // inserisce un NUL nell'ultima posizine della stringa + if((uartBuff[uartBuffPos] == '\r') || (uartBuff[uartBuffPos] == '\n') || (uartBuffPos >= UART_BUFFER)) { + // insère un NUL dans la dernière position de la chaîne uartBuff[uartBuffPos] = '\0'; - // We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN, otherwise we need to wait + // Envoie la chaîne entière même si elle est inférieure à BLE_UART_SERVICE_MAX_DATA_LEN, sinon attente uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); - // invia conferma alla USB-PC con la stringa inviata al BLE - pcUSB.printf("TX : %s to BLE\r\n", uartBuff); - // resetta la stringa uartBuff inserendo 0 ai primi UART_BUFFER caratteri + // Envoie une confirmation au terminal PC avec la chaîne envoyée au BLE + pcUSB.printf("TX : %s\r\n", uartBuff); + // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER memset(uartBuff, 0, UART_BUFFER); uartBuffPos = 0; - } - else - { - // se non è stata raggiunta la fine del messaggio, incrementa il contatore per ricevere il prossimo carattere + } else { + // Si la fin du message n'a pas été atteinte, augmentez le compteur pour recevoir le caractère suivant uartBuffPos++; } } } -/*****************************************/ -/* Connessione BLE avvenuta con successo */ -/*****************************************/ -void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) +/*************************/ +/* Connexion BLE réussie */ +/*************************/ +void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) { pcUSB.printf("BLE Client Connected!\n\r"); pcUSB.printf("Please type a string and press return\r\n"); - // segnale di connessione BLE: accende/spegne il LED con periodo 1sec + // Signal de connexion BLE: allume / éteint la LED avec une période de 1 seconde LifeTicker.attach(ConnectedBLE, 1); } -/**********************************/ -/* disconnessione del Cliente BLE */ -/**********************************/ +/*****************************/ +/* Déconnexion du client BLE */ +/*****************************/ void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { (void)params; pcUSB.printf("BLE Client Disconnected!\r\n"); - // spegne il segnale di connessione BLE: accende/spegne il LED con periodo 1sec + // Désactiver le signal de connexion BLE: allumer / éteindre la LED avec une période de 1 seconde LifeTicker.detach(); - - // restart advertising - BLE::Instance().gap().startAdvertising(); + + // Redémarrer la publicité + BLE::Instance().gap().startAdvertising(); Led1=0; } -/************************/ -/* Rx da BLE e Rx a USB */ -/************************/ -void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) +/***************************/ +/* Rx de BLE et Rx vers USB*/ +/***************************/ +void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) { - // Stringa di risposta in caso di ricezione not OK - #define REPLYNOTOK "Rx not Ok :(" - // Stringa di risposta in caso di ricezione OK - #define REPLYOK "Rx Ok :)" - // Stringa di riferimento - #define REFERENCESTRING "bho" - + // Chaîne de réponse en cas de réception pas OK +#define REPLYNOTOK "Rx not Ok :(" + // Chaîne de réponse en cas de réception OK +#define REPLYOK "Rx Ok :)" + // Chaîne de référence +#define REFERENCESTRING "bho" + char caReply[UART_BUFFER]; //uint8_t uaAux[UART_BUFFER]; int nReplyLength; - - //Risultato del confronto tra srtinghe - int nResult; - - // resetta stringa ausiliaria per comporre le risposte + + // Résultat de la comparaison entre srting + int nResult; + + // Réinitialiser la chaîne auxiliaire pour composer les réponses memset(caReply, 0, UART_BUFFER); - - // riceve stringa da BLE - if (params->handle == uartServicePtr->getTXCharacteristicHandle()) - { - // invia al PC la stringa ricevuta - pcUSB.printf("RX: %s from BLE\r\n", params->data); - - //confronta la stringa ricevuta con una stringa di riferimento - nResult=strcmp((char*)(params->data),REFERENCESTRING); - if(nResult==0) // ==0 in caso di confronto di stringhe con esito positivo - { - // se la stringa ricevuta è uguale a quella di riferimento, accende LED - myLED = 1; // accendi LED - myRelay = 1; // accendi Relay - - // comunica al PC l'azione eseguita - pcUSB.printf("Relay = ON ; LED = ON \r\n"); - - // Aggiunge NULL alla stringa di risposta OK - strcpy(caReply,REPLYOK); - nReplyLength = strlen(REPLYOK); - caReply[nReplyLength]='\0'; - - // We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN, otherwise we need to wait - uartServicePtr->write(caReply, (nReplyLength/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); - } - else - { - // se la stringa ricevuta è uguale a quella di riferimento, spegne LED - myLED = 0; // spegni LED - myRelay = 0; // spegni Relay - - // comunica al PC l'azione eseguita - pcUSB.printf("Relay = OFF ; LED = OFF \r\n"); - - // Aggiunge NULL alla stringa di risposta NOT OK - strcpy(caReply,REPLYNOTOK); - nReplyLength = strlen(REPLYNOTOK); - caReply[nReplyLength]='\0'; - - // We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN, otherwise we need to wait - uartServicePtr->write(caReply, (nReplyLength/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); - - } - // !!! PROVARE A INSERIRE IL CASE OF DELL'ESERCIZIO 5 - // !!!!! PROVARE in questo punto a inviare un feedback al BLE !!!!!!! - // !!!! uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); - + + // Reçoit une chaîne de BLE + if (params->handle == uartServicePtr->getTXCharacteristicHandle()) { + // Envoie la chaîne reçue au PC + pcUSB.printf("RX: %s\r\n", params->data); + + uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); + } } -/************************/ -/* Errore su canale BLE */ -/************************/ -void onBleError(ble_error_t error) -{ +/***************************/ +/* Erreur sur le canal BLE */ +/***************************/ + +void onBleError(ble_error_t error) +{ pcUSB.printf("BLE Error: %d\r\n"); - /* Inserire Handling di errore */ -} + /* Entrer le traitement des erreurs */ +} -/******************************************/ -/* Inizializzazione del servizio BLE UART */ -/******************************************/ -void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) +/**************************************/ +/* Initialisation du service BLE UART */ +/**************************************/ + +void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { BLE& ble = params->ble; ble_error_t error = params->error; - if (error != BLE_ERROR_NONE) - { - /* In case of error, forward the error handling to onBleInitError */ + if (error != BLE_ERROR_NONE) { + + /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/ onBleError(error); return; } - /* Ensure that it is the default instance of BLE */ - if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) - { + /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */ + if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; } @@ -203,12 +153,14 @@ ble.gattServer().onDataWritten(BleOnDataWrittenCallback); pcUSB.printf("BLE UARTService: "); - /* Setup primary service. */ + + /* Configuration du service primaire. */ UARTService uartService(ble); uartServicePtr = &uartService; + pcUSB.printf("Started\r\n"); - /* setup advertising */ + /* Configurer la publicité */ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); @@ -216,9 +168,8 @@ ble.gap().setAdvertisingInterval(500); /* 500ms. */ ble.gap().startAdvertising(); - // rimane in attesa di eventi su BLE - while (true) - { + // Attend les événements sur BLE + while (true) { ble.waitForEvent(); } } @@ -228,26 +179,25 @@ /********/ int main(void) { + + // Configurer la vitesse de communication série sur USB-VirtualCom et envoyer un message de bienvenue + pcUSB.baud(9600); //9600 bps - // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto - pcUSB.baud(9600); //921600 bps - // messaggio di benvenuto - pcUSB.printf("\r\nHallo Amaldi Students - Exercise 6 \r\n"); - pcUSB.printf("\r\n*** Bluetooth - PC serial communication ***\r\n"); - - //imposta il funzionamento del pulsante come "PullDown": Aperto = '0'. L'altra modalità di funzinamento è PullUp + // Message de bienvenue + pcUSB.printf("\r\n*** Bluetooth to PC serial communication ***\r\n"); + + //Définit le fonctionnement du bouton sur "PullDown": Open = '0'. L’autre mode de fonctionnement est PullUp myButton.mode(PullDown); - // inizializza variabili + + // Initialiser LED Led1=0; - - - - // IRQ associata alla ricezione di caratteri da seriale su USB da PC + + // IRQ associée à la réception de caractères de série à USB depuis un PC pcUSB.attach(uartRx,Serial::RxIrq); - - /****** START Inizializza BLE **********/ + + /****** START Initialiser BLE **********/ BLE &ble = BLE::Instance(); ble.init(bleInitComplete); - /******* END Inizializza BLE ***********/ + /******* FIN initialise BLE ***********/ }