Conexión de un UFS270 al la tarjeta NUCLEO-F091RC, se envia el dato de la altura real del liquido al puerto RS232 del GV300 cada 30seg (Aplicacion para tanques estacionarios)
Dependencies: BufferedSerial mbed
Revision 0:d74fc1505b54, committed 2016-05-26
- Comitter:
- mvargas_dtk
- Date:
- Thu May 26 21:19:42 2016 +0000
- Commit message:
- Conexion de un solo sensor ultrasonico de combustible al nucleo-F091RC, y lectura del valor real de altura del liquido. Aplicacion para tanques estacionarios
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BufferedSerial.lib Thu May 26 21:19:42 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/sam_grove/code/BufferedSerial/#a0d37088b405
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/constantes.cpp Thu May 26 21:19:42 2016 +0000 @@ -0,0 +1,26 @@ +/* + * - Proyecto: CH SABMiller. + + * - Lenguaje: ANSI C/C++ (mbed) + * - Tarjeta: Nucleo F091RC + * - Referencias: + * - Fecha: 2016/May + * - Autor(es): Felícito Manzano / + Mario Vargas + * - Compañia: V.S.R. de Centroamérica + * - País: SV / CR +*/ + +#include "constantes.hpp" + +/* DEFINICIÓN DE CONSTANTES PARA GV300 */ +const char CABECERA_TX[] = "AT+GTDAT=gv300,2,,TCA|"; +const char CODIGO_INT_FUEL[] = "003|"; +const char FIN_CABECERA_TX[] = ",1,,,,"; +const char ULTIMO_CARACTER[] = "$"; +const char SEPARADOR[] = ";"; +const char RESET_TXT[] = "AT+GTDAT=gv300,2,,***BOOTING***,1,,,,0001$"; + +// OTRAS CONSTANTES +const int T_ESPERA_CP = 300; // mili segundos +const int T_TX = 100; // mili segundos
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/constantes.hpp Thu May 26 21:19:42 2016 +0000 @@ -0,0 +1,23 @@ +/* + * - Proyecto: Accesorios Queclink. + * - Lenguaje: ANSI C/C++ (mbed) + * - Tarjeta: Nucleo F091RC + * - Referencias: + * - Fecha: 2016/May + * - Autor(es): Felícito Manzano / + Mario Vargas + * - Compañia: V.S.R. de Centroamérica + * - País: SV / CR +*/ + +/* DEFINICIÓN DE CONSTANTES PARA GV300 */ +extern const char CABECERA_TX[23]; +extern const char CODIGO_INT_FUEL[5]; +extern const char FIN_CABECERA_TX[7]; +extern const char ULTIMO_CARACTER[2]; +extern const char SEPARADOR[2]; +extern const char RESET_TXT[43]; + +// OTRAS CONSTANTES +extern const int T_ESPERA_CP; // mili segundos +extern const int T_TX; // mili segundos
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/funciones_UFS270.h Thu May 26 21:19:42 2016 +0000
@@ -0,0 +1,166 @@
+/*
+ * - Proyecto: CH SABMiller.
+ * - Lenguaje: ANSI C/C++ (mbed)
+ * - Tarjeta: Nucleo F091RC
+ * - Referencias:
+ * - Fecha: 2016/May
+ * - Autor(es): Felícito Manzano /
+ Mario Vargas
+ * - Compañia: V.S.R. de Centroamérica
+ * - País: SV / CR
+*/
+
+#include "mbed.h"
+#include "BufferedSerial.h"
+#include "constantes.hpp"
+
+/* DEFINICIÓN DE FUNCIONES */
+/*******************************************************************/
+/*******************************************************************/
+
+int ufs270_rtFL(BufferedSerial *puerto_data, char nivel[6], char hw[2], char sw[2])
+{
+ /*
+ Descripción de la función.
+
+ REAL TIME FUEL LEVEL!!
+
+ Esta función recibe un puerto serial Buffered en el que se recibe la trama
+ *QL,411D,01,01580,02D0,2205,01551,null#
+
+ +-------------------------------------------------------+
+ | PARAMETER | LENGHT | EXAMPLE | DESCRIPTION |
+ +----------------------+--------+---------+-------------+
+ | HEADER | 3 | *QL, | |
+ | PROTOCOL | 1 | 4 | |
+ | FIRMWARE | 2 | 11 | |
+ | HARDWARE | 1 | D, | |
+ | RESERVED | 2 | 01, | |
+ | CALCULATE FUEL LEVEL | 5 | 01580, | Unit 0.1 mm |
+ | SIGNAL STRENG | 2 | 02 | |
+ | SOFTWARE STATUS CODE | 1 | D | |
+ | HARDWARE FAULT CODE | 1 | 0, | |
+ | RESERVED | 4 | 2205, | |
+ | REAL TIME FUEL LEVEL | 5 | 01551, | Unit 0.1 mm |
+ | RESERVED | 4 | null | |
+ | TAIL | 1 | # | |
+ +----------------------+--------+---------+-------------+
+
+ Se lee caracter por caracter, al encontrar un asterisco se inicia el conteo
+ de caracteres, aprovechando que la longitud de la trama es fija se extrae la
+ información de nivel de combustible (REAL TIME FUEL LEVEL) en base al contador
+ de caracteres, también se extrae el estatus de software y hardware.
+
+ Si existe información en puerto Serial y es legible se retorna 1.
+ Si no existe información para leer en el puerto Serial se retorna 0.
+ */
+
+ char ufs270_begin = '*';
+ int char_fuel = 29;
+ int char_fuel_limit = 33;
+ int char_swstatus = 21;
+ int char_hwstatus = 22;
+
+ int char_counter = 0;
+ int z = 0;
+ int begin = 0;
+
+ while (puerto_data -> readable()) {
+ // If the character on the
+ char incoming_char = puerto_data -> getc();
+ if (incoming_char == ufs270_begin) {
+ char_counter = 1;
+ z=0;
+ begin = 1;
+ } else {
+ char_counter++;
+ }
+ if ((char_counter == char_swstatus) && begin) {
+ sw[0] = incoming_char;
+ } else if ((char_counter == char_hwstatus) && begin) {
+ hw[0] = incoming_char;
+ } else if ((char_counter >= char_fuel) && (char_counter <= char_fuel_limit) && begin) {
+ nivel[z] = incoming_char;
+ z++;
+ }
+ }
+
+ if (begin) {
+ return (1);
+ } else {
+ return (0);
+ }
+}
+
+
+
+int ufs270_calcFL(BufferedSerial *puerto_data, char nivel[6], char hw[2], char sw[2])
+{
+ /* Descripción de la función.
+
+ CALCULATE FUEL LEVEL
+
+ Esta función recibe un puerto serial Buffered en el que se recibe la trama
+ *QL,411D,01,01580,02D0,2205,01551,null#
+
+ +-------------------------------------------------------+
+ | PARAMETER | LENGHT | EXAMPLE | DESCRIPTION |
+ +----------------------+--------+---------+-------------+
+ | HEADER | 3 | *QL, | |
+ | PROTOCOL | 1 | 4 | |
+ | FIRMWARE | 2 | 11 | |
+ | HARDWARE | 1 | D, | |
+ | RESERVED | 2 | 01, | |
+ | CALCULATE FUEL LEVEL | 5 | 01580, | Unit 0.1 mm |
+ | SIGNAL STRENG | 2 | 02 | |
+ | SOFTWARE STATUS CODE | 1 | D | |
+ | HARDWARE FAULT CODE | 1 | 0, | |
+ | RESERVED | 4 | 2205, | |
+ | REAL TIME FUEL LEVEL | 5 | 01551, | Unit 0.1 mm |
+ | RESERVED | 4 | null | |
+ | TAIL | 1 | # | |
+ +----------------------+--------+---------+-------------+
+
+ Se lee caracter por caracter, al encontrar un asterisco se inicia el conteo
+ de caracteres, aprovechando que la longitud de la trama es fija se extrae la
+ información de nivel de combustible en base al contador de caracteres, también
+ se extrae el estatus de software y hardware.
+
+ Si existe información en puerto Serial y es legible se retorna 1.
+ Si no existe información para leer en el puerto Serial se retorna 0.
+ */
+ char ufs270_begin = '*';
+ int char_fuel = 13;
+ int char_fuel_limit = 17;
+ int char_swstatus = 21;
+ int char_hwstatus = 22;
+
+ int char_counter = 0;
+ int z = 0;
+ int begin = 0;
+
+ if (puerto_data -> readable()) {
+ while (puerto_data -> readable()) {
+ // If the character on the
+ char incoming_char = puerto_data -> getc();
+ if (incoming_char == ufs270_begin) {
+ char_counter = 1;
+ z=0;
+ begin = 1;
+ } else {
+ char_counter++;
+ }
+ if ((char_counter >= char_fuel) && (char_counter <= char_fuel_limit) && begin) {
+ nivel[z] = incoming_char;
+ z++;
+ } else if ((char_counter == char_swstatus) && begin) {
+ sw[0] = incoming_char;
+ } else if ((char_counter == char_hwstatus) && begin) {
+ hw[0] = incoming_char;
+ }
+ }
+ return (1);
+ } else {
+ return (0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/funciones_basicas.h Thu May 26 21:19:42 2016 +0000
@@ -0,0 +1,54 @@
+/*
+ * - Proyecto: Accesorios Queclink.
+ * - Lenguaje: ANSI C/C++ (mbed)
+ * - Tarjeta: Nucleo F091RC
+ * - Referencias:
+ * - Fecha: 2016/May
+ * - Autor(es): Felícito Manzano /
+ Mario Vargas
+ * - Compañia: V.S.R. de Centroamérica
+ * - País: SV / CR
+*/
+
+#include "constantes.hpp"
+
+int incrementar_trama(int *tramas)
+{
+ /*
+ Esta función recibe un entero que es el contador de tramas
+ realiza el incremento en uno y verifica si el valor es mayor
+ o igual que 65535 que es equivalente a 0xFFFF. Si se cumple
+ la condución se regresa el valor a 1.
+ Esta función siempre retorna 0.
+ */
+ int actual = *tramas;
+ int limite = 65535;
+ actual++;
+
+ if (actual > limite) {
+ *tramas = 1;
+ } else {
+ *tramas = actual;
+ }
+ return(0);
+}
+
+int booting_gtdat(Serial *puerto_gv300, Serial *puerto_usb)
+{
+ /*
+ Esta función recibe los puertos Seriales del GV300 y de la PC
+ conectada por USB para notificar que se ha reiniciado la interfaz.
+ Siempre retorna 0
+ */
+ puerto_usb -> printf("*** BOOTING ***\r\n");
+ puerto_usb -> printf("VSR de Centroamerica\r\nSerial Port - OK\r\n");
+ puerto_usb -> printf("Enviar mensaje de re-inicio a CP\r\n\n");
+ wait_ms(T_TX);
+ puerto_gv300 -> printf("%s\r\n", RESET_TXT);
+ wait_ms(T_ESPERA_CP);
+ puerto_usb -> printf("%s\r\n", RESET_TXT);
+ wait_ms(T_TX);
+
+ return(0);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu May 26 21:19:42 2016 +0000
@@ -0,0 +1,95 @@
+/*
+ * - Proyecto: Accesorios Queclink.
+ * - Lenguaje: ANSI C/C++ (mbed)
+ * - Tarjeta: Nucleo F091RC
+ * - Referencias:
+ * - Fecha: 2016/May
+ * - Autor(es): Felícito Manzano /
+ Mario Vargas
+ * - Compañia: V.S.R. de Centroamérica
+ * - País: SV / CR
+*/
+
+#include "mbed.h"
+#include "BufferedSerial.h"
+#include "funciones_basicas.h"
+#include "funciones_UFS270.h"
+#include "constantes.hpp"
+#include <stdio.h>
+
+//HARDWARE SETUP
+//***********************************
+extern Serial pcusb(USBTX, USBRX); //Serial ports TX,RX Hardware
+extern Serial gv300(PC_10, PC_11); // Para conexión con el GPS GV300 N/W
+extern BufferedSerial fuelR1(PB_10, PB_11); // 1er. tanque de combustible
+extern DigitalOut myled(LED1); // LED1 Integrado
+int contador_tramas = 1;
+
+
+int main()
+{
+ // CONFIGURAR INTERFACES SERIALES
+ pcusb.baud(9600); // Common PC Baudrate
+ gv300.baud(115200); // GV300 USB Default Baudrate
+ fuelR1.baud(19200); // UFS270 Default Baudrate
+
+ // Mensaje de Inicio
+ booting_gtdat(&gv300, &pcusb);
+
+ // Declaración de Variables
+ // Nivel de combustible UFS270
+ char level_FuelR1[6] = "-----";
+ char sw_StatusR1[2] = "-";
+ char hw_StatusR1[2] = "-";
+ int eval_Fuel1 = 0;
+ int contador_TX = 0;
+
+
+ while(1) {
+ myled = 1;
+ // Leer UFS270 en el tanque A
+ pcusb.printf("UFS270 A - INICIA\r\n");
+ eval_Fuel1 = ufs270_rtFL(&fuelR1, level_FuelR1, hw_StatusR1, sw_StatusR1);
+ if (eval_Fuel1) {
+ pcusb.printf("UFS270_A Altura=%s - OK\r\n",level_FuelR1);
+ contador_TX++;
+ } else {
+ pcusb.printf("UFS270_A - SIN DATOS\r\n");
+ }
+ wait_ms(T_TX);
+
+
+ // Transmitir
+ if ((eval_Fuel1)&&(contador_TX == 3)){
+ // Generar transmisión
+ pcusb.printf("REPORTE CONSOLIDADO COMBUSTIBLE\r\n");
+ pcusb.printf("Inicia comunicacion con CP. Enviando mensaje:\r\n");
+ pcusb.printf("%s%sFTMS%s%s%s%c%c%s%04X%s\r\n\n",
+ CABECERA_TX, CODIGO_INT_FUEL, SEPARADOR,
+ level_FuelR1, SEPARADOR, hw_StatusR1[0], sw_StatusR1[0],
+ FIN_CABECERA_TX, contador_tramas, ULTIMO_CARACTER);
+ wait_ms(T_ESPERA_CP);
+
+ gv300.printf("%s%sFTMS%s%s%s%c%c%s%04X%s\r\n",
+ CABECERA_TX, CODIGO_INT_FUEL, SEPARADOR,
+ level_FuelR1, SEPARADOR, hw_StatusR1[0], sw_StatusR1[0],
+ FIN_CABECERA_TX, contador_tramas, ULTIMO_CARACTER);
+ wait_ms(T_ESPERA_CP);
+ contador_TX = 0;
+ incrementar_trama(&contador_tramas);
+ pcusb.printf("Mensaje escrito en puerto serial del CP\r\n\n");
+ wait_ms(T_TX);
+
+ }
+ /* CIERRE */
+
+ pcusb.printf("Contador tx = %d\n", contador_TX);
+ pcusb.printf("***FIN***\r\n\n");
+ strcpy(level_FuelR1,"-----\0");
+ strcpy(sw_StatusR1, "-\0");
+ strcpy(hw_StatusR1, "-\0");
+ eval_Fuel1 = 0;
+ myled = 0;
+ wait(2);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu May 26 21:19:42 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/6c34061e7c34 \ No newline at end of file
Mario Vargas