2017-01-10 25 views
0

Gコードを含むテキストファイルをシリアルポート経由でArduino UNOにストリーミングしたいと思います。シリアルポート経由で大規模なファイルをArduino UNOにストリーミングするUNO

ArduinoはすべてのバイトをSerialEventで受け取り、バッファという名前のchar配列に追加します。バッファがいっぱいになると、 "!"シリアルポート経由でC#に接続します。 これは、Arduino IDEのSerial Montiorアプリケーションでテストしたのでうまく動作します。しかし、C#が送ることができるのと同じくらい速くテキストを入力することはできません:)

C#プログラムは、線でGコードファイルを読み込んで、1行の各文字をarduinoに送ります。各文字の後、Arduinoがバッファーがいっぱいであるかどうかを確認するかどうかをチェックしたい。そうでなければストリーミングを続ける。

何とかC!ストリーミング中にArduinoから読み込むバイトを取得します。 serialPort.Write()関数がポートをブロックしているような気がします。

これはArduinoのコードです:

void serialEvent() 
{ 
    // wenn im Puffer noch platz ist 
    if (buffercount < MAX_BUF) 
    { 
    char c = (char)Serial.read(); 
    buffer[buffercount++] = c; 
    } 
    else 
    { 
    Serial.print("!;"); 
    } 
} 

serialEventはArduinoのポートでバイトを受信するたびに発射されます。 BytesToReadは決して存在しないため

private void startStreaming(string Text) 
{ 
    string[] stringSeparators; 
    string Text2Stream; 

    if (Text == "") 
    { 
     Text2Stream = File.ReadAllText(textBoxSelectFile.Text); 
     stringSeparators = new string[] { "\n" }; 
    } 
    else 
    { 
     stringSeparators = new string[] { "\r\n" }; 
     Text2Stream = Text; 
    } 

    string[] t2s = Text2Stream.Split(stringSeparators, StringSplitOptions.None); 
    foreach (string zeile in t2s) 
    { 

     if (zeile.Contains(")") || zeile.Contains("(")) 
     { 
      continue; 
     } 

     // Code schicken 
     foreach (char c in zeile) 
     { 
      if (c == ' ') continue; 
      serialPort.Write(c.ToString()); 
      if (serialPort.BytesToRead > 0) 
      { 
       if(serialPort.ReadExisting() == "!;") 
        { 
        **wait and do smth.** 
        } 
      } 
     } 
     serialPort.Write(";"); 
     addTextToLog(zeile); 

    } 
} 

serialPort.ReadExisiting()起こりません: Max_BUFは64

これは、C#のコードがあるの価値を持っています。 ";"両方とも、行末の記号です。 startStreamingは、非同期スレッドで開始され、BackGroundWorkerです。

答えて

0

何とかC#は "!"ストリーミング中にArduinoから読み込むバイトを取得します。 serialPort.Write()関数がポートをブロックしているような気がします。

Writeコマンドはポートをブロックしていません。 arduinoはあなたのコンピュータよりちょっと遅いです。したがって、これらの2行の間:

serialPort.Write(c.ToString()); 

if (serialPort.BytesToRead > 0) 

のArduinoが占有され、何のデータがまだを受信されません。したがって、BytesToRead0です。それを解決する2つの可能性は、すぐに私の心に来る。

1)非同期処理の場合は、serialPort.DataReceivedイベントを使用します。これは、データを受信するたびにトリガーされます。そして、あなたはそのイベントで受け取ったデータに反応できるか

2)は、ちょうどあなたが待つ最小タイムスパンであるかを調べる必要があるSystem.Threading.Thread.Sleep(1000);

serialPort.Write(c.ToString()); 
System.Threading.Thread.Sleep(1000); 
if (serialPort.BytesToRead > 0) 

とarduinoのいくつかの時間を与えます。

+0

しかし、C#アプリケーションがストリーミングを続けている間は、何も受信できません。私はあなたの答えが正しいかもしれないと思うが、それが100%正しいのならば私は好奇心が強い。私がストリーミングを続けるなら、何の反応もありません。 – Mika

+0

私はあなたの言及した睡眠()でそれをテストしましたが、それはどちらの助けにもならないでしょうか(おそらく私はarduino側に何かを見逃していますか?) – Mika

+0

もしArduinoに、あまりにも仕事です。 char c =(char)Serial.read(); バッファ[buffercount ++] = c; Serial.print( "L"); – Mika

関連する問題