shenhaiyu 发表于 2014-4-14 23:17:58

求助,如何通过Arduino自身的USB将SD卡中的文件(任意大小)发送到PC呢?

RT,最近突然有这么个需求。因为使用Arduino作为控制器,将一些数据存在SD卡中,每次想获得数据都要把SD卡取下来放进读卡器里存到电脑中,而这时的Arduino却一直用USB连着电脑,总觉得要是直接能通过USB把文件传送到PC中是件很完美的事情。

查找了好多资料,只有一个人成功的将SD卡中的jpg图片发送给电脑端的processing了:
http://forum.arduino.cc/index.php/topic,124022.new.html

Arduino:
#include <SD.h>

File photoFile;
const int buttonPin = 7;
const int ledPin =5;


void setup(){

Serial.begin(115200);

pinMode(buttonPin,INPUT);
pinMode(ledPin,OUTPUT);

//Serial.println("initializing sd card");
pinMode(10,OUTPUT);          // CS pin of SD Card Shield

if (!SD.begin(10)) {
    Serial.print("sd initialzation failed");
    return;
}
//Serial.println("sd initialization done");
}


void loop(){

while(1){
    // Serial.println("press the button to send picture");
    Serial.flush();   

    while(digitalRead(buttonPin) == LOW);
    if(digitalRead(buttonPin) == HIGH){
      delay(50);

      if(digitalRead(buttonPin) == HIGH){
      delay(200);
      File photoFile = SD.open("pic02.jpg");

      if (photoFile) {
          while (photoFile.position() < photoFile.size()) {

            digitalWrite(ledPin,HIGH);                     
            Serial.write(photoFile.read());
          }

          photoFile.close();
          digitalWrite(ledPin,LOW);   
      }

      else {
          Serial.println("error sending photo");
      }            
      }
      //Serial.println("photo sent");   
    }
}
}


Processing:
import processing.serial.*;

Serial myPort;
OutputStream output;


void setup() {

size(320, 240);

//println( Serial.list() );
myPort = new Serial( this, Serial.list(), 115200);
myPort.clear();

output = createOutput("pic02.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();
}
}

对于这个方案我有两个疑问:
1.传送的jpg没有大小限制吗?
2.processing可以制作成独立的文件接收小程序吗?

希望高手们都来研究研究,在这里先谢过了~~~~

leicheng 发表于 2014-4-15 09:17:18

首先通过USB串口发送的速度也就115200baud,14KBPS左右,速度比较慢。copy16M字节的内容超过1000秒,所以这个想法实用性不高。另外,传输10几K或上M字节的文件,如果没有差错校验机制,很难保证没有若干个字符传错,传图片的话就会出现显示不一致等等。但如果加入复杂的传输协议,估计arduino的sram不够用。可行性好的话早就有人做了。建议用其他方式传输。

麽麽茶㊣ 发表于 2014-4-15 11:02:45

Serial.write(photoFile.read());
意思串口一位一位的写,那就PC端串口通信。建立一个同样格式的文件,然后一位一位收就行了。

shenhaiyu 发表于 2014-4-15 14:41:24

leicheng 发表于 2014-4-15 09:17 static/image/common/back.gif
首先通过USB串口发送的速度也就115200baud,14KBPS左右,速度比较慢。copy16M字节的内容超过1000秒,所以这个 ...

什么其他方式呢?有没有成熟的例子或者库?

麽麽茶㊣ 发表于 2014-4-15 14:47:19

麽麽茶㊣ 发表于 2014-4-15 11:02 static/image/common/back.gif
Serial.write(photoFile.read());
意思串口一位一位的写,那就PC端串口通信。建立一个同样格式的文件,然后 ...

就是这么简单。。你想太多了。。

shenhaiyu 发表于 2014-4-16 00:39:18

麽麽茶㊣ 发表于 2014-4-15 14:47 static/image/common/back.gif
就是这么简单。。你想太多了。。

丢失数据怎么办

麽麽茶㊣ 发表于 2014-4-16 09:25:16

shenhaiyu 发表于 2014-4-16 00:39 static/image/common/back.gif
丢失数据怎么办

还真没碰到过。。今天SD卡到货我试试看

shenhaiyu 发表于 2014-4-16 10:18:24

麽麽茶㊣ 发表于 2014-4-16 09:25 static/image/common/back.gif
还真没碰到过。。今天SD卡到货我试试看

嗯,发个测试贴,让大家也学习学习

麽麽茶㊣ 发表于 2014-4-16 16:35:02

shenhaiyu 发表于 2014-4-16 10:18 static/image/common/back.gif
嗯,发个测试贴,让大家也学习学习

我现在用的是MEGA2560,各种连不上。。
** MOSI - pin 51
** MISO - pin 50
** CLK - pin 52
** CS - pin 40const int chipSelect = 40;//设定CS接口

void setup()
{
Serial.begin(9600);//设置串口通信波特率为9600
Serial.print("Initializing SD card...");//串口输出数据Initializing SD card...
pinMode(53, OUTPUT);


if (!SD.begin(chipSelect)) {//如果从CS口与SD卡通信失败,串口输出信息Card failed, or not present
    Serial.println("Card failed, or not present");
    return;
}
Serial.println("card initialized.");//与SD卡通信成功,串口输出信息card initialized.
}128的板子在压力测试。。只能等明天了。。

shenhaiyu 发表于 2014-4-16 17:18:18

麽麽茶㊣ 发表于 2014-4-16 16:35 static/image/common/back.gif
我现在用的是MEGA2560,各种连不上。。
** MOSI - pin 51
** MISO - pin 50


期待你的测试结果哈~~~

沧海笑1122 发表于 2014-8-10 15:38:05

@shenhaiyu,最近也在做一个小东西,看到你的帖子,SD卡通过USB送至PC,不知道成功否?

沧海笑1122 发表于 2014-8-10 18:06:35

本帖最后由 沧海笑1122 于 2014-8-10 18:16 编辑

我有个想法,回头验证一下。
就是把SD卡的八只管脚引出来,然后连接到一个SD卡读卡器上。设一个切换开关,在SD卡向PC传输数据时,把它与arduino的联系切断。这样,在SD卡作为arduino存储工作时,与PC没有联系。反之,对PC来说,就是一个经过SD卡读卡器的外存,你可以任意处理SD卡上的文件了。

还有一个思路就是蓝牙SD卡。

沧海笑1122 发表于 2014-8-16 18:27:40

本帖最后由 沧海笑1122 于 2014-8-16 18:29 编辑

可以写上位机程序,直接访问SD卡上的TXT文件。
TB上就有SD延长线,可以把两根线改成一个双头延长线。
这是取自TB的一个示意图。


不过,我自己现在还是觉得采用两个方案:
一是用串口发送,需要有专用的上位机程序,我还写不了,有高手在写,如果能用最好。
二是直接拔卡。这个延长线的方案,不会很小巧。

shenhaiyu 发表于 2014-8-28 10:04:00

沧海笑1122 发表于 2014-8-16 18:27 static/image/common/back.gif
可以写上位机程序,直接访问SD卡上的TXT文件。
TB上就有SD延长线,可以把两根线改成一个双头延长线。
这是 ...

还是第一个更实用

ForzaBello 发表于 2014-11-25 16:39:48

楼主测试成功了吗?请问内容中含有中文的txt是如何传送的啊?
页: [1] 2
查看完整版本: 求助,如何通过Arduino自身的USB将SD卡中的文件(任意大小)发送到PC呢?