- 締切済み
ESP-WROOM-02で応答文字を受信したい
現在ESP-WROOM-02というwifiモジュールをH8S2368マイコンに接続してでAPに接続して、サーバにクライアントで接続してデータを送信するというプログラムを作成しています。 サーバと接続してデータ送信できるプログラムを作り、実際にサーバに送信できるようになりました。 ただ、 ESP8266 ATコマンド 一覧 jumpwire.io http://ja.docs.jumpwire.io/ESP8266Reference/ATCommands/ こちらの ”使用例 シングルコネクション (TCPクライアント)” この項目のTCPクライアント接続方法を使用しているのですが、各ATコマンド送信後にESP-WROOT-02から返される応答キャラクタは正確に取れず、現在は無視している状態です。 これを正確に取得してフラグとして使用したいと考えています。 例えば、サーバに接続する際のATコマンドコード sprintf(cmd,"AT+CIPSTART=\"TCP\",\"192.168.1.158\",8000\r\n"); wifiModuleSendAT(cmd,0,1000); memset(cmd,0,50); このコードを使用して、サーバに正常に接続できているのですが、このコードを利用して、コネクションが成功しているのかどうかを判定するため返答の”OK”を受信して使用したいと考えています。 そのため関数の返り値を追加して”OK”を受信したらTRUEを返し、受信できなかったら”FALSE”を返すようにしたのですが、これができない状態です。 u8 wifiModuleSendAT( const u8 * cmd,u16 len,int timeOutTime) { int i; u8 err; u8 * pC; int checkLen; memset(g_wire_rx_buf,0,MAX_WIRELESS_BUF); if(len==0) { for(i = 0 ; i < strlen(cmd) ; i++) wireless_put_for_Wifi_data(cmd[i]); } else { for(i = 0 ; i < len ; i++) wireless_put_for_Wifi_data(cmd[i]); } OSSemPend(WifiRxData, timeOutTime, &err); memset(g_wire_cmd,0,sizeof(g_wire_cmd)); if(err != 0) { memset(g_wire_rx_buf,0,MAX_WIRELESS_BUF); return false; //continue; } { pC = strtok(g_wire_rx_buf," "); i=0; while(pC != NULL) { strcpy(&g_wire_cmd[i][0],pC); pC = strtok(NULL," "); i++; } //memset(g_wire_rx_buf,0,MAX_WIRELESS_BUF); } if(err == 0) { if(strstr(cmd,"AT+CIPSTART") != NULL) { for(i=0;i<5;i++) { if(strstr(g_wire_cmd[i],"OK") != NULL) { return true; } } } return false; } ”if(strstr(cmd,"AT+CIPSTART") != NULL)”こちらのコードの次のコードでブレイクポイントを作っておいて、”AT+CIPSTART”コマンド実行時に”OK”の返答を取得できるようにしているのですが、ブレイク発生時に”g_wire_rx_buf”やg_wire_rx_bufをコマンド毎に分割するように配列したg_wire_cmd[i][0]の中身を確認しても”OK”というアスキーコードが全く入っておらず”true”が返らない状態になってしまっていることを確認しました(※ AT+CIPSTART=\"TCP\",\"192.168.1.158\",8000\” のアスキーコードや”0”しか格納されていない時があります。) 受信割り込み時はg_wire_rx_bufの配列にデータを入れるようにしています。 u8 ddddd; __interrupt(vect=89) void INT_RXI0_SCI0(void) { OSIntEnter(); SCI0.SSR.BIT.RDRF = 0; ddddd = SCI0.RDR; g_wire_rx_buf[g_wire_front++] = ddddd; if(g_wire_front > (MAX_WIRELESS_BUF-1)) g_wire_front =0; if(ddddd==0x0d) { g_wire_length = g_wire_front; g_wire_rx_buf[g_wire_front] = 0; g_wire_front = 0; OSSemPost(WifiRxData); } OSIntExit(); } プログラムでuCOSというOSプログラムを動作させています。”if(ddddd==0x0d) ”でdddddに改行文字があったらその時点で OSSemPost(WifiRxData); でWifiRxDataコードでペンディングしている他のタスクコードをポストしています。 なぜ、サーバへの接続は現在問題ないのですが、”OK”という返答をg_wire_rx_bufの配列に収納できないのかや、もっと効率のよいプログラムのやり方などありましたら、ぜひご教示頂きますよう、よろしくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- MSZ006
- ベストアンサー率38% (390/1011)
回答にはなっていませんが、ヒントになるかもしれないので何となく思った点について書きます。 (1)g_wire_rx_buf に、マイコンからwifiモジュールに送信したコマンド(AT+CIPSTART= ・・・)入っている場合があるというのが謎。送信コマンドは変数cmdに格納しているので、cmdをg_wire_rx_bufに入れるような操作がどこかにないか、確認してみる。 (2)wifiモジュールにATコマンドを送信してから応答が返ってくるまでに、いくらかのタイムラグがあると思われるが、その点については考慮されているのか? 応答がある前に(g_wire_rx_bufに文字列が全部セットされる前に)、g_wire_rx_bufの内容の吟味をしていないか。 (3)wifiモジュールからの応答文字列の最後は0x0Dとなっているのは確かか?0x00ではないのか?(応答文字列のフォーマットの確認)