[英]C# streaming large file through serialPort to an Arduino UNO
我想通過serialPort將包含G代碼的文本文件流式傳輸到Arduino UNO。
Arduino通過SerialEvent接收所有字節,並將其添加到名為buffer的char數組中。 如果緩沖區已滿,則應該發送“!;”。 通過串行端口連接到C#。 由於我已經使用Arduino IDE的Serial Montior應用程序對其進行了測試,因此效果很好。 但是我不能像C#一樣快地輸入文本:)
C#程序按行讀取G代碼文件,然后將一行中的每個字符發送到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("!;");
}
}
每當Arduino在端口上接收到字節時,都會觸發serialEvent。 Max_BUF的值為64。
這是C#代碼:
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()
永遠不會發生,因為永遠不會有BytesToRead
。 “;” 用於行尾的兩個符號。 startStreaming
在作為BackGroundWorker
的異步線程中BackGroundWorker
。
C#莫名其妙地從不注意到“!;”。 甚至在流傳輸時從Arduino讀取任何字節。 我覺得serialPort.Write()函數會阻塞端口。
Write
命令不會阻塞端口。 arduino比您的計算機慢得多。 因此,在這兩行之間:
serialPort.Write(c.ToString());
if (serialPort.BytesToRead > 0)
arduino被占用, 尚未接收數據。 因此, BytesToRead
為0
。 我馬上想到了兩種解決方案。
1)使用serialPort.DataReceived
事件進行異步處理。 每次您收到數據時都會觸發此操作。 然后您可以對該事件中接收到的數據做出反應,或者
2)只需使用System.Threading.Thread.Sleep(1000);
給arduino一些時間System.Threading.Thread.Sleep(1000);
serialPort.Write(c.ToString());
System.Threading.Thread.Sleep(1000);
if (serialPort.BytesToRead > 0)
您需要找出等待的最短時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.