Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 6670|回復: 22

如何增加內存或改寫程式

[複製鏈接]
發表於 2019-2-27 15:27:43 | 顯示全部樓層 |閱讀模式
本帖最後由 ykyk9898 於 2019-2-27 15:31 編輯

這是將原本記憶卡裡面圖片藉由esp8266上傳到網頁的功能,不過在上傳時由於內存不夠而導致失敗,

不知道有哪位高手知道如何減少不必要的東西或改寫寫法,而讓上傳成功

#include <SoftwareSerial.h>
#include <SD.h>
#define SD_CS 10
SoftwareSerial esp(4, 5);                   //RX,TX


String ssid = "tim";                           //wifi name  
String password = "1122334455";                       //wifi password
String server = "120.114.132.69";                         // server name

void connectWifi()                           //wificonnection
{
  String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
  esp.println(cmd);
  delay(4000);
  
  if(esp.find("OK")){
    Serial.println("WIFI Connected!");
    delay(1000);
  }
  else {  
  Serial.println("Cannot connect to wifi");
  connectWifi();
  }
}
void wifisetup()
{
  esp.println("AT");
  esp.println("AT+CWMODE=3");
  Serial.println("Wifi ready");
}


void setup()
{
  Serial.begin(9600);
  esp.begin(9600);
  pinMode(10, OUTPUT);
  Serial.println("Wifi Setup");
  wifisetup();                         //wifi setup
  connectWifi();
  Serial.print("Initializing SD card...");
  if (!SD.begin(SD_CS)) {
    Serial.println("failed!");
    return;
  }
    Serial.println("OK!");
  test();
}


void loop() {

  

}


void test(){
  File webFile;
  char fileName[13] = "555.JPG";
  String cmd = "AT+CIPSTART=\"TCP\",\"" + server + "\",80";
  esp.println(cmd);
  delay(3000);

  if(esp.find("OK"))
  {
    Serial.println("server found");
    webFile = SD.open(fileName,FILE_READ);
    String post = "POST /skin/upok.php HTTP/1.1\r\n";      
    post+= "Host: 120.114.132.69\r\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW\r\n";
    post+="Content-Length:";
    post+=webFile.size()+196;
    post+="\r\n";
    post+="----WebKitFormBoundary7MA4YWxkTrZu0gW";
    post+="Content-Disposition: form-data; name=\"my_file\"; filename=\"555.JPG\"\r\n";
    post+="Content-Type: image/jpge\r\n";
    post+="----WebKitFormBoundary7MA4YWxkTrZu0gW--\r\n";
    delay(1000);
    Serial.print(post);
    String sendData = "AT+CIPSEND="+String(post.length());
    Serial.print(sendData);
    esp.print(sendData);
    delay(6000);
    if (esp.find(">"))
    {
      Serial.println(F("SENDING  data"));
    }
    else
    {
       Serial.println(F("NOT SENDING"));
       esp.println("AT+CIPCLOSE");
    }
  }
  else
  {
    Serial.println(F("server not found"));
  }
  delay(10000);
}
發表於 2019-2-27 20:18:23 | 顯示全部樓層
看不懂?
"上傳時由於內存不夠而導致失敗?"
這個錯誤訊息是誰顯示的?
 樓主| 發表於 2019-3-4 21:50:01 | 顯示全部樓層
超新手 發表於 2019-2-27 20:18
看不懂?
"上傳時由於內存不夠而導致失敗?"
這個錯誤訊息是誰顯示的?

目前接上去會變成這樣

目前接上去會變成這樣

目前接上去會變成這樣
發表於 2019-3-5 09:25:54 | 顯示全部樓層
本帖最後由 超新手 於 2019-3-5 10:55 編輯

它只是警告而己, 實際上有發生問題嗎?
如果擔心出問題, 可以先把所有有用雙引號的 Serial.println 或 Serial.print
但是沒有加上F("") 的, 加上F("")即可
例如
Serial.println("Wifi ready");
改成
Serial.println(F("Wifi ready"));

