使用Xbee进行单播图像传输

时间:2018-04-26 16:22:43

标签: image arduino jpeg xbee transmission

社区

我一直在使用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 - &gt; XBEE - &gt; MicroSD也在那里继续麻烦,也许我已经通过了一些事情,我想告诉我在哪里。让我添加这些方法给我的图像与我发送的图像相同,所以即使很慢,它也非常有效。我没有任何成功地更改了波特率。 Xbee地址以单播方式连接。我也尝试过只使用Serial.readBytes,我的字节速度更快但是十进制值并且不可读。

我非常感谢任何解决此问题的信息或经验方法。问我关于我的问题你不明白的任何事情。感谢

1 个答案:

答案 0 :(得分:0)

一些开始的建议:

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

XBee 802.15.4模块(包括Zigbee和DigiMesh)并未设计用于高吞吐量。它们是低功耗,远程设备,您可以幸运地获得10kbytes /秒。