从Arduino以太网屏蔽读取文件

时间:2016-12-07 17:46:59

标签: arduino client-server buffer ethernet

我正在尝试使用Arduino Uno从以太网屏蔽上的SD卡读取图片的二进制数据,然后通过以太网电缆将二进制数据发送到我的计算机。当我尝试运行代码时,我得到一个奇怪的错误消息,我无法找出原因。

#include<SD.h>
#include <SPI.h>
#include <String.h>
#include <Ethernet2.h>
byte mac[]={0xB0,0xCD,0xAE,0x0F,0xDE,0x10};
IPAddress ip(169,254,95,37); //client ip for Andrew-Laptop
//IPAddress ip(169,254,155,102); //client ip for school laptop
IPAddress server(169,254,95,36); //server ip for Andrew-Laptop 
//IPAddress server(169,254,155,101); //server ip for school laptop
EthernetClient client;
int whatToDo=0;
void setup(){
  for(int a=3;a<=7;a++){
    pinMode(a,OUTPUT);
    digitalWrite(a,LOW);
  }
  Serial.begin(9600);
  pinMode(10,OUTPUT);
  digitalWrite(10,HIGH);
  if(SD.begin(4)) digitalWrite(7,HIGH);
  Ethernet.begin(mac,ip);
  delay(1000);
  digitalWrite(6,HIGH);
  delay(1000);
  if(client.connect(server, 12345)){
    digitalWrite(5,HIGH);
  }
}
char bufSize[1024];
void loop(){
  if(whatToDo==0){
    File myFile=SD.open("Img.png",FILE_READ);
    while(myFile.available()){
      String msg=myFile.readString();
      int buf=1024;
      char new_msg=msg.toCharArray(bufSize,sizeof(bufSize)); //ERROR LINE
      //client.write(myFile.read());
      client.write(new_msg);
    }
    //client.write(msg);
    whatToDo=1;
  }else{
    digitalWrite(3,HIGH);
    delay(500);
    digitalWrite(3,LOW);
    delay(500);
    if(whatToDo==1){
      client.write("");
      client.write("Done");
      whatToDo+=1;
    }
  }
}

我得到的错误是:

SDTestHost:36:错误:无法忽略虚拟值,因为它应该是        char new_msg = msg.toCharArray(bufSize,sizeof(bufSize)); 退出状态1 空值不被忽略,因为它应该是

我想一次发送多个字节的数据,这是client.write(file.read())的默认值;我无法弄清楚如何更改缓冲区大小

2 个答案:

答案 0 :(得分:0)

toCharArray()方法不返回值。该值将在参数中返回。你想要这样的东西:

char buffer[1024];
msg.toCharArray(buffer, 1024);

client.write(buffer, 1024);

您应该在函数外部声明缓冲区,否则它将在堆栈中分配。

答案 1 :(得分:0)

Google将我带到这里,但我想其他人也对使用SD.hEthernet.h在Arduino上进行缓冲读取/写入的示例感兴趣。也许以下代码对某人有帮助:

    int bufferSize = 64;
    while(file.available())
    {
      char buffer[bufferSize];
      memset(buffer, '\n', bufferSize);
      file.read(&buffer, bufferSize);
      client->write(buffer, bufferSize);
    }

对于我来说,此代码段有效,并且由于没有完整的工作示例(至少我没有找到一个示例),我认为如果有人偶然发现了同一问题,这可能会很有用。