fr3nsis
Joined: 13 May 2013 Posts: 10
|
Help with UDP rx/tx |
Posted: Tue Apr 01, 2014 12:57 pm |
|
|
I need to send rfid id via ethernet to one pc that will replay with id acquired, this through ethernet.
I have choosed udp protocol but i don't understand why sometimes socket becomes invalid and program stop to receives data.
This is my code:
Code: |
#include <a.h>
#include "my_lcd.c"
#include "DS3231.c"
#define LCD_ON output_low(PIN_B4);
#define LCD_OFF output_high(PIN_B4);
#define STACK_USE_ICMP 1
#define STACK_USE_ARP 1
#define STACK_USE_UDP 1
#define MAX_SOCKETS 6
#define MAX_UDP_SOCKETS 4
UDP_SOCKET last_rx_socket=INVALID_UDP_SOCKET;
#CASE // make compiler case sensative
#define UDP_SOURCE_PORT 1024 //set port to receive data from
#define UDP_DESTINATION_PORT 1025 //set port to send data to
#define UDP_NUM_LISTEN_SOCKETS 2 //set maximum number of computers to communicate with
void PicInit(void);
void UDPTxTask(void);
void UDPRxTask(void);
NODE_INFO RemoteNode;
int counter=0,crediti=0,ok=0,w=0;
unsigned char LeggiSeriale[3] = {0xA0, 0x01, 0x01};
char *weekday[] = {"", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab","Dom"};
int8 VoceMenu=0;
unsigned char year = 14;
unsigned char month = 3;
unsigned char date = 12;
unsigned char day = 3;
unsigned char hours = 15;
unsigned char minutes = 9;
unsigned char seconds = 0;
unsigned short pm_am;
register float temp;
void AzzeraBuffer();
void Read_Data();
void RSeriale();
void Read_I2C();
unsigned char ibuffer[4]={0,0,0,0},RX[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void IPAddressInit(void)
{
//IP address of this unit
MY_IP_BYTE1=192;
MY_IP_BYTE2=168;
MY_IP_BYTE3=1;
MY_IP_BYTE4=84;
//network gateway
MY_GATE_BYTE1=192;
MY_GATE_BYTE2=168;
MY_GATE_BYTE3=1;
MY_GATE_BYTE4=254;
//subnet mask
MY_MASK_BYTE1=255;
MY_MASK_BYTE2=255;
MY_MASK_BYTE3=255;
MY_MASK_BYTE4=0;
//MAC address of this unit
MY_MAC_BYTE1=MY_DEFAULT_MAC_BYTE1;
MY_MAC_BYTE2=MY_DEFAULT_MAC_BYTE2;
MY_MAC_BYTE3=MY_DEFAULT_MAC_BYTE3;
MY_MAC_BYTE4=MY_DEFAULT_MAC_BYTE4;
MY_MAC_BYTE5=MY_DEFAULT_MAC_BYTE5;
MY_MAC_BYTE6=MY_DEFAULT_MAC_BYTE6;
}
void main()
{
PicInit();
IPAddressInit();
StackInit();
while(1)
{
StackTask();
UDPRxTask();
UDPTxTask();
if (ibuffer[0]!=0){
printf(lcd_putc,"\nRX: %2X%2X%2X%2X", ibuffer[0],ibuffer[1],ibuffer[2],ibuffer[3]);
ibuffer[0]=0;
UDPDiscard();
delay_ms(200);
}
if (!input(PIN_D0)){
Read_Data();
if (ok==1){
lcd_putc("\fCARD ID:");
printf(lcd_putc,"%2X%2X%2X%2X", RX[3],RX[4],RX[5],RX[6]);
delay_ms(1000);
}
else
UDPDiscard();
}
}
}
void PicInit(void){
LCD_ON;
delay_ms(500);
LCD_OFF;
//DS3231_init();
delay_ms(500);
LCD_ON;
delay_ms(500);
LCD_OFF;
//setDate(day,date,month,year);
//setTime(hours,minutes,seconds,0,0);
lcd_init();
delay_ms(500);
LCD_ON;
delay_ms(500);
LCD_OFF;
lcd_putc("\fReader ETH v1.00\n(c) 2014 Pompili F.");
delay_ms(1000);
enable_interrupts(GLOBAL);
LCD_ON;
}
void AzzeraBuffer(){
for (counter=0;counter<16;counter++)
RX[counter]=0x00;
}
void Read_Data(){
ok=0x0;
crediti=0x0;
RSeriale();
if(RX[1]!=0x01 || RX[2]!=0x00)
{ok=0;return;};
ok=1;
return ;
}
void RSeriale(){
AzzeraBuffer();
i2c_start();
for(counter=0;counter<3;counter++) i2c_write(LeggiSeriale[counter]);
i2c_stop();
delay_ms(200);
Read_I2C();
}
void Read_I2C(){
i2c_start();
i2c_write(0xA1);
RX[0]=i2c_read(1);
for(counter=1;counter<RX[0];counter++)
RX[counter]=i2c_read(1);
RX[counter]=i2c_read(0);
i2c_stop();
}
void UDPRxTask(void) {
static enum {UDP_RX_OPEN=0, UDP_RX_LISTEN=1}
state=0;
static UDP_SOCKET socket=INVALID_UDP_SOCKET;
int8 z=0, c;
if (socket==INVALID_UDP_SOCKET)
state=UDP_RX_OPEN;
switch (state) {
case UDP_RX_OPEN:
socket=UDPOpen(UDP_SOURCE_PORT,NULL,INVALID_UDP_SOCKET);
if (socket!=INVALID_UDP_SOCKET) {
printf("\r\nUDP SOCKET %U OPEN FOR LISTENING", socket);
state=UDP_RX_LISTEN;
}
break;
case UDP_RX_LISTEN:
if (UDPIsGetReady(socket)) {
last_rx_socket=socket;
printf(" SP:%LU DP:%LU S:%U] - ",
UDPSocketInfo[socket].remotePort,
UDPSocketInfo[socket].localPort,
socket
);
while(UDPGet(&c)) {
ibuffer[z]=c;
printf("%u",ibuffer[z]);
z++;
}
}
break;
}
}
void UDPTxTask(void) {
static enum
{UDP_TX_OPEN=2, UDP_TX_WAIT=0, UDP_TX_ISREADY=3} stato=0;
static int8 tx_socket;
switch (stato) {
case UDP_TX_WAIT:
if (tx_socket==INVALID_UDP_SOCKET) {
stato=UDP_TX_OPEN;
}
case UDP_TX_OPEN:
tx_socket=UDPOpen(UDP_SOURCE_PORT, NULL, UDP_DESTINATION_PORT);
if (tx_socket==INVALID_UDP_SOCKET)
{
printf("\r\nCan't open UDP socket for transmit");
stato=UDP_TX_WAIT;
}
else
{
stato=UDP_TX_ISREADY;
}
case UDP_TX_ISREADY:
if ((UDPIsPutReady(tx_socket)) && (RX[3]!=0)) {
UDPPut(RX[3]);
UDPPut(RX[4]);
UDPPut(RX[5]);
UDPPut(RX[6]);
UDPFlush();
AzzeraBuffer();
}
stato=UDP_TX_WAIT;
UDPClose(tx_socket);
}
}
|
|
|