Simple UDP sending over ethernet

Hi all

I need to send UDP messages to a Brightsign video controller via a direct ethernet cable between the two. I have an Arduino Uno with an Ethernet Shield 2 but am unable to make it work.

I can use my laptop to send to and receive from the Brightsign using the program Packetsender. So I know I have the correct IP and port addresses for the Brightsign and that it is configured correctly to receive UDP messages.

This program is meant to send the string "playsea" to the Brightsign controller to initiate the video playing. There are lights flashing on the Brightsign ethernet socket so some data is being sent, but no action happens. I don't need to receive anything back from the Brightsign, and the Brightsign is always listening.

I have also tried sending the same message to my laptop using the confirmed ethernet port settings for that, but Packetsender is not seeing any data.

It seems like it should be one of those "duh" simple solutions but I can't find it.

here is the code, which compiles without errors.

#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:

byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x10, 0x45 };  // off back of ethernet shield 2
IPAddress ip(192, 168, 1, 177); 
unsigned int localPort = 888;   // local port to listen on


// An EthernetUDP instance to let us send UDP packets

EthernetUDP Udp;

IPAddress remote_Ip(169, 254, 90, 202);    // brightsign ethernet IP
unsigned int remote_Port = 642;            // brightsign listening port

//IPAddress remote_Ip(169, 254, 34, 152);  // laptop ethernet IP
//unsigned int remote_Port = 5000;         // laptop listening port


void setup() {

  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  
}


void loop() {
  
  // send the string "playsea" every 2 seconds to the Brightsign player
  Udp.beginPacket(remote_Ip, remote_Port);
  Udp.write("playsea");
  Udp.endPacket();
   
  delay (2000); 
  
}

many thanks
Greg

Do you have to send any preamble or message terminator around the message ?

.print vs .write ?

try fill all Ethernet.begin parameters

 void begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);

or better use DHCP if it is possible.

do the examples of the Ethernet library work?

Hi lastchancename, I've tried .print with no luck. I am pretty sure there are no preambles or terminations required. The concerning thing is I also get no comms to the laptop program Packetsender, as if the data from the Shield is unrecognizable or such. Does my basic code look like it should work? Is there any configuring I am missing? I have tried 2 shields and I know the ethernet cable and laptop ports are alright. I have yet to try a second Uno however.

Why is the UNO needed? Can't you do the same thing with just an ethernet cable to the PC and appropriate PC software?

Ok, I'll try the rest of the parameters too.

