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

Binary 在PC上以二进制格式从Arduino接收jpeg照片,binary,arduino,jpeg,sd-card,binaryfiles,Binary,Arduino,Jpeg,Sd Card,Binaryfiles,首先,我需要使用Arduino+SD屏蔽将jpeg格式的照片从SD卡提取到我的计算机。因此,我制作了一个草图,打开一张测试照片(formula.jpg),并将二进制代码打印到串行控制台。为了在文件中包含二进制代码,我使用了另一个在Processing中编写的程序,该程序读取串行控制台并将输出写入.txt文件(formula.txt) 我的目标是用.jpg的二进制代码编写.txt文件,然后将其重命名为.jpg,这样如果代码正确,我就有我的照片了。尽管如此,当原始文件为490kB时,我收到一个大小为

首先,我需要使用Arduino+SD屏蔽将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的二进制文件打印到串行控制台的代码

#包括
SdFat sd;
SdFile-myFile;
常数int chipSelect=10;
无效设置(){
序列号开始(115200);
如果(!sd.begin(chipSelect,SPI全速))sd.initErrorHalt();
如果(!myFile.open(“formula.jpg”,O_READ)){
sd.errorHalt(“打开文件进行读取失败”);
}
Serial.println(“formula.jpg:”);
int数据;
而((data=myFile.read())>=0)Serial.write(data);
myFile.close();
}
void loop(){}
//安装后不会发生任何事情
下面是编写.txt文件的处理代码

//接收二进制数据
输入处理。串行。*;
串行myPort;//从串行类创建对象
打印机输出;
短端口指数=0;
字符头=':';
无效设置()
{
//打开连接到Arduino的任何串行端口。
字符串portName=Serial.list()[portIndex];
println(Serial.list());
println(“连接到->”+Serial.list()[portIndex]);
myPort=新序列号(此端口名为115200);
输出=createWriter(“formula.txt”);
}
作废提款()
{ 
if(myPort.read()==HEADER)//after HEADER是jpg二进制文件
{
字节[]inBuffer=新字节[7];
while(myPort.available()>0){
inBuffer=myPort.readBytes();
if(inBuffer!=null){
字符串值=新字符串(inBuffer);
输出。打印(值);
印刷品(价值);
}}}}
如果我能找到一种方法来实现这一点,我会非常高兴,因为我这样做不仅仅是为了实验。我需要从损坏的SD卡中提取一些照片,只有在相机和电脑上显示死机时,我才能从Arduino SPI模式中读取这些照片。
提前感谢。

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

import processing.serial.*;
串行端口;
输出流输出;
无效设置(){
尺寸(320240);
myPort=new Serial(这是Serial.list()[0],115200);
myPort.clear();
output=createOutput(“test.jpg”);
}
作废提款(){
试试{
而(myPort.available()>0){
output.write(myPort.read());
}
} 
捕获(IOE异常){
e、 printStackTrace();
}
}
按下void键(){
试试{
output.flush();//将剩余数据写入文件
output.close();//完成文件
} 
捕获(IOE异常){
e、 printStackTrace();
}
}