首页 > 解决方案 > 使用 Xbee 进行单播图像传输

问题描述

社区

我一直在使用 xbee s2b pro 模块和 Arduino Mega 进行图像传输。主要任务是将jpeg串行相机拍摄的jpg图像传输到发射器并将其发送到接收器的microSD存储器,但我一直在处理一个独特的问题,我需要2秒的延迟来发送和接收成功 1 字节,如果我设置的秒数更少,我会丢失信息并且收据图像会损坏。在这里你会看到我的代码:

发射器代码:

byte ZERO = 0x00;
byte incomingbyte;
long int a=0x0000,j=0,k=0,count=0,i=0;
uint8_t MH,ML;
boolean EndFlag=0;

void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void SendTakePhotoCmd();
void SendReadDataCmd();
void StopTakePhotoCmd();

void setup()
{   
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
} 
Serial1.begin(38400);
}

void loop()
{
byte a[32];
int ii;
SendResetCmd();
delay(4000);                            
SendTakePhotoCmd();
delay(1000);     
while(Serial1.available()>0)
{
incomingbyte=Serial1.read();
}
while(!EndFlag)
{
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(20); 
while(Serial1.available()>0)
{
incomingbyte=Serial1.read();
k++;
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9))     //tell if the picture is finished
EndFlag=1;
j++;
count++;
}
}
for(j=0;j<count;j++)
{
Serial.write(a[j]);
delay(2000);// observe the image through serial port
}
i++;
} 
while(1);
}

void SendResetCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x26);
Serial1.write(ZERO);
}

void SetImageSizeCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x31);
Serial1.write(0x05);
Serial1.write(0x04);
Serial1.write(0x01);
Serial1.write(ZERO);
Serial1.write(0x19);
Serial1.write(0x11);
}

void SetBaudRateCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x24);
Serial1.write(0x03);
Serial1.write(0x01);
Serial1.write(0x2A);
Serial1.write(0xC8);

}

void SendTakePhotoCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x36);
Serial1.write(0x01);
Serial1.write(ZERO);
}

void SendReadDataCmd()
{
MH=a/0x100;
ML=a%0x100;
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x32);
Serial1.write(0x0c);
Serial1.write(ZERO);
Serial1.write(0x0a);
Serial1.write(ZERO);
Serial1.write(ZERO);
Serial1.write(MH);
Serial1.write(ML);
Serial1.write(ZERO);
Serial1.write(ZERO);
Serial1.write(ZERO);
Serial1.write(0x20);
Serial1.write(ZERO);
Serial1.write(0x0a);
a+=0x20;
}

void StopTakePhotoCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x36);
Serial1.write(0x01);
Serial1.write(0x03);
}

收货人代码:

#include <SD.h>
#include <SPI.h>

File myFile;
int pinCS = 53; // Pin 10 on Arduino Uno

void setup() 
{
  Serial.begin(9600);
  pinMode(pinCS, OUTPUT);
   if (!SD.begin()) {
    return;
  }
}

void loop() {
  byte buf[5000];
  if (Serial.available()>0)
  {
      myFile = SD.open("imgrx.jpg", FILE_WRITE);
      Serial.readBytes(buf,sizeof(buf));
      Serial.println((byte)*buf);
      myFile.write((byte)*buf);
      while(Serial.available()>0) Serial.read();
   }
  else{
    myFile.close();
  }
}

我也尝试过 MicroSD -> XBEE -> MicroSD 并且问题继续存在,也许我已经通过了一些东西,我想告诉我在哪里。让我添加这些方法给我的图像与我发送的图像相同,所以即使缓慢,它也非常有效。我更改了波特率但没有成功。Xbee 地址以单播方式连接。我也尝试只使用 Serial.readBytes 并且我得到了更快的字节,但作为十进制值并且不可读。

我非常感谢任何解决此问题的信息或经验方法。对我的问题有什么不明白的地方可以问我。谢谢

标签: imagearduinojpegxbeetransmission

解决方案


一些入门建议:

  • 将波特率提高到 115200 以增加进出 XBee 的吞吐量。
  • 将硬件流控制添加到您的设置中,以便您知道 XBee 模块何时“充满”排队数据且未接收。
  • 在 XBee 模块上切换到 API 模式,并使用最大有效负载大小生成 API 帧。
  • 在发送下一个数据包之前,等待出站传输帧上的传输状态响应。

XBee 802.15.4 模块(包括 Zigbee 和 DigiMesh)不是为高吞吐量而设计的。它们是低功耗、远程设备,您很幸运能够获得 10kbytes/秒。


推荐阅读