I originally started with one of the examples (https://docs.arduino.cc/tutorials/ethernet-shield-rev2/udp-send-receive-string) with no luck there either. I've stripped the code back to what I thought were the essentials, as I know the actual addresses and don't need to interrogate, and also I only need to send, not receive.

Is there another example I could use to send UDP messages to my laptop to test that aspect of it?

Other than adding in those parameters, does it look like my code should work to just send a UDP string to an ethernet port on a laptop?

The mac address I am using is from a sticker on the back of the shield but has "ABC" in front, not mac. Is this of relevance, or does it even matter if I have the mac address wrong as I aren't needing to receive anything?

As you can see although I have done a lot of other programming I am new to ethernet / UDP comms and this has me stumped.

Many thanks, Greg

Hi Sonofcy, it will be part of a standalone unit for a Museum interactive where a series of buttons and levers can be pulled to activate various lights and things, and also up to 27 different videos. It requires instant bootup and digital inputs and outputs, as well as UDP communications. It could be possible with a Raspberry Pi, but the Arduinos have proved more robust. From what I see this should be able to work OK but I must have something fairly simple wrong I expect. If you can see something wrong or suspect let me know.. it's got me stumped :slightly_smiling_face: Thanks.

Since you indicate some tech background, maybe even some software background, I am surprised that you are not checking the result of each API call. If after a successful compile you just hover over every UDP function you will see the equivalent information as the following. What I am trying to point out is most functions return a code that can be very useful in debugging.


I would also use the RtClick while hovering over the include and clicking on Goto Definition. The EthernetUdp.h is a bit tricky since it is just a wrapper for Ethernet.h. RtClick on Ethernet.h in YOUR sketch and start looking at all the class data and member functions to see if there are any that might help determine what is happening.
I don't have your setup, but maybe I can try the same test as you on a Pi since it does have ethernet. I just don't know what to put on the other end. I think you said you were connected to your PC, how do you do that, my MAC has only USB-C ports but I may have a USB-C to Ethernet adapter but then what?

in an applications in a museum I have used several Raspberry Pi 3B devices to play videos directly from the SD card
been running for several years now

to test the network connection try the WebClient example. it has enhanced diagnostics for initialization

Hover isn't doing anything on my editor, and RtClick just brings up copy, paste and formatting options. I have version 1.8.19 of the ide which might be the issue here. I am pretty old school in my programming, and haven't mastered some debug stuff, so I will download the latest software and try on that, and look at the return information as you suggest. I do wonder now if the problem is in my older software version and the older ethernet and etherntudp code that it includes.

I am using a fairly new HP probook which has an inbuilt ethernet port. I can communicate between the brightssign and this laptop successfully using Packetsender (a port listening and sending program). So the ports, ethernet cable, firewall settings and ip addresses are all correct. However I cannot get the arduino + shield to communicate with either. Lights flash on the computer and Brightsign ports when data is sent from the Arduino which has me assuming it is mostly working, but it is the data itself is unreadable or does have the wrong ip attached possibly.

Ok, install the IDE2, NO need to uninstall 1.8.19, they co-exist. I have had both forever.
I do have a USB-C to ethernet adapter, but I can't remember what I was going to connect to. Maybe a Pi as I don't have any shields for Arduinos.

I think I am stuck, but maybe when you update it will resolve.
Good luck.

you may find this helpful. I use it to share information between several ESp-32s using broadcast UDP messages. It sequences thru several states including one which scans for wifi networks


#ifdef ESP32
# include <WiFi.h>
#elif defined(ESP8266)
# include <ESP8266WiFi.h>
#endif

#include "AsyncUDP.h"

#include "eeprom.h"
#include "node.h"
#include "signals.h"
#include "wifi.h"

int dbgWifi = 1;

static void _wifiScan (void);
static void _wifiMsg  (const char *msg);

// -----------------------------------------------------------------------------
// WiFiClient          wifi;
AsyncUDP udp;

char host [STR_SIZE] = "";
char ssid [STR_SIZE] = "";
char pass [STR_SIZE] = "";

static int  port  = 4445;

// ---------------------------------------------------------
enum { ST_NUL, ST_INIT, ST_CHK, ST_CFG_UDP, ST_UP, ST_ERROR };

const char *wifiStStr [] = {
    "ST_NUL",
    "ST_INIT",
    "ST_CHK",
    "ST_CFG_UDP",
    "ST_UP",
    "ST_ERROR"
};

int state    = ST_NUL;
int stateLst = ST_NUL;

// -------------------------------------
static bool
_wifiCheck (void)
{
    static int           fails = 0;
    static unsigned long msecLst = 0;

    if ( (msec - msecLst) < 1000)
        return false;
    msecLst = msec;

    printf (" %s:", __func__);

#if 0
    if (6 <= fails)  {
        _wifiScan ();
        return false;
    }
#endif

    if (WL_CONNECTED != WiFi.status ())  {
        printf (" not connected\n");
        fails++;
        return false;
   }

   IPAddress ip = WiFi.localIP ();

   printf (" connected %d:%d:%d:%d\n", ip [0], ip[1], ip [2], ip[3]);

   return true;
}

// -------------------------------------
// https://arduino.clanweb.eu/udp-control-esp32.php?lang=en

static void
_wifiCfgUdp (void)
{
    printf (" %s:\n", __func__);

    if (udp.listen (port)) {
        Serial.print ("  UDP Listening on IP: ");
        Serial.println (WiFi.localIP ());

        udp.onPacket ([] (AsyncUDPPacket packet) {
#if 0
            Serial.print   ("UDP Packet Type: ");
            Serial.println (packet.isBroadcast ()
                        ? "Broadcast"
                        : packet.isMulticast () ? "Multicast" : "Unicast" );
            Serial.print   (" From: ");
            Serial.print   (packet.remoteIP ());
            Serial.print   (":");
            Serial.println (packet.remotePort ());
            Serial.print   (" To: ");
            Serial.print   (packet.localIP ());
            Serial.print   (":");
            Serial.println (packet.localPort ());
            Serial.print   (" Length: ");
            Serial.println (packet.length ());
            Serial.print   (" Data: ");
            Serial.write   (packet.data (), packet.length ());
            Serial.println ();
#endif

            _wifiMsg ((const char *) packet.data ());
        });
  }
}

// -------------------------------------
// connect to wifi
void _wifiInit (void)
{
    printf (" %s:\n", __func__);

    _wifiScan ();
    WiFi.mode (WIFI_STA);

    WiFi.hostname (host);

    printf ("%s: ssid %s, pass %s\n", __func__, ssid, pass);
    WiFi.begin (ssid, pass);
}

// -------------------------------------
static void
_wifiMsg (
    const char *msg)
{
    if (dbgWifi)
        printf (" %s:\n", __func__);

    sigMsg (msg);
}

// -------------------------------------
void
wifiReset (void)
{
    printf ("%s: ssid %s, pass %s, host %s\n", __func__, ssid, pass, host);
    state = ST_NUL;
}

// -------------------------------------
// https://openlabpro.com/guide/scanning-of-wifi-on-esp32-controller/
static void
_wifiScan (void)
{
    printf ("%s:\n", __func__);

    // WiFi.scanNetworks will return the number of networks found
    WiFi.mode (WIFI_OFF);
    int nNet = WiFi.scanNetworks ();
    if (nNet == 0) {
        printf ("  %s: no networks found\n", __func__);
    }
    else {
        printf ("  %s: %2d networks found\n", __func__, nNet);
        if (0 > nNet)
            nNet = -nNet;
        for (int i = 0; i < nNet; ++i) {
            printf (" %s: %2d - %s (%d) %s\n", __func__, i,
                WiFi.SSID (i).c_str (),
                WiFi.RSSI (i),
                WiFi.encryptionType (i) == WIFI_AUTH_OPEN ? "open" : "locked");
        }
    }
}

// ---------------------------------------------------------
// common routine for sending strings to wifi and flushing
void
wifiSend (
    const char*  msg )
{
    if (ST_UP != state)
        return;

    if (dbgWifi)  {
        printf ("wifiSend: %s\n", msg);
    }

    udp.broadcast (msg);
}

// -------------------------------------
void
wifiMonitor (void)
{
    if (stateLst != state)
        printf ("%s: %d %s\n", __func__, state, wifiStStr [state]);
    stateLst = state;

    switch (state)  {
    case ST_NUL:
        if (ssid [0])
            state = ST_INIT;
        else {
            printf ("%s: no SSID\n", __func__);
            state = ST_ERROR;
        }
        break;

    case ST_INIT:
        _wifiInit ();
        state = ST_CHK;
        break;

    case ST_CHK:
        if (_wifiCheck ())
            state = ST_CFG_UDP;
        break;

    case ST_CFG_UDP:
        _wifiCfgUdp ();
        state = ST_UP;
        break;

    case ST_UP:
        break;

    case ST_ERROR:
    default:
        break;
    }
}

Thanks heaps sonofcy. I'll give IDE2 a go and hope it reveals something. Will let you know the result :slightly_smiling_face:

Unfortunately the museum has specified the use of Brightsigns. It's a big projection and will be in 4K and needs seamless cuts between video clips.

Once I have the basic coms going there will be 20 switches attached and 27 videos controlled (yep, I will have to transition to a mega too but just want to get the UDP coms side tested on a simple setup first). It looks like it should be simple enough to get working. The Brightsign and laptop happily communicate with each other, I just get nothing between the arduino and either the laptop or Brightsign.

If I can get the laptop receiving UDP messages from the arduino via the inbuilt ethernet port I am pretty sure the Brightsign will work then too.

Thanks Juraj, I will try that

this UDPchat program is running on a Mega with a ethernet shield V1
it communicates with a java program running on a WIN10 PC

// UDCP chat program using Arduino Ethernet Shield

#include <SPI.h>  
#include <Ethernet.h>
#include <EthernetUdp.h>  
#define UDP_TX_PACKET_MAX_SIZE 100 //increase UDP size

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  // MAC address update as required
IPAddress localIP(192, 168, 1, 176);                // local static localIP address
IPAddress remoteIP(192, 168, 1, 65);                // local static localIP address
unsigned int port = 10000;                            // port to receive/transmit

char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet

EthernetUDP Udp;  // An EthernetUDP instance to let us send and receive packets over UDP

void setup() {
  Serial.begin(115200);
  Serial.println("\n\nUDP chat program");
  // select static or dynamic IP initialization
  //Ethernet.begin(mac, localIP);    // static IP initialize Ethernet shield
  if(Ethernet.begin(mac))            // dyname IP initialize Ethernet shield using DHCP
        Serial.println("Configured Ethernet using DHCP OK");
   else Serial.println("Failed to configure Ethernet using DHCP");

  Serial.print("My localIP address: ");    // print local localIP address:
  Serial.println(Ethernet.localIP());
  // Initializes the ethernet UDP library and network settings.
  if (Udp.begin(port)) Serial.println("UDP begin() OK");
  else Serial.println("UDP begin() failed!");
  Serial.print("UDP_TX_PACKET_MAX_SIZE ");
  Serial.println(UDP_TX_PACKET_MAX_SIZE);
}

void loop() {
  // if datagram received read it
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.print(packetSize);         // datagram packet size
    Serial.print(" From ");
    remoteIP = Udp.remoteIP();  // from localIP
    Serial.print(remoteIP);
    Serial.print(", port ");            // from port
    Serial.println(Udp.remotePort());
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    // read the packet into packetBufffer and print contents
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print("Contents: ");
    Serial.println(packetBuffer);
  }
  if (Serial.available()) {   // if text entered read it and send it
    char text[100] = { 0 };
    Serial.readBytesUntil('\n', text, 100);
    Serial.print("Transmitting datagram to ");
    Serial.print(remoteIP);
    Serial.print(" port ");            // from port
    Serial.print(port);
    Serial.print(" data ");
    Serial.println(text);
    Udp.beginPacket(remoteIP, port);   // send to remote localIP and port 999
    Udp.write(text);
    Udp.endPacket();
  }
  delay(10);
}

