首页 文章

C#通过serialPort将大文件传输到Arduino UNO

提问于
浏览
0

我想通过serialPort将包含G代码的文本文件流式传输到Arduino UNO .

Arduino使用SerialEvent接收所有字节,并将其添加到名为buffer的char数组中 . 如果缓冲区已满,则应发送“!;”通过串口到C# . 这很好用,因为我已经使用Arduino IDE的Serial Montior应用程序进行了测试 . 但是我不能像C#那样快速输入文本:)

C#程序按行读取G代码文件,然后将每行中的每个char发送到arduino . 在每个char之后我想检查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 启动 .

1 回答

  • 0

    不知怎的,c#从未注意到“!;”或者甚至在流式传输时从Arduino读取任何字节 . 我觉得serialPort.Write()函数会阻塞端口 .

    Write 命令未阻止该端口 . arduino比你的电脑慢得多 . 所以在这两行之间:

    serialPort.Write(c.ToString());
    
    if (serialPort.BytesToRead > 0)
    

    arduino被占用,没有收到数据 yet . 因此 BytesToRead0 . 解决的两种可能性就在我脑海中 .

    1)使用 serialPort.DataReceived 事件进行异步处理 . 每次收到数据时都会触发此操作 . 然后,您可以对该事件中收到的数据做出反应或

    2)只需给arduino一些时间 System.Threading.Thread.Sleep(1000);

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

    您需要找出等待的最小时间 Span .

相关问题