在PC上以二进制格式从Arduino接收jpeg照片

时间:2013-09-11 18:03:30

标签: binary arduino jpeg sd-card binaryfiles

首先,我需要使用Arduino + SD屏蔽将SD卡中的jpeg格式照片提取到我的电脑。所以,我做了一个草图,打开一张测试照片(formula.jpg)并将二进制代码打印到串行控制台。要在文件中包含二进制代码,我使用在Processing中编写的另一个程序来读取串行控制台并将输出写入.txt文件中。(formula.txt)。

我的目标是使用.jpg的二进制代码编写.txt文件,然后将其重命名为.jpg,这样如果代码没问题,我会得到我的照片。虽然,当原始版本为490kB时,我会收到一个大小为790kB的文件。我在.txt中打开了原始照片,我看到代码几乎与我从arduino收到的代码相似但是对于某些符号,我得到了“替换符号”(带有问号的黑色菱形)或其他东西或者可能添加了另一个符号......

像这样:

Original: Ψΰ JFIF  H H  Ϋ C 
Received: �Ψ�ΰ JFIF  H H  �Ϋ C 

Original: Y_¤PΡ€Q,
Received: Y_¤PΡ�€Q, 

因为我对此完全陌生而且我知道你不能搞乱二进制文件我需要一些代码帮助和一些指导来实现这一目标。

以下是将.jpg二进制打印到串行控制台的代码。

#include <SdFat.h>

SdFat sd;
SdFile myFile;
const int chipSelect = 10;

void setup() {
Serial.begin(115200);

if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt();

if (!myFile.open("formula.jpg", O_READ)) {
sd.errorHalt("opening file for read failed");
}
Serial.println("formula.jpg:");

int data;
while ((data = myFile.read()) >= 0) Serial.write(data);

myFile.close();
}

void loop() {}    
// nothing happens after setup

这是写入.txt文件的处理代码

// ReceiveBinaryData
import processing.serial.*;

Serial myPort; // Create object from Serial class
PrintWriter output;

short portIndex = 0;
char HEADER = ':';

void setup()
{
// Open whatever serial port is connected to Arduino.
String portName = Serial.list()[portIndex];
println(Serial.list());
println(" Connecting to -> " + Serial.list()[portIndex]);
myPort = new Serial(this, portName, 115200);

output = createWriter("formula.txt");
}

void draw()
{ 
if( myPort.read() == HEADER) // after header is the jpg binary
{
  byte[] inBuffer = new byte[7];
  while (myPort.available() > 0) {
  inBuffer = myPort.readBytes();
  if (inBuffer != null) {
   String value = new String(inBuffer);
   output.print(value);
   print(value);
}}}}

如果我能找到实现这个目标的方法,我会很高兴,因为我不是仅仅为了实验而做。我需要从损坏的SD卡中提取一些照片,只有当它在相机和计算机上显示死机时才可以从Arduino SPI模式读取。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用OutputStream而不是PrintWriter并修改Processing代码解决了我的问题:D

import processing.serial.*;

Serial myPort;
OutputStream output;

 void setup() {

  size(320, 240);
  myPort = new Serial( this, Serial.list()[0], 115200);
  myPort.clear();

  output = createOutput("test.jpg");
}

void draw() {

  try { 
    while ( myPort.available () > 0 ) {
      output.write(myPort.read());
    }
  } 
  catch (IOException e) {
    e.printStackTrace();
  }
}


void keyPressed() {

  try { 
    output.flush();  // Writes the remaining data to the file
    output.close();  // Finishes the file
  } 

  catch (IOException e) {
    e.printStackTrace();
  }
}