element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
    About the element14 Community
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      •  Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Arduino
  • Products
  • More
Arduino
Arduino Forum Ethernet problem sending null characters
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Arduino to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Not Answered
  • Replies 21 replies
  • Subscribers 418 subscribers
  • Views 2901 views
  • Users 0 members are here
  • client
  • client.print
  • ethernet
  • client.write
Related

Ethernet problem sending null characters

e14 Contributor
e14 Contributor over 13 years ago

Thank you in advance for your kind help.

I am using the Ethernet Library (client.print function) to access an electronic device which supports TCP/IP.

I must send a command string to the device that contains several NULL characters. I cannot send the string since the first NULL character terminates the transmission.

I tried sending 1 byte at a time and that works when sent to a VB.NET simulator that I wrote, however, it doesn't work with the device I am trying to use. I think the device may be expecting the entire command to be contained in a single packet. I tried using a string object and that didn't work either.

I need to be able to specify the data and its length and send it as a single packet.

Can anyone out there help me ?

Thanks,

Nick

Attachments:
EthernetCode.txt.zip
  • Sign in to reply
  • Cancel

Top Replies

  • e14 Contributor
    e14 Contributor over 13 years ago in reply to mcb1 +1
    Mark, I haven't tried with firefox, but I doubt that would make a difference. Be sure to copy & paste the quoted material first into your draft post before highlighting it in the draft, and then clicking…
  • billabott
    billabott over 13 years ago +1
    make a quote out of something you paste into a message, you don't have to quote the previous message, then delete everything in the quote, and then paste into the empty quote. In Firefox, the e14 UI Editor…
  • mcb1
    mcb1 over 13 years ago in reply to e14 Contributor +1
    Be sure to copy & paste the quoted material first into your draft post before highlighting it in the draft, and then clicking the "quote" icon. Are that be the difference ..... I wasn't pasting it in and…
