BT serial problems
been banging head against wall on forever. i've got pile of arduinos here...some ngs, duemilanoves, , bts. i've built sketch serve data on serial port in response requests read in on serial port. the ngs , duemilanoves run charm... the bts...well...don't.
problem is, whenever try use client connect bt boards, following error: unable open port : resource busy. i can't view data on serial connections in serial monitor, either. the communication fails after reboot, arduino ide open , closed, , serial monitor open , closed. i've tried 2 bt boards. sometimes, when change loop() following:
void loop() {
digitalwrite(13,high);
serial.println("test");
}
i'm going nuts here, , have have running right away. can point me in right direction? by way, problem occurs on of several computers i've paired boards to.
my client program--based off of found here: http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/--is available see at: http://codepad.org/anf8idjo i'm quite sure client isn't problem, though...everything runs clockwork when i'm not using these !$&@ing bts.
thank you!
///////////////////////
sketch.pde:
/* arduino bt serial server
* -------------------
* sketch sets provides data analog pins client
* connecting on serial port. data not streamed
* continuously, provides data when requested.
*
* version 0.1
* copyright 2009 brennon bortz <brennon@brennonbortz.com>
*
*/
#define pins_in_use 2
int incoming_byte, good_byte; // incoming serial data
int analog_0 = 0;
int analog_1 = 1;
int analog_2 = 2;
int analog_3 = 3;
int analog_4 = 4;
int analog_5 = 5;
int pin_data[pins_in_use];
void setup() {
serial.println("setup()");
serial.begin(115200); // opens serial port, sets data rate 115200 bps
int i;
for (i = 0; < pins_in_use; ++i) {
pin_data = 0;
serial.print("pin_data[");
serial.print(i); serial.print("]: ");
serial.println(pin_data);
int testval = 0xfa;
}
}
typedef enum {
dsendanalog0start = 0,
dsendanalog1start = 1,
dsendanalog2start = 2,
dsendanalog3start = 3,
dsendanalog4start = 4,
dsendanalog5start = 5,
dsendanalog0end = 6,
dsendanalog1end = 7,
dsendanalog2end = 8,
dsendanalog3end = 9,
dsendanalog4end = 10,
dsendanalog5end = 11,
rxfail = 12,
rxsuccess = 13,
txfail = 14,
txsuccess = 15,
txreqfail = 16,
txreqsuccess = 17,
dsendanalog = 18,
rawdatastart = 19,
rawdataend = 20
} messages;
void handle_request(int incoming_byte) {
// parse input
// if pin data requested refresh data array pin
// pass requested value write_adata_to_serial
refresh_pin_data(incoming_byte);
write_data(dsendanalog, incoming_byte);
}
void refresh_all_data() {
// loop through pins number pins_in_use
// write reading data array
int i;
for (i = 0; < pins_in_use; ++i) {
refresh_pin_data(i);
}
}
void refresh_pin_data(int incoming_byte) {
// read pin data , write data array
pin_data[incoming_byte] = analogread(incoming_byte);
}
bool write_data(int message, int data) {
serial.println("write_data()");
if (!write_byte(rawdatastart)) {
return false;
}
if (message == dsendanalog) {
serial.println("sending analog data");
int i;
int bytes[2];
bytes[0] = 255;
bytes[1] = 254;
for (i = 0; < 2; ++i) {
if (!write_byte(bytes)) {
return false;
}
}
serial.println("analog data sent");
}
if (!write_byte(rawdatastart)) {
return false;
}
}
bool write_byte(int data) {
serial.println("write_byte()");
int rxsuccess = 0;
int data_read;
while (rxsuccess != 1) {
if (serial.available() > 0) {
serial.println(data);
data_read = serial.read();
if (data_read == rxsuccess)
rxsuccess = 1;
}
}
if (rxsuccess == 1) {
return true;
} else {
return false;
}
}
bool check_byte(int incoming_byte) {
digitalwrite(13, high);
delay(250);
digitalwrite(13, low);
// known messages lie between 0-5
if (incoming_byte >= 0 && incoming_byte <= 5) {
serial.print("got message: ");
serial.println(incoming_byte, dec);
return true;
} else {
serial.print("no match message: ");
serial.println(incoming_byte, dec);
return false;
}
}
void loop() {
digitalwrite(13,high);
// send data when receive data:
if (serial.available() > 0) {
// read incoming byte:
incoming_byte = serial.read();
// if byte matches known pattern acknowledge receipt of byte
good_byte = check_byte(incoming_byte);
if (good_byte == true) {
// acknowledge receipt of byte
int = 1;
serial.println(txreqsuccess, byte);
serial.println(txreqsuccess, dec);
// handle request
handle_request(incoming_byte);
} else {
// send fail message
serial.println(txreqfail, byte);
serial.println(txreqfail, dec);
}
serial.println("test");
}
}
problem is, whenever try use client connect bt boards, following error: unable open port : resource busy. i can't view data on serial connections in serial monitor, either. the communication fails after reboot, arduino ide open , closed, , serial monitor open , closed. i've tried 2 bt boards. sometimes, when change loop() following:
void loop() {
digitalwrite(13,high);
serial.println("test");
}
i'm going nuts here, , have have running right away. can point me in right direction? by way, problem occurs on of several computers i've paired boards to.
my client program--based off of found here: http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/--is available see at: http://codepad.org/anf8idjo i'm quite sure client isn't problem, though...everything runs clockwork when i'm not using these !$&@ing bts.
thank you!
///////////////////////
sketch.pde:
/* arduino bt serial server
* -------------------
* sketch sets provides data analog pins client
* connecting on serial port. data not streamed
* continuously, provides data when requested.
*
* version 0.1
* copyright 2009 brennon bortz <brennon@brennonbortz.com>
*
*/
#define pins_in_use 2
int incoming_byte, good_byte; // incoming serial data
int analog_0 = 0;
int analog_1 = 1;
int analog_2 = 2;
int analog_3 = 3;
int analog_4 = 4;
int analog_5 = 5;
int pin_data[pins_in_use];
void setup() {
serial.println("setup()");
serial.begin(115200); // opens serial port, sets data rate 115200 bps
int i;
for (i = 0; < pins_in_use; ++i) {
pin_data = 0;
serial.print("pin_data[");
serial.print(i); serial.print("]: ");
serial.println(pin_data);
int testval = 0xfa;
}
}
typedef enum {
dsendanalog0start = 0,
dsendanalog1start = 1,
dsendanalog2start = 2,
dsendanalog3start = 3,
dsendanalog4start = 4,
dsendanalog5start = 5,
dsendanalog0end = 6,
dsendanalog1end = 7,
dsendanalog2end = 8,
dsendanalog3end = 9,
dsendanalog4end = 10,
dsendanalog5end = 11,
rxfail = 12,
rxsuccess = 13,
txfail = 14,
txsuccess = 15,
txreqfail = 16,
txreqsuccess = 17,
dsendanalog = 18,
rawdatastart = 19,
rawdataend = 20
} messages;
void handle_request(int incoming_byte) {
// parse input
// if pin data requested refresh data array pin
// pass requested value write_adata_to_serial
refresh_pin_data(incoming_byte);
write_data(dsendanalog, incoming_byte);
}
void refresh_all_data() {
// loop through pins number pins_in_use
// write reading data array
int i;
for (i = 0; < pins_in_use; ++i) {
refresh_pin_data(i);
}
}
void refresh_pin_data(int incoming_byte) {
// read pin data , write data array
pin_data[incoming_byte] = analogread(incoming_byte);
}
bool write_data(int message, int data) {
serial.println("write_data()");
if (!write_byte(rawdatastart)) {
return false;
}
if (message == dsendanalog) {
serial.println("sending analog data");
int i;
int bytes[2];
bytes[0] = 255;
bytes[1] = 254;
for (i = 0; < 2; ++i) {
if (!write_byte(bytes)) {
return false;
}
}
serial.println("analog data sent");
}
if (!write_byte(rawdatastart)) {
return false;
}
}
bool write_byte(int data) {
serial.println("write_byte()");
int rxsuccess = 0;
int data_read;
while (rxsuccess != 1) {
if (serial.available() > 0) {
serial.println(data);
data_read = serial.read();
if (data_read == rxsuccess)
rxsuccess = 1;
}
}
if (rxsuccess == 1) {
return true;
} else {
return false;
}
}
bool check_byte(int incoming_byte) {
digitalwrite(13, high);
delay(250);
digitalwrite(13, low);
// known messages lie between 0-5
if (incoming_byte >= 0 && incoming_byte <= 5) {
serial.print("got message: ");
serial.println(incoming_byte, dec);
return true;
} else {
serial.print("no match message: ");
serial.println(incoming_byte, dec);
return false;
}
}
void loop() {
digitalwrite(13,high);
// send data when receive data:
if (serial.available() > 0) {
// read incoming byte:
incoming_byte = serial.read();
// if byte matches known pattern acknowledge receipt of byte
good_byte = check_byte(incoming_byte);
if (good_byte == true) {
// acknowledge receipt of byte
int = 1;
serial.println(txreqsuccess, byte);
serial.println(txreqsuccess, dec);
// handle request
handle_request(incoming_byte);
} else {
// send fail message
serial.println(txreqfail, byte);
serial.println(txreqfail, dec);
}
serial.println("test");
}
}
hi brennon,
i guess might not related problem.
in iwrap3 user guide of wt-11 bluetooth chip, find known issue in chapter 10:
"if hw flow control not used , iwrap buffers filled
either in data or command mode, firmware hang
and needs physical reset. bug in csr
firmware."
as possible workaround can change code send data, when client software connected , listening (use start command, or rts/dtr or cd pin of wt-11).
miket
i guess might not related problem.
in iwrap3 user guide of wt-11 bluetooth chip, find known issue in chapter 10:
"if hw flow control not used , iwrap buffers filled
either in data or command mode, firmware hang
and needs physical reset. bug in csr
firmware."
as possible workaround can change code send data, when client software connected , listening (use start command, or rts/dtr or cd pin of wt-11).
miket
Arduino Forum > Forum 2005-2010 (read only) > Software > Interfacing > BT serial problems
arduino
Comments
Post a Comment