Одноадресная передача изображений с использованием Xbee - PullRequest
0 голосов
/ 26 апреля 2018

сообщество

Я работал над передачей изображений с использованием модулей xbee s2b pro и Arduino Mega . Основная задача - передать изображение jpg, снятое последовательной камерой jpeg на передатчике, и отправить его в память 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, и я получил байты быстрее, но в виде десятичных значений и не читается.

Буду очень признателен за любой информационный или опытный подход к решению этой проблемы. Спроси меня о том, что ты не понимаешь в моем вопросе. Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Некоторые стартовые рекомендации:

  • Увеличьте скорость в бодах до 115200, чтобы увеличить пропускную способность к / от XBee.
  • Добавьте аппаратное управление потоком к вашей установке, чтобы вы знали, когда модуль XBee «заполнен» данными в очереди и не получает.
  • Переключитесь в режим API на своих модулях XBee и сгенерируйте кадры API, используя максимальный размер полезной нагрузки.
  • Перед отправкой вашего следующего пакета дождитесь ответа о состоянии передачи в ваших исходящих кадрах передачи.

Модули XBee 802.15.4 (включая Zigbee и DigiMesh) не были рассчитаны на высокую пропускную способность. Это маломощные устройства большой дальности, на которые вам посчастливится получить 10 Кбайт / с.

...