java program

// UDPchat.java - simple peer-to-peer chat program using UDP
//           - given remote IP address can send strings using UDP datagrams 
//           - will also wait for datagrams and display contents
// remote IP and port are specified via command line - default IP is 127.0.0.1 (i.e. localhost) and port is 1000  
//
// e.g. to send datagrams to IP 146.227.59.130 port 1006
// java chat 146.227.59.130 1006

import java.io.*;
import java.util.*;
import java.net.*;

public class UDPchat extends Thread
{
   private final static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   int port=999;//10001;// 10000;                             // port to send/receive datagrams on
   String remoteIPaddress= "192.168.1.177";//"169.254.144.20";//("192.168.1.8");//127.0.0.1");      // IP to send datagrams

   // constructor, parameter is command line parameters
   public UDPchat(String args[]) throws Exception
    {
    // get remote IP address and port from command line parameters
    if (args.length > 0)    remoteIPaddress =  (args[0]);           // get IPaddress
    if (args.length > 1)    port = Integer.parseInt(args[1]);        // get port number
    System.out.println("chat program: IP address " + InetAddress.getLocalHost().toString() + " port " + port );
    
    start();        // start thread to receive and display datagrams

    // loop waiting for keyboard input, send datagram to remote IP                
    while(true)
      try
        {
        String s = in.readLine();                       // read a String
        System.out.println("Sending to " + remoteIPaddress + " socket " + port + " data: " + s);
        byte[] data = s.getBytes();                                     // convert to byte array
        DatagramSocket theSocket = new DatagramSocket();                // create datagram socket and the datagram
        DatagramPacket   theOutput = new DatagramPacket(data, s.length(), InetAddress.getByName(remoteIPaddress), port);
        theSocket.send(theOutput);                                      // and send the datagram
       }
      catch (Exception e) {System.out.println("Eroor sending datagram " + e);}
    }

