获取MAC地址Xbee Arduino

时间:2014-02-19 20:52:12

标签: arduino xbee

我想获得xbee的MAC地址,但我没有成功。

我有以下代码。

uint8_t myaddress[10];

uint8_t shCmd[] = {'S','H'};
uint8_t slCmd[] = {'S','L'};
AtCommandRequest atRequestSH = AtCommandRequest(shCmd);
AtCommandRequest atRequestSL = AtCommandRequest(slCmd);
AtCommandResponse atResponse = AtCommandResponse();

void getMyAddress(){
  xbee.send(atRequestSH);

  if(xbee.readPacket(5000)){
    if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
      xbee.getResponse().getAtCommandResponse(atResponse);
      if (atResponse.isOk()){
        for(int i = 0; i < atResponse.getValueLength(); i++){
          myaddress[i] = atResponse.getValue()[i];
        }
      }
    }
  }
  delay(1000);
  xbee.send(atRequestSL);

  if(xbee.readPacket(5000)){
    if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
      xbee.getResponse().getAtCommandResponse(atResponse);
      if (atResponse.isOk()){
        for(int i = 0; i < atResponse.getValueLength(); i++){
          myaddress[i+6] = atResponse.getValue()[i];
        }
      }
    }
  }
}

我希望myaddress数组是10个值,因为Xbee MAC地址包含64个字节。

但是数组只包含8个值,例如: 原始Xbee地址为0013a200408a31bb 结果函数getMyAddress013a20408a31bb

我的功能失去了两个零。

我使用以下代码打印MAC地址:

for(int i=0; i < 10; i++)
  Serial.print(myaddress[i], HEX);

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

问题是如果数字小于10,您的函数不会打印前导零。

每个字节之间有空格:00 13 a2 00 40 8a 31 bb

您使用空格打印的内容:0 13 a2 0 40 8a 31 bb

我认为没有一种简单的方法可以使用前导零打印十六进制值,但您可以更改打印方式以在每个字节之间留出空格:

for(int i=0; i < 10; i++) {
    Serial.print(myaddress[i], HEX);
    Serial.print(" ");
}

答案 1 :(得分:1)

MAC地址是64位,即8字节(64位/(8位/字节))。 ATSHATSL都以4字节值进行响应。因此,您应将my address定义为8个字节,并将ATSL复制到myaddress[i+4]

请注意,您可以使用memcpy()而不是循环遍历字节:

memcpy( &myaddress[i+4], atResponse.getValue(), 4);

我不熟悉Arudino的Serial.print(),但如果它不支持打印带前导零的十六进制字节,则可以打印MAC:

for (int i = 0; i < 8; i++) {
    if (myaddress[i] < 0x10) Serial.print( "0");
    Serial.print( myaddress[i], HEX);
}