繁体   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