注意 !!!!!!!!!!用雙引號的才能加, 像
Serial.println("WIFI Connected!");
Serial.println("Cannot connect to wifi");
Serial.println("Wifi ready");
Serial.println("Wifi Setup");
.....
但是
Serial.print(sendData);這類沒引號的就不能改

如果不夠, 也可以把 esp.println/esp.print 也一起改
 樓主| 發表於 2019-3-6 00:23:26 | 顯示全部樓層
超新手 發表於 2019-3-5 09:25
它只是警告而己, 實際上有發生問題嗎?
如果擔心出問題, 可以先把所有有用雙引號的 Serial.println 或 Seria ...

謝謝你的建議,我把有雙引號的都有改掉了,wifi連上之後,圖片的部分還是不能上傳的樣子

目前wifi能連上但圖片上傳還是失敗了

目前wifi能連上但圖片上傳還是失敗了
發表於 2019-3-6 08:46:50 | 顯示全部樓層
未命名.jpg
你確定你貼的程式和執行的程式是同一個嗎?
印出來的資料不一樣. 不像是同一個程式執行的結果
 樓主| 發表於 2019-3-6 15:40:54 | 顯示全部樓層
超新手 發表於 2019-3-6 08:46
你確定你貼的程式和執行的程式是同一個嗎?
印出來的資料不一樣. 不像是同一個程式執行的結果 ...

是同一個程式沒錯,因為不太會寫這個所以很多資料是自己上網看跟嘗試的,可能是程式寫得有問題但不太會改,不知是否可以有聯絡方式方便詢問你
發表於 2019-3-6 17:48:10 | 顯示全部樓層
仔細看了一下, 這個程式問題很多
不過先把
esp.print(sendData);
改成
esp.println(sendData);
照理說, 應該就可以顯示 SENDING  data 了才對
雖然.....結果還是錯的
 樓主| 發表於 2019-3-7 18:19:52 | 顯示全部樓層
本帖最後由 ykyk9898 於 2019-3-7 18:23 編輯
超新手 發表於 2019-3-6 17:48
仔細看了一下, 這個程式問題很多
不過先把
esp.print(sendData);


請問要如何改寫才能將圖片順利上傳到伺服器呢...我是用postman伺服器,你講的地方我有改了但還是無法..如果換了mega板子會比較好做嗎
未命名.jpg
發表於 2019-3-7 19:08:03 來自手機 | 顯示全部樓層
可以把程式再貼一次嗎?
 樓主| 發表於 2019-3-7 19:32:06 | 顯示全部樓層
本帖最後由 ykyk9898 於 2019-3-7 19:33 編輯
超新手 發表於 2019-3-7 19:08
可以把程式再貼一次嗎?


#include <SoftwareSerial.h>
#include <SD.h>
#define SD_CS 10
SoftwareSerial esp(4, 5);                   //RX,TX


String ssid = "Ksu-fish";                           //wifi name  
String password = "88888866";                       //wifi password
String server = "120.114.132.69";                         // server name

void connectWifi()                           //wificonnection
{
  String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
  esp.println(cmd);
  delay(4000);
  
  if(esp.find("OK")){
    Serial.println(F("WIFI Connected!"));
    delay(1000);
  }
  else {  
  Serial.println(F("Cannot connect to wifi"));
  connectWifi();
  }
}
void wifisetup()
{
  esp.println(F("AT"));
  esp.println(F("AT+CWMODE=3"));
  Serial.println(F("Wifi ready"));
}


void setup()
{
  Serial.begin(9600);
  esp.begin(9600);
  pinMode(10, OUTPUT);
  Serial.println(F("Wifi Setup"));
  wifisetup();                         //wifi setup
  connectWifi();
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(SD_CS)) {
    Serial.println(F("failed!"));
    return;
  }
    Serial.println(F("OK!"));
  test();
}


void loop() {

  

}


void test(){
  File webFile;
  char fileName[13] = "555.JPG";
  String cmd = "AT+CIPSTART=\"TCP\",\"" + server + "\",80";
  esp.println(cmd);
  delay(3000);

  if(esp.find("OK"))
  {
    Serial.println(F("server found"));
    webFile = SD.open(fileName,FILE_READ);
    Serial.print(webFile);
    String post = "POST /skin/upok.php HTTP/1.1\r\n";      
    post += "Host: 120.114.132.69\r\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW\r\n";
    post += "Content-Length:";
    post += webFile.size()+196;
    post += "\r\n";
    post += "----WebKitFormBoundary7MA4YWxkTrZu0gW";
    post += "Content-Disposition: form-data; name=\"my_file\"; filename=\"555.JPG\"\r\n";
    post += "Content-Type: image/jpeg\r\n";
    post += "----WebKitFormBoundary7MA4YWxkTrZu0gW--\r\n";
    delay(1000);
    Serial.print(post);
    String sendData = "AT+CIPSEND="+String(post.length());
    Serial.print(sendData);
    esp.println(sendData);*/
    delay(6000);
    if (esp.find(">"))
    {
      Serial.println(F("SENDING  data"));
    }
    else
    {
       Serial.println(F("NOT SENDING"));
       esp.println(F("AT+CIPCLOSE"));
    }
  }
  else
  {
    Serial.println(F("server not found"));
  }
  delay(10000);
}


是否是post 那邊寫法的問題所以才一直無法成功上傳或是其他原因
發表於 2019-3-7 20:59:48 | 顯示全部樓層
對, 你看你貼的這個程式, 多了一個 */
esp.println(sendData);*/
根本沒辦法成功 COMPILER
 樓主| 發表於 2019-3-7 21:12:54 | 顯示全部樓層
超新手 發表於 2019-3-7 20:59
對, 你看你貼的這個程式, 多了一個 */
esp.println(sendData);*/
根本沒辦法成功 COMPILER


雖然拿掉可以連上了..但是還是一樣圖片上傳失敗
222.png
發表於 2019-3-8 09:23:07 | 顯示全部樓層
本帖最後由 超新手 於 2019-3-8 09:24 編輯

應該是 RAM 用量太多, 影響到程式執行
把 test 改成這樣試試看
也就是把 post 的值也移到 ROM

  1. void test() {
  2.   File webFile;
  3.   char fileName[13] = "555.JPG";
  4.   String cmd = "AT+CIPSTART=\"TCP\",\"" + server + "\",80";
  5.   esp.println(cmd);
  6.   delay(3000);

  7.   if (esp.find("OK"))
  8.   {
  9.     Serial.println(F("server found"));
  10.     webFile = SD.open(fileName, FILE_READ);
  11.     Serial.print(webFile);
  12.     String post = F("POST /skin/upok.php HTTP/1.1\r\n");
  13.     post += F("Host: 120.114.132.69\r\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW\r\n");
  14.     post += F("Content-Length:");
  15.     post += webFile.size() + 196;
  16.     post += F("\r\n");
  17.     post += F("----WebKitFormBoundary7MA4YWxkTrZu0gW");
  18.     post += F("Content-Disposition: form-data; name=\"my_file\"; filename=\"555.JPG\"\r\n");
  19.     post += F("Content-Type: image/jpeg\r\n");
  20.     post += F("----WebKitFormBoundary7MA4YWxkTrZu0gW--\r\n");
  21.     delay(1000);
  22.     Serial.print(post);
  23.     String sendData = "AT+CIPSEND=" + String(post.length());
  24.     Serial.println(sendData);
  25.     esp.println(sendData);
  26.     delay(6000);
  27.     if (esp.find(">"))
  28.     {
  29.       Serial.println(F("SENDING  data"));
  30.     }
  31.     else
  32.     {
  33.       Serial.println(F("NOT SENDING"));
  34.       esp.println(F("AT+CIPCLOSE"));
  35.     }
  36.   }
  37.   else
  38.   {
  39.     Serial.println(F("server not found"));
  40.   }
  41.   delay(10000);
  42. }
複製代碼
 樓主| 發表於 2019-3-11 15:27:25 | 顯示全部樓層
超新手 發表於 2019-3-8 09:23
應該是 RAM 用量太多, 影響到程式執行
把 test 改成這樣試試看
也就是把 post 的值也移到 ROM

還是無法上傳,不知道是不是post那整段的問題,查了好多資料,可能要改改寫法
發表於 2019-3-11 16:05:19 | 顯示全部樓層
可以把結果貼出來嗎?
 樓主| 發表於 2019-3-11 19:42:05 | 顯示全部樓層
超新手 發表於 2019-3-11 16:05
可以把結果貼出來嗎?

不好意思,結果都和上次一樣,到最後都是not sending,因為我也沒改到甚麼,就是把你說的能用F的地方用了,其他地方都沒動到,不知道還有甚麼方法可以上傳圖片到伺服器
666.png
發表於 2019-3-11 19:50:20 來自手機 | 顯示全部樓層
你的程式根本沒改。還是舊版的
發表於 2019-3-11 19:52:54 來自手機 | 顯示全部樓層
要把 post 部份也加上 f("  ")
 樓主| 發表於 2019-3-11 20:20:49 | 顯示全部樓層
超新手 發表於 2019-3-11 19:52
要把 post 部份也加上 f("  ")

有加了,雖然還是不行,請問是寫法不對嗎

#include <SoftwareSerial.h>
#include <SD.h>
#define SD_CS 10
SoftwareSerial esp(4, 5);                   //RX,TX


String ssid = "6641k-16-14";                           //wifi name  
String password = "062643462";                       //wifi password
String server = "120.114.132.69";                         // server name

void connectWifi()                           //wificonnection
{
  String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
  esp.println(cmd);
  delay(4000);
  
  if(esp.find("OK")){
    Serial.println(F("WIFI Connected!"));
    delay(1000);
  }
  else {  
  Serial.println(F("Cannot connect to wifi"));
  connectWifi();
  }
}
void wifisetup()
{
  esp.println(F("AT"));
  esp.println(F("AT+CWMODE=3"));
  Serial.println(F("Wifi ready"));
}


void setup()
{
  Serial.begin(9600);
  esp.begin(9600);
  pinMode(10, OUTPUT);
  Serial.println(F("Wifi Setup"));
  wifisetup();                         //wifi setup
  connectWifi();
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(SD_CS)) {
    Serial.println(F("failed!"));
    return;
  }
    Serial.println(F("OK!"));
  test();
}


void loop() {

  

}


void test(){
  File webFile;
  char fileName[13] = "555.JPG";
  String cmd = "AT+CIPSTART=\"TCP\",\"" + server + "\",80";
  esp.println(cmd);
  delay(3000);

  if(esp.find("OK"))
  {
    Serial.println(F("server found"));
    webFile = SD.open(fileName,FILE_READ);
    Serial.print(webFile);   
    String post = F("POST /skin/upok.php HTTP/1.1\r\n");      
    post += F("Host: 120.114.132.69\r\nContent-Type: multipart/form-data; boundary=WebKitFormBoundary7MA4YWxkTrZu0gW\r\n");
    post += F("Content-Length:");
    post += webFile.size()+196;
    post += F( "\r\n");
    post += F("----WebKitFormBoundary7MA4YWxkTrZu0gW");
    post += F("Content-Disposition: form-data");
    post += F("name=\"my_file\"; filename=\"555.JPG\"\r\n");
    post += F("Content-Type: image/jpeg\r\n");
    post += F("----WebKitFormBoundary7MA4YWxkTrZu0gW--\r\n");
    delay(1000);
    Serial.print(post);
    String sendData = "AT+CIPSEND=" + String(post.length());
    Serial.println(sendData);
    esp.println(sendData);
    delay(6000);
    if (esp.find(">"))
    {
      Serial.println(F("SENDING  data"));
    }
    else
    {
       Serial.println(F("NOT SENDING"));
       esp.println(F("AT+CIPCLOSE"));
    }
  }
  else
  {
    Serial.println(F("server not found"));
  }
  delay(10000);
}
999.png
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-3-29 23:03 , Processed in 0.221310 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表