   // thread run method, receives datagram and display contents as a string
   public void run()                
        {
          try
              {
              // open DatagramSocket to receive 
              DatagramSocket ds = new DatagramSocket(port);
              // loop forever reading datagrams from the DatagramSocket
              while (true)
                 {
                 byte[] buffer = new byte[65507];                       // array to put datagrams in
                 DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // DatagramPacket to hold the datagram
                 ds.receive(dp);                                     // wait for next datagram
                 String s = new String(dp.getData(),0,dp.getLength());        // get contenets as a String
                 System.out.println("UDP datagram length " + s.length()+ "  from IP " + dp.getAddress() + " received: " + s );
s = "Acknowledge\n";
     //            byte[] data = s.getBytes();                                     // convert to byte array
     //   DatagramSocket theSocket = new DatagramSocket();                // create datagram socket and the datagram
     //   DatagramPacket   theOutput = new DatagramPacket(data, data.length, InetAddress.getByName(remoteIPaddress), port);
    //    theSocket.send(theOutput);                                      // and send the datagram

              }
              }
          catch (SocketException se) {System.err.println("chat error " + se); }
          catch (IOException se) {System.err.println("chat error " + se);}
          System.exit(1);                                                       // exit on error
        }


public static void main(String args[]) throws Exception
{
   UDPchat c=new UDPchat(args);
}

}

