Pages: [1]   Go Down
Author Topic: XBEE quits working after while <Mostly resolved>  (Read 1064 times)
0 Members and 1 Guest are viewing this topic.
Washington
Offline Offline
God Member
*****
Karma: 38
Posts: 790
Firefox & Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have having some problems with making two XBEE Series 1 stay in communications.
I am running them at 115200 baud rate to transfer real time audio across the link.
I have it setup to run without 802.15.4 ACKS to make the latency very low.
One Xbee is connected to an XBee USB explorer and the other is connected to an Arduino.
The audio quality is pretty good but then it suddenly stops playing after between 5 and 90 seconds and I need to unplug and reconnect the TX XBee and restart the sender application before it will link up again until it stops working again.
Here is the sender code (very ugly):
Code:
#include <stdio.h>
#include <fcntl.h>
#include <windows.h>

int main(){
// Open the serial port.
HANDLE hPort = CreateFile ("COM6", // Pointer to the name of the port
                      GENERIC_READ | GENERIC_WRITE,
                                    // Access (read-write) mode
                      1,            // Share mode
                      NULL,         // Pointer to the security attribute
                      OPEN_EXISTING,// How to open the serial port
                      0,            // Port attributes
                      NULL);        // Handle to port with attribute
                                    // to copy


DCB PortDCB;

// Initialize the DCBlength member.
PortDCB.DCBlength = sizeof (DCB);

// Get the default port setting information.
GetCommState (hPort, &PortDCB);

// Change the DCB structure settings.
PortDCB.BaudRate = 115200;              // Current baud
PortDCB.fBinary = TRUE;               // Binary mode; no EOF check
PortDCB.fParity = FALSE;               // Enable parity checking
PortDCB.fOutxCtsFlow = TRUE;         // No CTS output flow control
PortDCB.fOutxDsrFlow = FALSE;         // No DSR output flow control
PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
                                      // DTR flow control type
PortDCB.fDsrSensitivity = FALSE;      // DSR sensitivity
PortDCB.fTXContinueOnXoff = FALSE;     // XOFF continues Tx
PortDCB.fOutX = FALSE;                // No XON/XOFF out flow control
PortDCB.fInX = FALSE;                 // No XON/XOFF in flow control
PortDCB.fErrorChar = FALSE;           // Disable error replacement
PortDCB.fNull = FALSE;                // Disable null stripping
PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
                                      // RTS flow control
PortDCB.fAbortOnError = FALSE;        // Do not abort reads/writes on
                                      // error
PortDCB.ByteSize = 8;                 // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY;            // 0-4=no,odd,even,mark,space
PortDCB.StopBits = ONESTOPBIT;        // 0,1,2 = 1, 1.5, 2

// Configure the port according to the specifications of the DCB
// structure.
SetCommState (hPort, &PortDCB);
CloseHandle(hPort);
char buf[32];
long x;
FILE *snd = fopen("C:\\thq.wav", "rb");
FILE *ser = fopen("COM6", "wb");
while(!feof(snd)){
fread(&buf, 32, 1, snd);
fwrite(&buf, 32, 1, ser);
for(x = 0;x < 2000;x++){asm("nop");}
}
}


and the receiver code:
Code:
void setup(){
  Serial.begin(115200); //Begin serial link to XBee
  pinMode(11, OUTPUT);
  TCCR2B = TCCR2B & 0b11111000 | 0x1; //Enable fast PWM
}
void loop(){
  if(Serial.available()){analogWrite(11, Serial.read());} //Play samples as we get them
}
I really do not understand why the Xbee keeps needing to be reset.

Thanks in advance.
« Last Edit: July 17, 2012, 01:42:27 pm by smeezekitty » Logged

Avoid throwing electronics out as you or someone else might need them for parts or use.
Solid state rectifiers are the only REAL rectifiers.
Resistors for LEDS!

