Buenas,
La finalidad del programa consiste en recibir datos constantemente por usb, paquetes de 64 bytes y enviarlos a un socket udp, tengo el programa en labview que envía 64 bytes por usb y también puedo recibir por usb mensajes para seguir el programa que se está ejecutando en el pic. Y para ver los datos que envío por udp, abro en el hércules la comunicación udp.
Utilizo el stack TCP/IP de microchip y mi código para grabar en el pic es el siguiente:
el fichero de configuración de la entrenadora es:
He buscado ejemplos de envío de paquetes de Udp, las funciones de UDP son bastante sencillas, pero hay algún problema en el programa porque al ejecutarlo leo en labview "comienza el envío de datos" y "64 bytes enviados" continuamente, y los leds también se encienden y se apagan.
Las conexiones entre la tarjeta enc28j60 y mi pic 18f67j50 están correctas, el módulo donde tengo la enc28j60 está conectado al router de mi red, pero en el programa de recepción UDP no leo absolutamente nada. El puerto fuente del código es el que pongo como puerto de destino en hércules y viceversa, he probado a poner la MAC de mi ordenador tambien, y tambien he probado con IP 255.255.255.255 para hacer un envío broadcast y no consigo recibir absolutamente nada, no tengo antivirus activos en mi ordenador, y la verdad no sé dónde está el problema del programa ni que más puedo revisar, si alguien tiene alguna idea o detecta algún error en el código o en la configuración de la IP o MAC se lo agradecería.
gracias por su tiempo, saludos!
La finalidad del programa consiste en recibir datos constantemente por usb, paquetes de 64 bytes y enviarlos a un socket udp, tengo el programa en labview que envía 64 bytes por usb y también puedo recibir por usb mensajes para seguir el programa que se está ejecutando en el pic. Y para ver los datos que envío por udp, abro en el hércules la comunicación udp.
Utilizo el stack TCP/IP de microchip y mi código para grabar en el pic es el siguiente:
Código:
#include "config18F67J50Trainer.c"
#define STACK_USE_MCPENC TRUE
#define STACK_USE_ICMP TRUE
#define STACK_USE_ARP TRUE
#define STACK_USE_UDP TRUE
#include "tcpip/stacktsk.c"
#include "usb/usb_cdc.h"
#include "usb/usb_bootloader.h"
int8 buffer[64]={0}; //defino un buffer de 64 bytes donde guardo los datos que llegan por usb
int8 contador=0;
NODE_INFO udp_info; // node_info es una estructura que tiene MAC e IP
UDP_SOCKET s;
void IP_ADDR (void) /*aquí escribo la IP de destino, que corresponde a la de mi PC
y es la dirección IP que pongo en el hércules para abrir la conexión UDP*/
{
udp_info.IPAddr.v[0]=192;
udp_info.IPAddr.v[1]=168;
udp_info.IPAddr.v[2]=2;
udp_info.IPAddr.v[3]=100;
}
void MAC_ADDR (void) /*la MAC está en blanco, lo he puesto así porque lo he visto
en los ejemplos y creo que es para el envío broadcast*/
{
udp_info.MACAddr.v[0]=0xFF;
udp_info.MACAddr.v[1]=0xFF;
udp_info.MACAddr.v[2]=0xFF;
udp_info.MACAddr.v[3]=0xFF;
udp_info.MACAddr.v[4]=0xFF;
udp_info.MACAddr.v[5]=0xFF;
}
void envio_datos(void) // esta función será llamada en el main
{
int8 TMPC; //defino una variable intermedia
int8 cont=0;
printf(usb_cdc_putc, "Comienza envío de datos UDP");
for(cont=0;cont<=63;cont++)
{
if (UDPIsPutReady(s))
{
output_toggle(LedR); /*cambio los leds para detectar el envio
de datos en la placa*/
output_toggle(LedV);
TMPC=buffer[cont];
UDPPut(TMPC);
printf(UDPPut, "%i", TMPC); /*no sé cual de las dos instrucciones me sirve
realmente para ver los datos que envío, no sé
bien la diferencia entre ambas, he probado a
poner las dos para asegurar que se envían los
datos, si alguien sabe la diferencia lo agradecería*/
delay_ms(100);
}
}
UDPFlush(); //envío los datos que están en el buffer de transmisión
printf(usb_cdc_putc, "64 bytes enviados");
contador=0;
}
void main (void)
{
ON(LedR);
OFF(LedV);
usb_cdc_init();
usb_init();
usb_wait_for_enumeration();
void IP_ADDR();
void MAC_ADDR();
StackInit();
printf(usb_cdc_putc, "Inicializado UDP");
ON(LedV);
OFF(LedR);
s=UDPOpen(1234, &udp_info, 2345);/*abro el socket s, 1234 es el puerto de origen
y 2345 el puesto de destino, la información de
udp_info es la del nodo remoto, es decir en este
caso la IP de mi ordenador que es adonde quiero
enviar los datos*/
printf(usb_cdc_putc, "Abierto socket UDP");
if (s !=INVALID_UDP_SOCKET)
{
printf(usb_cdc_putc, "Socket UDP válido");
while(TRUE)
{
StackTask();
buffer[contador]= usb_cdc_getc();
contador++;
if (contador>=63) envio_datos();
}
}
printf(usb_cdc_putc, "Socket UDP no válido");
UDPClose(s);
printf(usb_cdc_putc, "Cerrado socket UDP");
}
el fichero de configuración de la entrenadora es:
Código:
#include <18F67J50.h>
#fuses HS_PLL,NOWDT,NOXINST,STVREN,NOPROTECT,FCMEN,NODEBUG,PLL2,NOCPUDIV,MSSPMSK7,IESO
#use delay(clock=48000000)
#bit PLLEN = 0xf9b.6
#define ON output_high
#define OFF output_low
// Connections in 18F67J50Trainer
#define LedV PIN_G0
#define LedR PIN_G1
// Connections between ModEthernet and 18F67J50Trainer
#define PIN_ENC_MAC_CS PIN_D0
#define PIN_ENC_MAC_RST PIN_D1
#define PIN_ENC_MAC_INT PIN_D2
#define PIN_ENC_MAC_WOL PIN_D3
#define PIN_ENC_MAC_SI PIN_D4 // MISO: PIC > ENC
#define PIN_ENC_MAC_SO PIN_D5 // MOSI: PIC < ENC
#define PIN_ENC_MAC_CLK PIN_D6 // SCK
He buscado ejemplos de envío de paquetes de Udp, las funciones de UDP son bastante sencillas, pero hay algún problema en el programa porque al ejecutarlo leo en labview "comienza el envío de datos" y "64 bytes enviados" continuamente, y los leds también se encienden y se apagan.
Las conexiones entre la tarjeta enc28j60 y mi pic 18f67j50 están correctas, el módulo donde tengo la enc28j60 está conectado al router de mi red, pero en el programa de recepción UDP no leo absolutamente nada. El puerto fuente del código es el que pongo como puerto de destino en hércules y viceversa, he probado a poner la MAC de mi ordenador tambien, y tambien he probado con IP 255.255.255.255 para hacer un envío broadcast y no consigo recibir absolutamente nada, no tengo antivirus activos en mi ordenador, y la verdad no sé dónde está el problema del programa ni que más puedo revisar, si alguien tiene alguna idea o detecta algún error en el código o en la configuración de la IP o MAC se lo agradecería.
gracias por su tiempo, saludos!