mega serial output

UDP chat program
Configured Ethernet using DHCP OK
My localIP address: 192.168.1.177
UDP begin() OK
UDP_TX_PACKET_MAX_SIZE 100
Received packet of size 5 From 192.168.1.65, port 49777
Contents: hello
Transmitting datagram to 192.168.1.65 port 10000 data ok thank you

Transmitting datagram to 192.168.1.65 port 10000 data hello from Mega

Transmitting datagram to 192.168.1.65 port 10000 data test2 from mega

Received packet of size 13 From 192.168.1.65, port 51015
Contents: hello from pc
Received packet of size 23 From 192.168.1.65, port 52938
Contents: test from pc 1234567890

java program console output

F:\Ardunio\Networking\Ethernet\EthernetSheildV1\UDP\ChatProgram>java UDPchat 192.168.1.177 10000
chat program: IP address BB-DELL2/192.168.1.65 port 10000
hello
Sending to 192.168.1.177 socket 10000 data: hello
UDP datagram length 13  from IP /192.168.1.177 received: ok thank you
UDP datagram length 16  from IP /192.168.1.177 received: hello from Mega
UDP datagram length 16  from IP /192.168.1.177 received: test2 from mega
hello from pc
Sending to 192.168.1.177 socket 10000 data: hello from pc
test from pc 1234567890
Sending to 192.168.1.177 socket 10000 data: test from pc 1234567890

what are you running on the laptop to receive the UDP datagrams?

a program called Packetsender, download here:
Packet Sender - Download. (it gives some info and options before going to the download select). I am running win11 but it works with the Brightsign fine but not Arduino. See if you can get it to work with your Mega + Shield. I have tried ethernet shields v1 and v2. Thanks

packet sender works with my Mega
set receiver IP 192.168.1.177 and port 10000

changed mega code to transmit to the remote port the UDP datagram was received from

// UDCP chat program using Arduino Ethernet Shield

#include <SPI.h>  
#include <Ethernet.h>
#include <EthernetUdp.h>  
#define UDP_TX_PACKET_MAX_SIZE 100 //increase UDP size

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  // MAC address update as required
IPAddress localIP(192, 168, 1, 176);                // local static localIP address
IPAddress remoteIP(192, 168, 1, 65);                // local static localIP address
unsigned int port = 10000;                            // port to receive/transmit