Detroit, MI
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm not sure I understand your first code-snippet. Could you explain what its supposed to do? It looks like it is eventually supposed to stop sending, since I dont see any sort of 'loop' function to keep it going indefinitely.
Logged

Washington
Offline Offline
God Member
*****
Karma: 38
Posts: 790
Firefox & Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm not sure I understand your first code-snippet. Could you explain what its supposed to do? It looks like it is eventually supposed to stop sending, since I dont see any sort of 'loop' function to keep it going indefinitely.
Ooops... I should have clarified. The first code is Windows code that is run on a computer to read a .wav file and send it over the XBee. The second is the Arduino code the reads from the XBee and converts it to PWM audio.

It does have a loop though
Code:
while(!feof(snd)){

These XBees seem to be a bit finicky to get to work correctly...

Thank you for the reply though.
Logged

Avoid throwing electronics out as you or someone else might need them for parts or use.
Solid state rectifiers are the only REAL rectifiers.
Resistors for LEDS!

Grand Blanc, MI, USA
Offline Offline
Faraday Member
**
Karma: 95
Posts: 4085
CODE is a mass noun and should not be used in the plural or with an indefinite article.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

XBees are pretty robust IMHO but they are basically low-bandwidth devices. How big is the .wav file being sent? Could easily be overrunning the XBee's buffer. I might try implementing flow control.
Logged

MCP79411/12 RTC ... "One Million Ohms" ATtiny kit ... available at http://www.tindie.com/stores/JChristensen/

Washington
Offline Offline
God Member
*****
Karma: 38
Posts: 790
Firefox & Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

XBees are pretty robust IMHO but they are basically low-bandwidth devices.
I know they are not quite up to the task but it is an interesting challenge and works pretty well when its working.
Quote
How big is the .wav file being sent?
Fairly large around 1 MB. 11100 Hz 8 bit audio and several minutes long.
Quote
Could easily be overrunning the XBee's buffer.
I thought that could have been the problem but I couldn't figure out how to implement flow control properly.
Quote
I might try implementing flow control.
That would be helpful since I don't know much about flow control on serial ports.

Thanks again.

Logged

Avoid throwing electronics out as you or someone else might need them for parts or use.
Solid state rectifiers are the only REAL rectifiers.
Resistors for LEDS!

Washington
Offline Offline
God Member
*****
Karma: 38
Posts: 790
Firefox & Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In case it helps, when it stops working the TX light stays on on the computer side but the RSSI light goes off on the remote side.
Also the TX Xbee will not respond to X-CTU queries until it is reset.
Logged

Avoid throwing electronics out as you or someone else might need them for parts or use.
Solid state rectifiers are the only REAL rectifiers.
Resistors for LEDS!

Australia
Offline Offline
God Member
*****
Karma: 11
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The problem is the 115200 kbs speed rate.
If you read the specs on the Xbee series 1 , its only capable of a sustained thruput of 80 kbs.
http://www.digi.com/support/kbase/kbaseresultdetl?id=2213

You will be overrunning the Xbees transmit buffer.
You either need to drop the speed to 80 kbs or less, or implement flow control.
Logged

Washington
Offline Offline
God Member
*****
Karma: 38
Posts: 790
Firefox & Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I think I fixed it!
I noticed when I send audio over an XBee link, it needs to be sampled at 11100 to play at the right speed but at 115200 baud, the audio should be sampled at 11520 to play the correct speed (115200 / 10 bits). I concluded the XBee is running somewhat slower then 115200 baud! So I set the baud rate on the Arduino and the TX program to 111000 instead of 115200 and so far it hasn't stopped working.

----edit----
So basically even though the XBEE may work ok for short communications at 115200, the true baud rate is somewhat lower and long communications may get cut off.
« Last Edit: July 16, 2012, 07:59:31 pm by smeezekitty » Logged

Avoid throwing electronics out as you or someone else might need them for parts or use.
Solid state rectifiers are the only REAL rectifiers.
Resistors for LEDS!

Pages: [1]   Go Up
Jump to: