This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

ARM blue pill does not respond correctly

I use blue pill ARM-based board and XBee module. the module should communicate with other Xbees and according to data received, do appropriate task. the code in one MC connected to a module is as follow:

#include <XBee.h>
#include <XBeeGenDef.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port PB1 on the Board
#define ONE_WIRE_BUS 33
#define TEMPERATURE_PRECISION 9 // Lower resolution

void flashLed(int pin, int times, int wait);
int handleMsg();

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);


// union to convery float to byte string
union u_tag {
uint8_t b[2];
float fval;
} function;

union u_tag1 {
uint8_t b[4];
float fval;
} msg;


#define  WorkingLED  PC13
#define  PushBottom  PA11
#define  StatusLED   PA15
#define  ErrorLED    PA12

uint8_t payloadRX[6] = {0};

bool msgStatus;
int count;
float temperature = 0;

XBee xbee = XBee();

XBeeAddress64 addCoord = XBeeAddress64(0X0013A200,0X40C2651F);
XBeeAddress64 addRout2 = XBeeAddress64(0X0013A200,0X40C8E51F);

ZBTxRequest zBTxReq;
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
XBeeResponse response = XBeeResponse();
ZBRxResponse zBRxRes = ZBRxResponse();


void setup() 
{
// Set up pins
pinMode(PushBottom, INPUT);
pinMode(WorkingLED,OUTPUT);
pinMode(StatusLED,OUTPUT);
pinMode(ErrorLED,OUTPUT);
digitalWrite(StatusLED,LOW);

// Set up Serial ports
Serial1.begin(9600);
Serial.begin(9600);
xbee.begin(Serial1);

// Start up the library
sensors.begin(); 
flashLed(WorkingLED,3,300);
}


void loop() 
{
if (digitalRead(PushBottom) == HIGH)
{
payloadRX[0] = {'0'};
payloadRX[1] = {'1'};
zBTxReq.setPayload(payloadRX);
zBTxReq.setPayloadLength(sizeof(payloadRX));
zBTxReq.setAddress64(addRout2);
xbee.send(zBTxReq);
//flashLed(WorkingLED,1,100);

if(xbee.readPacket(1000))
{
if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE)
{
xbee.getResponse().getZBTxStatusResponse(txStatus);
if (txStatus.getDeliveryStatus() == SUCCESS)
{
flashLed(StatusLED,5,50);
} else
{
flashLed(ErrorLED,3,500);
}
}
} else if (xbee.getResponse().isError())
{
flashLed(ErrorLED, 2, 500);
} else
{
flashLed(ErrorLED, 1, 500);
}
}

xbee.readPacket();
if(xbee.getResponse().isAvailable())
{

if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
{
flashLed(WorkingLED,5,150);
xbee.getResponse().getZBRxResponse(zBRxRes);

for (int i = 0; i < zBRxRes.getDataLength(); i++) 
{
payloadRX[i] = zBRxRes.getData()[i];
}

if (handleMsg() == FLASH_LED)
{
flashLed(WorkingLED,5,1000);
}

if (handleMsg() == READ_PIN)
{
payloadRX[0] = {'0'};
payloadRX[1] = {'2'};
if (digitalRead(PushBottom) == HIGH)
{
payloadRX[2] = {'H'};
payloadRX[3] = {'I'};
payloadRX[4] = {'G'};
payloadRX[5] = {'H'};
} else if (digitalRead(PushBottom) == LOW)
{
payloadRX[2] = {'L'};
payloadRX[3] = {'O'};
payloadRX[4] = {'W'};
}
zBTxReq.setPayload(payloadRX);
zBTxReq.setPayloadLength(sizeof(payloadRX));
zBTxReq.setAddress64(addRout2);
xbee.send(zBTxReq);
flashLed(WorkingLED,5,150);

if(xbee.readPacket(1000))
{
if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE)
{
xbee.getResponse().getZBTxStatusResponse(txStatus);
if (txStatus.getDeliveryStatus() == SUCCESS)
{
flashLed(StatusLED,5,50);
} else
{
flashLed(ErrorLED,3,500);
}
}
} else if (xbee.getResponse().isError())
{
flashLed(ErrorLED, 2, 500);
} else
{
flashLed(ErrorLED, 1, 500);
}
}

if (handleMsg() == READ_TEMPERATURE)
{
flashLed(WorkingLED, 5, 150);
//sensors.requestTemperatures();
//temperature = sensors.getTempCByIndex(0);
//Serial.print(" C  ");
//Serial.print(temperature);
payloadRX[0]='0';
payloadRX[1]='3';
//msg.fval = temperature;
/*for (int i=0;i<4;i++)
{
payloadRX[i+2]=msg.b[i];
}*/

//zBTxReq.setPayloadLength(sizeof(payloadRX));
//zBTxReq.setPayload(payloadRX);
//zBTxReq.setAddress64(zBRxRes.getRemoteAddress64());
//zBTxReq.setAddress64(addCoord);

zBTxReq = ZBTxRequest(addCoord, payloadRX, sizeof(payloadRX));

xbee.send(zBTxReq);
flashLed(WorkingLED,5,150);

if(xbee.readPacket(1000))
{
if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE)
{
xbee.getResponse().getZBTxStatusResponse(txStatus);
if (txStatus.getDeliveryStatus() == SUCCESS)
{
flashLed(StatusLED,5,50);
} else
{
flashLed(ErrorLED,3,500);
}
}
} else if (xbee.getResponse().isError())
{
flashLed(ErrorLED, 2, 500);
} else
{
flashLed(ErrorLED, 1, 500);
}
}
} else 
{
// not something we were expecting
flashLed(ErrorLED, 1, 25);    
}
}
//flashLed(WorkingLED, 1, 2000);
Serial1.flush(); 
}

int handleMsg()
{
if (payloadRX[0] == '0' && payloadRX[1] == '1')
{
return FLASH_LED;
} else if (payloadRX[0] == '0' && payloadRX[1] == '2')
{
return READ_PIN;
} else if (payloadRX[0] == '0' && payloadRX[1] == '3')
{
return READ_TEMPERATURE;
} else if (payloadRX[0] == '0' && payloadRX[1] == '4')
{
return READ_HUMIDITY;
} else if (payloadRX[0] == '0' && payloadRX[1] == '5')
{
return WRITE_PIN;
}
}

void flashLed(int pin, int times, int wait) 
{
for (int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(wait);
digitalWrite(pin, LOW);
delay(wait);
}
}

The problem is when a module send a data, the code does not respond correctly. when ask flashing, it does not respond all the request, and for reading tempreature, it does not respond at all.

Parents
  • I don't have XBee board so that I can only give generic suggestions.

    "does not respond" covers too much possibilities.

    Can you have some debug methods to monitor the bus transaction e.g. hardware bus waveforms? You have to make sure the data is sent out correctly.

    On the other hand, do you have chances to verify the data is received or not after it is sent out successfully?

    If the data is received, you can check further if the memory attributes are configured properly for the "does not respond for flashing" case.

Reply
  • I don't have XBee board so that I can only give generic suggestions.

    "does not respond" covers too much possibilities.

    Can you have some debug methods to monitor the bus transaction e.g. hardware bus waveforms? You have to make sure the data is sent out correctly.

    On the other hand, do you have chances to verify the data is received or not after it is sent out successfully?

    If the data is received, you can check further if the memory attributes are configured properly for the "does not respond for flashing" case.

Children
No data