char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet

EthernetUDP Udp;  // An EthernetUDP instance to let us send and receive packets over UDP

void setup() {
  Serial.begin(115200);
  Serial.println("\n\nUDP chat program");
  // select static or dynamic IP initialization
  //Ethernet.begin(mac, localIP);    // static IP initialize Ethernet shield
  if(Ethernet.begin(mac))            // dyname IP initialize Ethernet shield using DHCP
        Serial.println("Configured Ethernet using DHCP OK");
   else Serial.println("Failed to configure Ethernet using DHCP");

  Serial.print("My localIP address: ");    // print local localIP address:
  Serial.println(Ethernet.localIP());
  // Initializes the ethernet UDP library and network settings.
  if (Udp.begin(port)) Serial.println("UDP begin() OK");
  else Serial.println("UDP begin() failed!");
  Serial.print("UDP_TX_PACKET_MAX_SIZE ");
  Serial.println(UDP_TX_PACKET_MAX_SIZE);
}

void loop() {
  // if datagram received read it
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.print(packetSize);         // datagram packet size
    Serial.print(" From ");
    remoteIP = Udp.remoteIP();  // from localIP
    Serial.print(remoteIP);
    Serial.print(", port ");            // from port
    Serial.println(Udp.remotePort());
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    // read the packet into packetBufffer and print contents
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print("Contents: ");
    Serial.println(packetBuffer);
  }
  if (Serial.available()) {   // if text entered read it and send it
    char text[100] = { 0 };
    Serial.readBytesUntil('\n', text, 100);
    Serial.print("Transmitting datagram to ");
    Serial.print(remoteIP);
    Serial.print(" port ");            // from port
    Serial.print(port);
    Serial.print(" data ");
    Serial.println(text);
    Udp.beginPacket(remoteIP, Udp.remotePort());   // send to remote localIP and port 999
    Udp.write(text);
    Udp.endPacket();
  }
  delay(10);
}

mega serial output

UDP chat program
Configured Ethernet using DHCP OK
My localIP address: 192.168.1.177
UDP begin() OK
UDP_TX_PACKET_MAX_SIZE 100
Received packet of size 17 From 192.168.1.65, port 61050
Contents: packsender test 1
Transmitting datagram to 192.168.1.65 port 10000 data hello from mega

Received packet of size 28 From 192.168.1.65, port 61050
Contents: packsender test 2 1234567890
Transmitting datagram to 192.168.1.65 port 10000 data test2 from mega

have you setup your firewall to pass UDP packets ?

do you know the Brightsign IP address and UDP receiving port? how?

Excellent Horace, thanks for trying that. I will setup a mega with same code tomorrow and see how I go (although I assume it should be OK on an UNO too?) I have tried updating the Arduino ide to 2.3.6 and no change there, also tried a new uno and ethernet cable with no luck either.

I also loaded the example UDBSendReceiveString and the associated processing sketch which all compiled fine, but I still see no data received or transmitted. The serial output reported no errors either, so it is detecting the shield and connection etc OK.

The Brightsign displays its IP on bootup, and I can set the listening and transmitting ports in the Brightsign configuration. I am sure these are correct too because I can communicate with it via PacketSender fine using those values. This also seems to indicate my firewall settings are OK.

Are the mac address values critical or does it just overwrite any firmware ones with the values specified in byte mac []? I have tried the default ones in the UDPSendReceiveString sketch, and also the ones that are on a sticker on the back of the shield. I assume the latter should be correct. However I started this project with a V1 shield that didn't have any MAC address info on it so I did wonder how would I know it was if it was indeed critical?

As a note the sticker on the back of the V2 shield has the letters ABC before the address values, rather than MAC.. is this of concern?

As said I will give your code a go tomorrow. Thanks so much for that. It almost seems like I have a hardware issue but I have swapped out everything except the laptop, which communicates fine with the Brightsign so I assume it is fine there.

It is going to be one of those small silly mistakes I am sure, I just hope I get to the bottom of it soon.

Thanks again, Greg