首先,我需要使用 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 模式读取。提前致谢。