I use the “regular” out of the box mode with xBees and they are yet another serial link, always giving me everything in order received. They do buffer and then send, so I think you can overrun the buffer. I would call millis() after every send and save the value in an unsigned long. Then the next time you are about to send, subtract that value from the current millis() value to make sure that data has had time to go out. I would also send a packet with a specific start and end character and an expected number of bytes in between to make sure they are good.
I planned to, and for some projects it makes sense, but for my first use there are times when I want one satellite unit to respond to a peer when they are both out of range of the base. So I actually have a from and to address as part of my own custom format. Messages are short and infrequent, so it isn’t a big processing drain for all units to get them and have most decide to ignore them. I got an extra unit that I put on a USB Explorer so I can watch all the traffic.
Anyway, straight out of the box, they should work fine but if there is other traffic on the same frequency you will get it and have to discard it.
Once that works, then I would worry with adding the IDs. Then you will know whether or not the issue is related to ID processing or not. If you can’t get messages with factory configuration then you may be getting interference from some other device.
Are you doing anything to be sure you don’t overflow on the Tx end? The baud rate at which you communicate with the xBee module is not the guaranteed baud rate that characters are delivered at. Try starting with overkill, like a delay(50) after you send each character. If that works, reduce the number until it fails again and you can determine the actual aggregate rate you are getting.
A delay of 1000 between each character? If you can’t send one character per second at close range using factory defaults then one of your xBee units is bad. You should see a a data rate of over 500 characters per second even at medium range.
But just to make sure - your diagnostic has to be at the send end first and needs to have e a timeout.
I can’t help you with the Coordinator and End Device issues. I wanted a more equal peer relationship, so I implemented my own protocol. An observation I can make is that your test indicates that the End Device has the correct address for the Coordinator. Other assumptions are still assumptions…
Home Brewed Party Line - I made that up. I have not used the configuration utility on mine. I have the 900 Pros. Out of the box, I turned a couple on and found I could send back and forth as if there were a wire, but it is inherently half duplex. I turned on a third and found it was receiving all transmissions from the other two. In the overall system I am working on, there is a base unit but several scenarios where it is out of range or not functioning. I can’t reveal details, but it is very important that individual elements of the system should continue to work together if at all possible.
Anyway, I send short infrequent packets with collision avoidance and detection. That is a fancy way of saying I make sure there is no data coming in right now before I send and none coming in right after I send. A few specific packets require acknowledgement and will be resent on an interval until acknowledged. The unit’s address (my conceptual address) is used to compute resend intervals so that colliding units will not stay in synch.
My packets are ASCII so I can read them, separated by CRLF. I always start with a particular letter, followed by 4 hex numerals, 2 for from address and 2 for to address, a 3 character command and however many parameters I need after that each preceded with a comma. Easy to read, import and manipulate. Most packets are under 20 characters and all are under 60. It is rare to have more than one unit transmitting more frequently than every few minutes and when more than one are frequently transmitting, it is usually query/response.