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
です。
しかし、C#アプリケーションがストリーミングを続けている間は、何も受信できません。私はあなたの答えが正しいかもしれないと思うが、それが100%正しいのならば私は好奇心が強い。私がストリーミングを続けるなら、何の反応もありません。 – Mika
私はあなたの言及した睡眠()でそれをテストしましたが、それはどちらの助けにもならないでしょうか(おそらく私はarduino側に何かを見逃していますか?) – Mika
もしArduinoに、あまりにも仕事です。 char c =(char)Serial.read(); バッファ[buffercount ++] = c; Serial.print( "L"); – Mika