首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于Xbee的单播图像传输

基于Xbee的单播图像传输
EN

Stack Overflow用户
提问于 2018-04-26 08:22:43
回答 1查看 255关注 0票数 0

社区

我一直在使用xbee s2b pro模块和Arduino Mega进行s2b图像传输。主要任务是在发送端发送由jpeg串行相机拍摄的jpg图像,并将其发送到接收端的microSD内存,但我一直在处理一个独特的问题,我需要延迟2秒才能连续发送和接收1字节,如果设置的秒较短,丢失信息和接收图像就会被破坏。在这里你会看到我的密码:

发射机代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}

接收机代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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,并使Bytes更快,但作为十进制值,是不可读的。

我非常希望有任何资料或经验来解决这个问题。问我关于我问题的任何你不明白的问题。谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-04-27 07:33:18

一些起始建议:

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

XBee 802.15.4模块(包括Zigbee和DigiMesh)不是为高吞吐量而设计的。他们是低功耗,远程设备,你将幸运地得到10千字节/秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50047829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文