el 05-02-2018 09:31 PM
Hola, estoy haciendo un proyecto en el cual utilizo comunicación entre una red de anillo con "n" arduinos externos y dos arduinos para enviar la información del anillo y recibirla en un centro de control mediante un sistema de telemetría. Esto se hace mediante una rutina de interrupciones y dos módulos de radiofrecuencia Xbee.
La comunicación es bidireccional. Desde Labview se deben de mandar mensajes por medio de botones desde "Arduino Centro de Control" hacia "Arduino Harlan"; mientras que al mismo tiempo se debe de recibir la información del anillo en "Arduino Harlan" y enviarla a "Arduino centro de control" para ser procesada y posteriormente enviada hacia labview por medio de comunicación Serial.
El problema ocurre al enviar la información procesada desde "Arduino centro de control" hacia labview, a veces se procesa la información, a veces no y a veces se envía toda la información y a veces no. Es bastante inconsistente.
La información se escribe desde "Arduino Harlan", se recibe en "Arduino centro de control" y de aquí se va a labview. Alguien conoce la razón de esta inconsistencia? Adjunto los archivos de arduino y labview, así como los comandos a utilizar para simular el anillo.
$TEFE01# (o 00 en lugar de 01)
$TEPA01# (o 00 en lugar de 01)
$TEFN000# (o cualquier valor en lugar de los ceros)
$TEDIR000# (o cualquier valor en lugar de los ceros)
$TEUTM0000000000# (o cualquier valor en lugar de los ceros)
$TEDO000# (o cualquier valor en lugar de los ceros)
$TEAC000# (o cualquier valor en lugar de los ceros)
$TEST01# (o 00 en lugar de 01)
Si alguien pudiera guiarme hacia la solución sería de excelente ayuda.
//ARDUINO EN HARLAN #include <stdio.h> #include <avr/interrupt.h> volatile char message[100], mCounter=0; volatile char myMessage[20]; volatile char sendMessage[20]; ISR(USART0_RX_vect){ //Llega informacion de anillo y sale para xbee char data; data=UDR0; UDR1=data; } ISR(USART1_RX_vect){ //Llega informacion de xbee y sale para anillo char data; data=UDR1; UDR0=data; char ID0='T'; char ID1='E';//ID for each module if (data=='$') { mCounter=0; //if $ is recibed, it's a new message then restart counter } message[mCounter]=data; //save each byte of the message mCounter=mCounter+1; if (data=='#') //A complete message was received; find the information within the message { for(int i=0;message[i]!='#';i++){ //Look for initials of myMessage if(message[i]==ID0 && message[i+1]== ID1){ for(int ii=0;((myMessage[ii]!='#')&&/*||*/(myMessage[ii]!='-'));ii++){ //Define myMessage myMessage[ii]=message[ii+i]; } break; } } } } void setup() { // setup for serial communication using interruptions UBRR0=103; //setting baud rate at 9600 with U2X0=0; UCSR0C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; UCSR0B|= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // Enables transmission, reception and RX interruption UBRR1=103; //setting baud rate at 9600 with U2X0=0; UCSR1C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; UCSR1B|= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1); sei(); } void loop() { }
//ARDUINO EN CENTRO DE CONTROL #include <stdio.h> #include <avr/interrupt.h> volatile char message[100], mCounter=0; volatile char myMessage[100]; char Gauges[50]={'E','0','0','N','0','0','0','A','0','0','0','M','0','0','T','0','0','U','0','0','0','0','0','0','0','0','0','0','D','0','0','0','S','0','0','#'}; ISR(USART0_RX_vect){ //Llega informacion de Labview y sale para xbee char data; data=UDR0; UDR1=data; } ISR(USART1_RX_vect){ //Llega informacion de xbee y sale para labview char data; data=UDR1; myMessage[0]='T'; myMessage[1]='E'; //ID for each module if (data=='$') { mCounter=0; //if $ is recibed, it's a new message then restart counter } message[mCounter]=data; //save each byte of the message mCounter=mCounter+1; if (data=='#') //A complete message was received; find the information within the message { for(int i=0;message[i]!='#';i++){ //Look for initials of myMessage if(message[i]=='T'&& message[i+1]=='E'){ for(int ii=0;(myMessage[ii]!='#');ii++){ //Define myMessage myMessage[ii]=message[ii+i]; } break; } } } } void setup() { // setup for serial communication using interruptions UBRR0=103; //setting baud rate at 9600 with U2X0=0; UCSR0C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; UCSR0B|= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // Enables transmission, reception and RX interruption UBRR1=103; //setting baud rate at 9600 with U2X0=0; UCSR1C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; UCSR1B|= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1); sei(); } void loop() { for(int i=0;(myMessage[i]!='#');i++) { if(myMessage[i]=='F' && myMessage[i+1]=='E')//Busca estado de freno de emergencia { Gauges[0]='E'; Gauges[1]=myMessage[i+2]; Gauges[2]=myMessage[i+3]; } if(myMessage[i]=='F' && myMessage[i+1]=='N')//Busca porcentaje de freno aplicado { Gauges[3]='N'; Gauges[4]=myMessage[i+2]; Gauges[5]=myMessage[i+3]; Gauges[6]=myMessage[i+4]; } if(myMessage[i]=='A' && myMessage[i+1]=='C')//Busca porcentaje de acelerador aplicado { Gauges[7]='A'; Gauges[8]=myMessage[i+2]; Gauges[9]=myMessage[i+3]; Gauges[10]=myMessage[i+4]; } if(myMessage[i]=='P' && myMessage[i+1]=='A')//Busca estado del motor { Gauges[11]='M'; Gauges[12]=myMessage[i+2]; Gauges[13]=myMessage[i+3]; } if(myMessage[i]=='S' && myMessage[i+1]=='T')//Busca estado de trayectoria { Gauges[14]='T'; Gauges[15]=myMessage[i+2]; Gauges[16]=myMessage[i+3]; } if(myMessage[i]=='U' && myMessage[i+1]=='T' && myMessage[i+2]=='M')//Busca coordenadas UTM { Gauges[17]='U'; Gauges[18]=myMessage[i+3]; Gauges[19]=myMessage[i+4]; Gauges[20]=myMessage[i+5]; Gauges[21]=myMessage[i+6]; Gauges[22]=myMessage[i+7]; Gauges[23]=myMessage[i+8]; Gauges[24]=myMessage[i+9]; Gauges[25]=myMessage[i+10]; Gauges[26]=myMessage[i+11]; Gauges[27]=myMessage[i+12]; } if(myMessage[i]=='D' && myMessage[i+1]=='I' && myMessage[i+2]=='R')//Busca angulo de direccion { Gauges[28]='D'; Gauges[29]=myMessage[i+3]; Gauges[30]=myMessage[i+4]; Gauges[31]=myMessage[i+5]; } if(myMessage[i]=='D' && myMessage[i+1]=='O')//Busca situacion de seguridad { Gauges[32]='S'; Gauges[33]=myMessage[i+2]; Gauges[34]=myMessage[i+3]; Gauges[35]='#'; } } while((UCSR0A&(1<<UDRE0))==0); UDR0=10; for(int i=0;i<36;i++) { while((UCSR0A&(1<<UDRE0))==0); UDR0=Gauges[i]; } delay(1000); }
05-09-2018 04:12 PM - editado 05-09-2018 04:22 PM
Intenta creando un programa basado en productor - consumidor en el cual en uno estes monitoreando el cambio de valor en el interfaz y en el otro mandes el dato y en secuencia espere la lectura del Arduino. Te puedes basar en el ejemplo de LabVIEW de Continious serial write and read y con el template incluido en labVIEW de producer/consumer.
Existe alguna razon que colocaste 2.0 en stop bits, no es un valor aceptado por el VI y ademas el tiempo entre ciclos por que lo dejas te de 1 segundo ?
el 06-03-2018 09:12 PM
Hola, comparto guia para comunicar labview por medio de VISA
Programacion Labview - Comunicacion Serie PC microcontrolador
https://www.youtube.com/watch?v=xvAXN0orRHI
06-03-2018 09:13 PM - editado 06-03-2018 09:40 PM
Hola, comparto guia para comunicar labview por medio de VISA
https://www.youtube.com/watch?v=BgHCLJcorBA
el 01-10-2025 11:25 AM
Un saludo
Comparto mi aporte en español para la comunicación serial visa espero que ayude
https://www.youtube.com/playlist?list=PLLO-IQy_X-hVf-eOnImaS-mPYdP5VT3PM
Cordial ssaludo