簡體   English   中英

C#通過serialPort將大文件流式傳輸到Arduino UNO

[英]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被占用, 尚未接收數據。 因此, BytesToRead0 我馬上想到了兩種解決方案。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM