みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SDから読み込んだ文字列だとAWS通信でエラー

現在、ESP-WROOM-32でAWSサーバーへアクセスするプログラムをやってます。ESP-WROOM-32に接続したSDカードリーダーから"config"というテキストファイルを読み込んで、そのファイルに書かれたAWSサーバー名やポート番号に応じて接続処理を行いたいと思っています。(*いちいちスケッチで書き込んでコンパイルするのがめんどくさいため)

もともとのスケッチにて、次の様なサーバーの変数名の宣言などがされていて、接続できていました。
(例)
const char* server = "am5y9zzdy09g0-ats.iot.us-wwww-2.amazonaws.com";
const int port = 8883;

これの"const char* server"部分のサーバー名の文字列をSDカードの”config”ファイルから持って来ようと思い次の様なコードを作ったのですが、シリアルモニタで

Serial.printf("aws server: %s \n", server);

これで文字列を確認しても"am5y9zzdy09g0-ats.iot.us-wwww-2.amazonaws.com"
と出てきているのに、AWSサーバとの通信で必ずエラーを起こします。


(今回のプログラム内容の関数部分)
const char* server;

bool getAwsServer(fs::FS &fs, String path) {
//File file = SD_MMC.open(path, "r");
File file = fs.open(path, "r");

if (!file) {
Serial.printf("Can't Open File %s \n", path);
return false;
}
while (file.available()) {
String line = file.readStringUntil('\n');
line = line.substring(0, line.indexOf('#'));
//Serial.printf("DeviceID: %s \n", line.c_str());

//String deviceCheck = line.substring(0, line.indexOf("device name"));

if (line.indexOf("aws server") != -1) {
String deviceID = line.substring(line.indexOf(':')+1); deviceID.trim();
//Serial.printf("aws server: %s \n", deviceID.c_str());
server = (const char*)deviceID.c_str();
Serial.printf("aws server: %s \n", server);
return true;
}

}
Serial.printf("aws server is no data \n");
return false;
}


このプログラムの問題箇所や解決策など、ご教示の程よろしくお願い致します。

投稿日時 - 2019-02-06 16:35:18

QNo.9585230

すぐに回答ほしいです

質問者が選んだベストアンサー

deviceIDのスコープはその直前にあるif文のブロック内です。
if文のブロックを抜けると、その内容は不定になります。
server = (const char*)deviceID.c_str();
はdeviceID内部のデータのポインタを代入しているだけなので、deviceID自体がスコープから外れると内容は不定になります。

投稿日時 - 2019-02-06 17:34:39

補足

現在のプログラムの状況はこんな感じです。
https://drive.google.com/file/d/1wPC6AJQ8gaavPQDz85-RZw4_m0FssPg9/view?usp=sharing

ちょっとグーグルドライブの共有機能を試してみます。

投稿日時 - 2019-02-07 06:26:25

お礼

回答頂きありがとうございます。
解決しました。
シリアルモニタで、Serial.printf("aws server: %s \n", server);の実行で望み通りの文字列が表示されていたのに、AWSの通信がエラーしていたのですごいガッカリしていましたが、このコードを関数内でやっているのは問題でしたね。
このコードを関数外のグローバル領域のルーチンに移したら全然違うデータが出てきましたので問題に気づけました。

このマイクロSDからデータを読み込むプログラムはほとんどコピペしていたため、このサーバーの文字列だけでなく、他のプログラムでも同様の問題が起きていることがわかり、それを修正することで、マイクロSDデータでのAWSサーバへの通信ができることを確認できました。

助かりました。

投稿日時 - 2019-02-07 06:19:21

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問