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の配列に収納できないのかや、もっと効率のよいプログラムのやり方などありましたら、ぜひご教示頂きますよう、よろしくお願い致します。
お礼
回答頂きありがとうございます。 telnetd動作できました。そして、telnetdで作成したTCPサーバに対してESP-WROOM-02からATコマンド操作でTCP接続ができることが分かりました。 (esp応答)ready (esp応答)WIFI CONNECTED (esp応答)WIFI GOT IP (PC送信)AT (esp応答)OK (PC送信)AT+CWMODE=3 (esp応答)OK (PC送信)AT+CWJAP="Buffalo-G-884C","h3htu788pwh3u" (esp応答)WIFI DISCONNECT (esp応答)WIFI CONNECTED (esp応答)WIFI GOT IP (esp応答)OK (PC送信)AT+CIFSR (esp応答)+CIFSR:APIP,"192.168.4.1" (esp応答)+CIFSR:APMAC,"5e:cf:7f:09:c8:76" (esp応答)+CIFSR:STAIP,"192.168.1.90" (esp応答)+CIFSR:STAMAC,"5c:cf:7f:09:c8:76" (esp応答)OK (PC送信)AT+CIPSTART="TCP","192.168.1.93",8200 (esp応答)CONNECT (esp応答)OK (サーバ応答)+IPD,48:Simple telnet server for Windows95 Version 0.5 (サーバ応答)+IPD,126:Copyright (c) 1996, 1997 by Satoru Satoh All rights reserved. Please send your comment to RL8S-STU@asahi-net.or.jp login: (PC送信)AT+CIPMODE=1 (esp応答)OK (PC送信)AT+CIPSEND (esp応答)OK (esp応答)> (PC送信)****** (PC送信)$ pwd (esp応答)C:\Users\mypc\Downloads\telnetd5 ESP-WROOM-02でこのtelnetdサーバに対しては (PC送信)AT+CIPSTART="TCP","192.168.1.93",8200 (esp応答)CONNECT (esp応答)OK この接続は保持されている感じでした。 なので、私でものサーバでこの時に時間制限などを設けているように感じました。 原因が究明できそうです。大変助かりました。 またtelnetdというソフトは昔からあるCUI系のリモートログインサーバなのですね。長年windows使っていますが、このようなLinuxみたいなことがwindowsでもきたというのを初めて知りました。