2011-12-14 10 views
1

私はBluesmirf Silverモジュールが接続されたArduino Unoを持っています。私のArduinoには定期的に温度を記録する温度センサーがあります。 Arduinoは、ブルートゥースを介して送信された文字列をリッスンし、最新のデータで応答します。C#からBluetoothシリアルポート経由でArduinoにテキストを送信する問題を解決するには

私はこのデータを取得するためにC#アプリケーションを作成しましたが、私はいくつかの奇妙な動作を見ています。次のコードを使用して接続し、文字列を送信し、返されたデータを取得します。

mPort = new SerialPort(mPortName, 115200, Parity.None, 8, StopBits.One); 
mPort.Open(); 
mPort.Write("download"); 
Thread.Sleep(1000); 
while (mPort.BytesToRead > 0) 
{ 
    String data = mPort.ReadExisting(); 
    this.BeginInvoke(new Action<String>(AddMessage), data); 
} 

私は戻って取得データは、次のようになります。

ラインは、C#アプリケーション内で局所的に追加:

Send: download 

行はアルドゥイーノから受信したデータに基づいて、コメントを追加しました:

Read: d???+? 
GotData 
------ 
Total Readings, 1069 
Num Readings, 360 
Lost Readings, 709 
Reading Interval, 240000 
------ 
350,19.34 
351,19.34 
352,19.34 
353,20.31 
.... 

すべてのテキストは、私がArduinoに送ったエコーバックされている文字列とは別に、上手く見えます。私がデータを送った方法に間違ったことをしましたか?

FYI

- ブルートゥースモジュールのデータシートはこちらです:http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf

@Jeff - これは私がデータを受信するために私のArduinoの上で使用するコードです:https://github.com/mchr3k/arduino/blob/master/tempsensor/StringReader.cpp

@Jeff - stringDataLenは長さを定義し、私はこのファイルから、全体的な関数を呼び出す:https://github.com/mchr3k/arduino/blob/master/tempsensor/tempsensor.ino

編集:ここでは完全なソースコードがある

C#のコードは間違いなくいくつかの理由で間違ったフロー制御を取得しています。私はC#で次のコードを使用するように切り替えると、これは破損せずに文字列を取得します。

private void write(SerialPort mPort, string str) 
{ 
    foreach (char c in str) 
    { 
     mPort.Write(new char[] {c}, 0, 1); 
     Thread.Sleep(10); 
    } 
} 
+0

関連するArduinoコードを表示できますか?受け取った文字をエコーするようにプログラムされていますか? – Jeff

+0

StringReader.cppでstringDataの長さを宣言していないため、変数が壊れていると思います。 – Jeff

答えて

0

私の問題は、私は、このページ上でサポートされるように主張されている115200のボーレート使用していた2 & 3ピンの私のBluetoothモジュールと通信するためにSoftwareSerialクラスを使用して、私によって引き起こされた。しかしhttp://arduino.cc/en/Reference/SoftwareSerial

をこのページ(http://arduino.cc/en/Reference/SoftwareSerialBegin)は、サポートされている最大ボーレートが実際に9600であると述べています。これが正確かどうかは分かりませんが、ボーレートを9600に下げると問題が解決しました。

-2

私は115200bpsを(あなたのモジュールは、この速度を要求する場合にのみ、それは大丈夫です)を使用する理由はありませんので、あなたが、通信速度を低下させることをお勧めします。また、文字列 "download"を送信していますが、むしろ "#D"のようなマーカーを使用しています.Arduinoデバイスの内部では、データをコンピュータに送信するという意味です。この方法では、8バイトではなく2バイトしか送信しないので、エラーの可能性が低くなり、Arduinoコードが改善されます。

ここで問題を解決してみましょう。まず、あなたはArduinoのデバイスからデータを読んでいるときに、このようなものを使用してみてください:

ArayList dataReceaved=new ArrayList(): 
while(serialPort.BytesToRead>0 && serialPort.IsOpen){ 
       dataReceaved.Add(serialPort.ReadByte()); 
      } 

だから私はあなたがこのまたは同様の方法で、バイトでバイトを読み取ることが示唆されました。また、Arduinoのデバイスから番号を送信する場合は注意が必要です。あなたが明示的に送信されるデータはバイト長であると言う、このコードで

Serial.print(temperatureValue,BYTE); 

:あなたがいる場合は、このようなものを使用。これが助けにならないなら、私に知らせてください。そうすれば何かを試すことができます。

+0

私は115200についてのコメントに同意せず、短いパケットについてはエラーを減らすことを心配しています。 115200はかなり遅く、長さ20フィートのケーブルで接続しようとしない限り、ビットエラーは起こりません。 – TJD

+0

彼はブルートゥースと接続しているため、より大きな距離が可能です。 – MrD

+1

しかし、Bluetoothリンクは信頼できるトランスポートであるSPP/RFCOMMで動作し、再送信によって無線エラーが隠されます。 – TJD

1

おそらく不正なエンコーディングですか?

mPort = new SerialPort(mPortName, 115200, Parity.None, 8, StopBits.One); 
mPort.Encoding = System.Text.Encoding.ASCII; // Or System.Text.Encoding.UTF8 
mPort.Open(); 
mPort.Write("download"); 

バイト単位で読み取り、各バイトを1つずつチェックして、より低いレベルの問題をデバッグします。 ReadExisting()は、Encodingプロパティに基づいて、バイトをStringに変換します。

関連する問題