PC(C#)とArduino Due + Ethernet Shieldの構成で、TCP通信を用いてArduinoから文字列を受信するプログラムを作成しました。
手順は以下の通りです。
- Arduino側で要素数4097(内1要素は終端null)のchar型配列sendMsgを定義し、4096要素に適当な文字を格納して送信
- C#で文字列を受け取り、0~4095まで1文字ずつ表示する
上記を実行すると、以下のような問題が発生しました。
・C#側では0~2047要素しか受信できず、2048要素目を表示しようとして、例外(IndexOutOfRangeException)が発生する
コアとなるソースコードは以下の通りです。ただし、コネクションの確立は既に行われているものとします。
Arduinoによる文字列の送信
lang
1/* Arduino Language */ 2char sendMsg[4097]; 3EthernetClient client; 4・・・ 5client.print(sendMsg); 6 //serverとの接続は行われ、sendMsgには適当な文字が0~4095要素に格納されているものとする
C#による文字列の受信
lang
1/* 2ns:接続先とデータの通信を行うためのNetworkStreamクラスのインスタンス 3resBytes:受信データを格納するためのbyte型配列(要素数4097) 4ms:受信データを蓄積するためのMemoryStreamクラスのインスタンス 5ad_buf:受信データを文字列として格納するための変数 6enc:UTF-8形式のエンコーディング 7*/ 8 9/* データ受信部の処理 */ 10do 11{ 12 int resSize = ns.Read(resBytes, 0, resBytes.Length); 13 if(resSize == 0) 14 { 15 break; 16 } 17 ms.Write(resBytes, 0, resSize); 18 19}while(ns.DataAvailable); 20 21ad_buf = enc.GetString(ms.ToArray()); 22ms.SetLength(0); 23 24Thread.Sleep(100); 25 26for(int i=0; i<4096; i++) 27{ 28 Console.WriteLine("{0}:{1}", i, ad_buf[i]); 29 //2048要素目の出力で例外処理が発生する 30}
原因特定を速める目的で、重要となる部分以外をかなり省略させて頂きました。
理想的には0~4095要素の文字を受信し、1文字ずつ表示するようにしたいのですが、上記のプログラムを実行すると2047文字までしか受信できず、それ以降の文字を取得することができないと言った問題が発生しました。
このような問題が発生する原因とその対処法をご教授頂くべく、今回質問させて頂きました。
必要な情報が落ちているという指摘があった場合、追って載せさせて頂きます。
ご回答の程、宜しくお願い致します。
念のため、通信を行う各端末のスペックを記載します。
PC
型:Let'snote CF-S10
OS:Windows7 Professional 64bit
CPU:Corei5 2540M 2.6GHz
メモリ:4GB
詳細の仕様
http://panasonic.biz/pc/doc/catalist/pdf/S10E.pdf
Arduino Due
MCU:AT91SAM3X8E(Cortex-M3)
Clock:84MHz
Flash Memory:512KB
SRAM:96KB
詳細の仕様
http://arduino.cc/en/Main/arduinoBoardDue
Arduino Ethernet Shield
詳細の仕様
http://arduino.cc/en/Main/ArduinoEthernetShield

回答2件
あなたの回答
tips
プレビュー