• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ESP-WROOM-02の透過モード時のデータ長)

ESP-WROOM-02の透過モード時のデータ長

このQ&Aのポイント
  • 現在wifiモジュール基板のESP-WROOM-02で、UARTポートを利用してwifi通信を行いたい。
  • ESP-WROOM-02の透過送信モードを使用して1.2kByte程度のパケットデータを送信しようとしたが、48Byteのパケットデータ長になってしまい、送信できていないことが分かった。
  • wifiModuleSendAT関数ではパケットサイズを引数として渡さなくてはいけないのか疑問。

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

  • ベストアンサー
  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.4

#1の補足を見ました。 >これは”1パケットで構成したいデータ長は20msec以内にUARTでESP-WROOM-02に流し込みなさい。” ではなくて、 「パケットを分ける際には間隔を20ms開けなさい。」 ということだと思います。逆に言うと、1パケットにしたいときはデータの送信間隔を20msより小さくしてください。ということになります。 話は変わりますが、送信データ中に¥0(0x00,ゼロ)が含まれていませんか?strlen関数でデータの長さを求めているので、¥0が現れた時点で送信が終わってしまうと思います。

techhouse
質問者

お礼

回答頂きありがとうございます。 ”strlen関数”に関して for(i = 0 ; i < strlen(cmd) ; i++) wireless_put_for_Wifi_data(cmd[i]); このコードでの動作をデバッグしていて少し違和感を感じていて、引数に長さをデータ"len"というのを追加して長さを明示するように現在動作させています。 ただ、これでもパケットが2つに分割されてしまうという動作をしています。 wifiModuleSendAT((BYTE *)Packet,1212,200); このようにパケットを設定して送信しています。 意図的に20msecの間隔を開けている箇所はないのですが、H8SマイコンをucosというOS動作させていて、複数のタスクで処理しているようにしているので、その関係で、定期的なペンディング状態で20msec以上の間隔が空いてしまうタイミングがあるのかなぁと今考えています。 もしかしたら透過送信モードじゃなくて、シングルコネクションモードのバイト長指定の送信モードの方が今回はいいのかなぁなんて考えてもいます。 (修正後の関数内容) u8 wifiModuleSendAT(u8 * cmd,u16 len,int timeOutTime) { int i; u8 err; u8 * pC; int checkLen; //u8 cmd[30]; //mprintf_test_sci0("AT\n\r"); //memset(cmd,0,30); //sprintf(cmd,"AT\r\n"); checkLen = strlen(cmd); 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_rx_buf,0,MAX_WIRELESS_BUF); 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+CIPSEND") != NULL) { //if(strstr(g_wire_cmd[0],">") != NULL) //{ return TRUE; //} } if(strstr(cmd,"AT+CWJAP") != NULL) { return TRUE; } if(strstr(cmd,"AT+CIPSTART") != NULL) { return TRUE; } if(strstr(cmd,"AT+CIFSR") != NULL) { return TRUE; } //if(strstr(g_wire_rx_buf,"OK") != NULL) //if(strstr(g_wire_cmd[0],"ERROR") != NULL) if(strstr(g_wire_cmd[0],"OK") != NULL) { return TRUE; } } return FALSE; }

techhouse
質問者

補足

大変お世話になっております。その後返答など遅れてましたが、このコメント欄をお借りしてご報告させていただきます。 その後、透過送信モードを一旦やめて、シングルコネクションモードでのサーバ通信にトライしてみました。 最初はうまくいかなかったのですが、サーバ側にconnection後2秒以内にサーバ通信に合致するパケットの送信が成功すれば 一定時間コネクションが維持できるということがわかりました。 データを送信後サーバ側が返答してくるデータというのがあるようで、まだそれを受信できていないのですが、とりあえず通信は成功しました。 フォロー頂き大変ありがとうございます。

その他の回答 (3)

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.3

#2ですが、すみません、何か大きな勘違いをしておりました。 先ほどのstrlen()は文字列の先頭アドレスを渡すので間違ってはいないと思います。 先ほどの#2回答は無視してください。失礼しました。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.2

>for(i = 0 ; i < strlen(cmd) ; i++) >wireless_put_for_Wifi_data(cmd[i]); この部分、おかしくないですか? strlen(cmd) はポインタcmdそのものの長さを調べています。ポインタ変数は4バイトですので、おそらく4バイトしか送信されないのはそのせいだと思います。 for(i = 0 ; i < strlen(*cmd) ; i++) wireless_put_for_Wifi_data(cmd[i]); のようにしてみたらどうでしょうか。wireless_put_for_Wifi_data(cmd[i])のほうも*cmd[i] にするのかもしれません。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.1

こちらのサイトが参考になるかと思います。 http://ja.docs.jumpwire.io/ESP8266Reference/ATCommands/ 透過送信モードでは、UARTポートから受信したデータをそのまま送信します。送信を終了するには"+++"を送ればよいようです。

techhouse
質問者

お礼

回答頂きありがとうございます。 現在、透過送信モードで1200byte程度のデータを1パケットで送信したいと考えており、1200byteをESP-WROOM-02に流し込んだ際に、サーバ側のPCのwiresharkで観測すると複数のパケットに分割して送信されている感じになります。 パケット長も約300~600byteと一定しません。 こちらのサイトに公開されているATコマンドマニュアル https://github.com/douggilliland/lb-Arduino-Code/blob/master/LBCards/ESPBKOUT/4A-ESP8266%20AT%20Instruction%20Set_v0.22.pdf このPDFマニュアルの42ページ目の”AT+CIPSEND”の項目に Wrap return “>” after execute command. Enters unvarnished transmission, 20ms interval between each packet, maximum 2048 bytes per packet. When single packet containing “+++” is received, it returns to command mode. This command can only be used in unvarnished transmission mode which require to be single connection mode. このような英文があったのですが、 これは”1パケットで構成したいデータ長は20msec以内にUARTでESP-WROOM-02に流し込みなさい。” ということでしょうか? 現在UARTの通信スピードは38.4kbpsで、もし1200byteを38.4kで送信すると最速でも32msec程度かかる計算になります。 これだと1パケットでは構成できないということでしょうか? 追加になってしまいますが、ご教示頂きますよう、よろしくお願い致します。

関連するQ&A

専門家に質問してみよう