极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 45664|回复: 21

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

[复制链接]
发表于 2014-4-14 23:17:58 | 显示全部楼层 |阅读模式
RT,最近突然有这么个需求。因为使用Arduino作为控制器,将一些数据存在SD卡中,每次想获得数据都要把SD卡取下来放进读卡器里存到电脑中,而这时的Arduino却一直用USB连着电脑,总觉得要是直接能通过USB把文件传送到PC中是件很完美的事情。

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

Arduino:
  1. #include <SD.h>

  2. File photoFile;
  3. const int buttonPin = 7;
  4. const int ledPin =  5;


  5. void setup(){

  6.   Serial.begin(115200);

  7.   pinMode(buttonPin,INPUT);
  8.   pinMode(ledPin,OUTPUT);

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

  11.   if (!SD.begin(10)) {
  12.     Serial.print("sd initialzation failed");
  13.     return;
  14.   }
  15.   //Serial.println("sd initialization done");
  16. }


  17. void loop(){

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

  21.     while(digitalRead(buttonPin) == LOW);
  22.     if(digitalRead(buttonPin) == HIGH){
  23.       delay(50);

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

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

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

  32.           photoFile.close();
  33.           digitalWrite(ledPin,LOW);   
  34.         }  

  35.         else {
  36.           Serial.println("error sending photo");
  37.         }            
  38.       }
  39.       //Serial.println("photo sent");   
  40.     }
  41.   }
  42. }
复制代码


Processing:
  1. import processing.serial.*;

  2. Serial myPort;
  3. OutputStream output;


  4. void setup() {

  5.   size(320, 240);

  6.   //println( Serial.list() );
  7.   myPort = new Serial( this, Serial.list()[0], 115200);
  8.   myPort.clear();

  9.   output = createOutput("pic02.jpg");
  10. }


  11. void draw() {

  12.   try {
  13.     while ( myPort.available () > 0 ) {
  14.       output.write(myPort.read());
  15.     }
  16.   }
  17.   catch (IOException e) {
  18.     e.printStackTrace();
  19.   }
  20. }


  21. void keyPressed() {

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

  26.   catch (IOException e) {
  27.     e.printStackTrace();
  28.   }
  29. }
复制代码


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

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

使用道具 举报

发表于 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端串口通信。建立一个同样格式的文件,然后一位一位收就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-15 14:41:24 | 显示全部楼层
leicheng 发表于 2014-4-15 09:17
首先通过USB串口发送的速度也就115200baud,14KBPS左右,速度比较慢。copy16M字节的内容超过1000秒,所以这个 ...

什么其他方式呢?有没有成熟的例子或者库?
回复 支持 反对

使用道具 举报

发表于 2014-4-15 14:47:19 | 显示全部楼层
麽麽茶㊣ 发表于 2014-4-15 11:02
Serial.write(photoFile.read());
意思串口一位一位的写,那就PC端串口通信。建立一个同样格式的文件,然后 ...

就是这么简单。。你想太多了。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-16 00:39:18 | 显示全部楼层
麽麽茶㊣ 发表于 2014-4-15 14:47
就是这么简单。。你想太多了。。

丢失数据怎么办
回复 支持 反对

使用道具 举报

发表于 2014-4-16 09:25:16 | 显示全部楼层
shenhaiyu 发表于 2014-4-16 00:39
丢失数据怎么办

还真没碰到过。。今天SD卡到货  我试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-16 10:18:24 | 显示全部楼层
麽麽茶㊣ 发表于 2014-4-16 09:25
还真没碰到过。。今天SD卡到货  我试试看

嗯,发个测试贴,让大家也学习学习
回复 支持 反对

使用道具 举报

发表于 2014-4-16 16:35:02 | 显示全部楼层
shenhaiyu 发表于 2014-4-16 10:18
嗯,发个测试贴,让大家也学习学习

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

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


  7.   if (!SD.begin(chipSelect)) {  //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not present
  8.     Serial.println("Card failed, or not present");
  9.     return;
  10.   }
  11.   Serial.println("card initialized.");  //与SD卡通信成功,串口输出信息card initialized.
  12. }
复制代码
128的板子在压力测试。。只能等明天了。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-16 17:18:18 | 显示全部楼层
麽麽茶㊣ 发表于 2014-4-16 16:35
我现在用的是MEGA2560,各种连不上。。
** MOSI - pin 51
** MISO - pin 50

期待你的测试结果哈~~~
回复 支持 反对

使用道具 举报

发表于 2014-8-10 15:38:05 | 显示全部楼层
@shenhaiyu,最近也在做一个小东西,看到你的帖子,SD卡通过USB送至PC,不知道成功否?
回复 支持 反对

使用道具 举报

发表于 2014-8-10 18:06:35 | 显示全部楼层
本帖最后由 沧海笑1122 于 2014-8-10 18:16 编辑

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

还有一个思路就是蓝牙SD卡。
回复 支持 反对

使用道具 举报

发表于 2014-8-16 18:27:40 | 显示全部楼层
本帖最后由 沧海笑1122 于 2014-8-16 18:29 编辑

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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-28 10:04:00 | 显示全部楼层
沧海笑1122 发表于 2014-8-16 18:27
可以写上位机程序,直接访问SD卡上的TXT文件。
TB上就有SD延长线,可以把两根线改成一个双头延长线。
这是 ...

还是第一个更实用
回复 支持 反对

使用道具 举报

发表于 2014-11-25 16:39:48 | 显示全部楼层
楼主测试成功了吗?请问内容中含有中文的txt是如何传送的啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 13:43 , Processed in 0.040780 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表