Parents
  • e14 Contributor
    0 e14 Contributor over 13 years ago

    Thanks Bill,

     

    I am communicating with an RFID Reader. The command I am sending to the device is not a string of null but contains zeroes as part of the required command string. The device is not hanging up but the command is not getting to it since the transmission is truncated on the first null character. The TCP connection remains open as it should. Is there an escape character that I can include in the message that will prevent the library function from treating the NULL as a string termination character?

     

    Here is the code.

     

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

        byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x8D, 0x46 };                 // Enter the MAC address of the controller
        char ip[] = "192.168.1.107";                                         // Enter the I/P address of the RFID reader
        char port[] = "3000";                                                // Enter the I/P port of the RFID reader
       
        char poll_msg[]  = { 0x0A, 0xFF, 0x09, 0x88, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0xFF };
        int  msg_size    = 0;

    // Initialize the Ethernet client library
        EthernetClient rfidClient;

    //================================================================================
    void setup()
    {
    // Open serial communications and wait for port to open:
        Serial.begin(9600); 
        while (!Serial) { 
          ; // wait for serial port to connect. Needed for Leonardo only 
        } 
        delay(3000); 
        Serial.println("Initializing..."); 

    // Get IP Address
        if (Ethernet.begin(mac) == 0) {
          Serial.println("Failed to configure Ethernet using DHCP"); 
          // no point in carrying on, so do nothing forevermore:
          while(true);
        }
    // Give the Ethernet shield a second to initialize:
        delay(1000);
    }

    //================================================================================
    void loop()
    {
        int     n = 0;
        int     inp_len = 0;
        char    *pch;

    //* OPEN CONNECTION TO RFID READER

        rfidClient = connectServer(ip, port);
        if (!rfidClient.connected())
        {
          Serial.println("  *** Connection failed ***"); 
          return;
        }

    //* POLL RFID READER

        while (true) {
          delay(2000);
          msg_size = sizeof(poll_msg);
          sendMessageRFID(rfidClient, poll_msg, msg_size);
        }
    }

    //================================================================================
    EthernetClient connectServer(char * addr, char * port)
    {
        EthernetClient client;
        byte ip[4];
        int  iport = 80;
        int  count;
        char out_data[60] = "";

    //* INITIALIZATION

        count = sscanf(addr, "%hhu.%hhu.%hhu.%hhu", &ip[0],&ip[1],&ip[2],&ip[3]);
        iport=atoi(port);

    //* MAIN PROCESSING

        if (count == 4) {
          client.connect(ip, iport);
        }
        else {
          client.connect(addr, iport);
        }
        return client;
    }

    //================================================================================
    int sendMessageRFID(EthernetClient client, char * out_msg, int len)
    {
        int      n = 0;
        String   send_data = "";

    //* MAIN PROCESSING

      //* THIS DOES NOT WORK. MESSAGE IS TERMINATED PREMATURELY.

        client.print(out_msg);

      //* THIS DOES NOT WORK. MESSAGE IS TERMINATED PREMATURELY.

        for (n = 0; n < len; n++)
        {
          send_data += String(out_msg[n]);
        }
        client.print(send_data);

      //* THIS WORKS WITH SIMULATOR BUT NOT WITH DEVICE ( PERHAPS DUE TO MULTIPLE PACKETS ??? )

        for (n = 0; n < len; n++)
        {
          client.print(out_msg[n]);
        }

    }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • billabott
    0 billabott over 13 years ago in reply to e14 Contributor

    Ok. RFID data.  So the sketch being run on your UNO is not parsing the data the way you want it to because 0x00 is embedded in the string but it is not supposed to be taken to mean /0, string termination.  I think it will be necessary to convert the binary data to ASCII before sending it along. 

     

    If memory serves, Jeremy Blum did a very good tutorial on the RFID.  You may want to look at it and the supporting sketch.

    There should also be examples with working sketches at adafruit.com, parallax.com, and sparkfun.com.

     

    -Happy Trails

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • e14 Contributor
    0 e14 Contributor over 13 years ago in reply to billabott

    I am not sure what you mean by parsing the data or what this has to do with RFID. The problem has has to do with sending a byte via TCP (NULL) which the function (client.print) treats as a termination character. If the function allowed me to specify the number of bytes to send, everything would work fine.

     

    Also, I am sending ASCII data. A binary 00000000 = hex 00 = ascii NUL = /0. Aparently, when the Ethernet library was created, the author may not have considered this situation since the Internet uses the HTTP protocol. The device that I am using was originally designed for a serial interface with TCP added later.

     

    I appreciate your direction and will check out the sites you have referenced. I am not familiar with Jeremy Blum but will google his name.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • billabott
    0 billabott over 13 years ago in reply to e14 Contributor

    I said to encode ZERO as ASCII 40 = 0x30 instead of 0x00.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • e14 Contributor
    0 e14 Contributor over 13 years ago in reply to billabott

    I can't do that. The device requires the actual hex data that I specified. If it would accept text, I could send an Ascii zero.

     

    If I can't find a way to do what I am trying to do, I can communicate to the device's serial port.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • billabott
    0 billabott over 13 years ago in reply to e14 Contributor

    As I understand it:

    1:  the serial device is attached to SOME piece of hardware

    2:  the hardware on the receiving end does a conversion from TCP/ethernet to serial data input to the device

    3: you are convinced that the embedded NUL character is a problem

     

    I suggest that you then MUST encode the data to successfully transmit packet.

    Opt A:  Invert all the bits

    Opt B:  Interleave binary 1s  via XOR 0x11 with every byte.

    Opt C:  Add binary 1 to every byte.

     

    It follows that you will have to implement a decode capability on the receiving side.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Reply
  • billabott
    0 billabott over 13 years ago in reply to e14 Contributor

    As I understand it:

    1:  the serial device is attached to SOME piece of hardware

    2:  the hardware on the receiving end does a conversion from TCP/ethernet to serial data input to the device

    3: you are convinced that the embedded NUL character is a problem

     

    I suggest that you then MUST encode the data to successfully transmit packet.

    Opt A:  Invert all the bits

    Opt B:  Interleave binary 1s  via XOR 0x11 with every byte.

    Opt C:  Add binary 1 to every byte.

     

    It follows that you will have to implement a decode capability on the receiving side.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Children
No Data
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube