![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
GAS Joel
main.cpp
- Committer:
- JCON
- Date:
- 2018-06-28
- Revision:
- 0:1593910d3520
File content as of revision 0:1593910d3520:
#include "mbed.h" //Se declara la librería mbed. #include "rtos.h" #include <string> DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); Serial pc(USBTX, USBRX, 9600); // tx, rx Conunicación Serial con la PC DigitalIn CTS(p7, PullUp); // Pin Digital de entrada "CTS" en modo Pull-Up, para encontrarse normalmente a VCC cuando no haya un pulso. DigitalOut RTS(p8, 1); // Pin Digital de Salida "RTS"; Predefinido para valer 1 en su estado inactivo dentro del código. Serial device(p9, p10, 9600); // tx, rx Comunicación Serial con el Módulo STX3 int flag=1; // Declaración de la Bandera. int incomingByte=0; Thread thread; AnalogIn ain(p20); void waitCTS(); uint16_t ModRTU_CRC(char * buf, int len) { unsigned char i; unsigned short data; uint16_t crc = 0xFFFF; do{ data = (unsigned int)0x00FF & *buf++; crc = crc ^ data; for(i = 8; i > 0; i--) { if(crc & 0x0001) crc = (crc >> 1) ^ 0x8408; else crc >>=1; } }while (--len); crc = ~crc; // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes) return (crc); } void respuesta(){ while(1){ if(device.readable()) { // Se esperan datos provenientes del TX del módulo STX3 incomingByte=device.getc(); //pc.putc(num); pc.printf("%X",incomingByte); pc.printf(" "); // pc.putc(device.getc()); // Se muestra en pantalla la respuesta recibida por el módulo STX3 como una reacción al mensaje en HEX enviado } } } void stx3() { Thread::wait(200); // Se da un tiempo para que el analizador se estabilice incomingByte=0; pc.printf("El valor de CTS es %d\n\r",CTS.read()); // Se lee el valor de la variable CTS, la cual debe ser 1 pc.printf("El valor de RTS es %d\n\r",RTS.read()); // Se lee el valor de la variable RTS, la cual debe ser 1 RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión while(flag==1){ // Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla flag=CTS.read(); // Cuando entra el ciclo, se iguala flag a CTS, el cual cuando cambie a 0 provocará que termine el while (máx 125 ms) pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while } } int main() { thread.start(respuesta); while(1) { float voltage = 3300*ain.read(); if(voltage == 0) { printf("Fault"); } else if(voltage < 400) { printf("preheating"); } else { int voltage_diference=voltage-400; int c=voltage_diference*50.0/16.0; printf("voltage es: %f mV \n", voltage); printf("concentracion de C02 en ppm es: %X \n", c); stx3(); int number = 5; printf("%d\n",number); char header[3] = {0xAA,0x07,0x00}; //Define header information char vec[number]; uint8_t c1=c; uint8_t c2=c>>8; for(int k = 0; k < 3; k++) vec[k] = header[k]; vec[3] =c2; vec[4] =c1; pc.printf("Command(HEX):\t\t"); //Print b characters in HEX for(int k = 0; k < number; k++) pc.printf("%X ",vec[k]); char *t = (char *)vec; //a char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF; char crc2 = ModRTU_CRC(t,t[1]-2)>>8; pc.printf("%X ",crc1); //%X print char in HEX format pc.printf("%X ",crc2); //%X print char in HEX format for(int k = 0; k < number; k++) device.putc(vec[k]); device.putc(crc1); device.putc(crc2); Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión RTS=1; Thread::wait(150); pc.printf("\n\rCTS: %d\n\r",CTS.read()); flag=1; } wait(1); switch (pc.getc()) { case '1': { led1=!led1; pc.printf("\n\rQuery ESN AA 05 01 50 D5\n\r"); stx3(); Thread::wait(10); // Query ESN device.putc(0XAA); device.putc(0X05); device.putc(0X01); device.putc(0X50); device.putc(0XD5); Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión RTS=1; Thread::wait(150); pc.printf("\n\rCTS: %d\n\r",CTS.read()); flag=1; } break; case '2': { led4=!led4; pc.printf("\n\rQuery SETUP AA 05 07 66 B0\n\r"); stx3(); Thread::wait(10); // Query SETUP device.putc(0XAA); device.putc(0X05); device.putc(0X07); device.putc(0X66); device.putc(0XB0); Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión RTS=1; Thread::wait(150); pc.printf("\n\rCTS: %d\n\r",CTS.read()); flag=1; } break; case '3': { led3=!led3; pc.printf("\n\rSETUP AA 0E 06 00 00 00 00 00 03 01 03 00 8F 19 \n\r"); stx3(); Thread::wait(10); // SETUP device.putc(0XAA); device.putc(0X0E); device.putc(0X06); device.putc(0X00); device.putc(0X00); device.putc(0X00); device.putc(0X00); device.putc(0X00); device.putc(0X03); device.putc(0X01); device.putc(0X03); device.putc(0X00); device.putc(0X8F); device.putc(0X19); Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión RTS=1; Thread::wait(150); pc.printf("\n\rCTS: %d\n\r",CTS.read()); flag=1; } break; case '4': { led4=!led4; pc.printf("\n\r Send Data AA 07 00 FF FF 82 CE \n\r"); stx3(); Thread::wait(10); // Query SETUP device.putc(0XAA); device.putc(0X07); device.putc(0X00); device.putc(0XFF); device.putc(0XFF); device.putc(0X82); device.putc(0XCE); Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión RTS=1; Thread::wait(150); pc.printf("\n\rCTS: %d\n\r",CTS.read()); flag=1; } break; } } } void waitCTS() { Thread::wait(200); // Se da un tiempo para que el analizador se estabilice incomingByte=0; //pc.printf("El valor de CTS es %d\n\r",CTS.read()); // Se lee el valor de la variable CTS, la cual debe ser 1 //pc.printf("El valor de RTS es %d\n\r",RTS.read()); // Se lee el valor de la variable RTS, la cual debe ser 1 RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión while(flag==1) {// Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla flag=CTS.read(); // Cuando entra el ciclo, se iguala flag a CTS, el cual cuando cambie a 0 provocará que termine el while (máx 125 ms) //pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while } } void sendData() { led4=!led4; waitCTS(); Thread::wait(10); }