Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 基于Xbee的单播图像传输_Image_Arduino_Jpeg_Xbee_Transmission - Fatal编程技术网

Image 基于Xbee的单播图像传输

Image 基于Xbee的单播图像传输,image,arduino,jpeg,xbee,transmission,Image,Arduino,Jpeg,Xbee,Transmission,社区 我一直在使用xbee s2b pro模块和Arduino Mega进行图像传输。主要任务是在发射器上传输由jpeg串行照相机拍摄的jpg图像,并将其发送到接收器上的microSD内存,但我一直在处理一个独特的问题,我需要2秒的延迟才能成功发送和接收1个字节,如果设置的秒数少于2秒,我会丢失信息,并且接收图像会损坏。在这里,您将看到我的代码: 变送器代码: byte ZERO = 0x00; byte incomingbyte; long int a=0x0000,j=0,k=0,count

社区

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

变送器代码:

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);
}
字节零=0x00;
字节输入字节;
长整数a=0x0000,j=0,k=0,count=0,i=0;
uint8_t MH,ML;
布尔端标志=0;
void SendResetCmd();
void SetBaudRateCmd();
void SetImageSizeCmd();
void sendtakepotocmd();
void SendReadDataCmd();
void stoptakepotocmd();
无效设置()
{   
Serial.begin(9600);
而(!串行){
;//等待串行端口连接。仅Leonardo需要
} 
Serial1.begin(38400);
}
void循环()
{
字节a[32];
int ii;
SendResetCmd();
延迟(4000);
sendtakepotocmd();
延迟(1000);
while(Serial1.available()>0)
{
incomingbyte=Serial1.read();
}
而(!EndFlag)
{
j=0;
k=0;
计数=0;
SendReadDataCmd();
延迟(20);
while(Serial1.available()>0)
{
incomingbyte=Serial1.read();
k++;
如果((k>5)&(j0)Serial.read();
}
否则{
myFile.close();
}
}
我也尝试了MicroSD->XBEE->MicroSD,但问题仍然存在,可能我遇到了一些问题,我想告诉我在哪里。让我添加这些方法,使我的图像与我发送的图像相同,所以即使速度较慢,也非常有效。我更改了波特率,但没有成功。XBEE地址以单播方式连接。我也尝试了只使用Serial.readBytes,我得到的字节更快,但作为十进制值,无法读取


我非常感谢您提供任何解决此问题的信息或经验。如果您对我的问题有任何不了解,请向我咨询。谢谢您提供一些初步建议:

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

XBee 802.15.4模块(包括Zigbee和DigiMesh)不是为高吞吐量而设计的。它们是低功耗的远程设备,您可以幸运地获得每秒10KB的数据。

欢迎使用堆栈溢出!这看起来比严格需要的代码要多。您能否减少代码,直到有一个能证明您的问题的解决方案?这将增加您获得好答案的机会。还有Arduino Stack Exchange站点,您可能需要首先研究它。感谢您的感谢。
#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();
  }
}