1

首先,我需要使用 Arduino + SD shield 将 jpeg 格式的照片从 SD 卡中提取到我的计算机中。所以,我做了一个草图,打开一张测试照片(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 模式读取。提前致谢。

4

1 回答 1

0

使用 OutputStream 而不是 PrintWriter 并修改处理代码为我解决了这个问题: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();
  }
}
于 2013-09-14T12:04:38.493 回答