我想通过串口将包含G-Code的文本文件流式传输到Arduino UNO。C#通过串口将大文件流式传输到Arduino UNO
Arduino通过SerialEvent接收所有字节并将其添加到名为buffer的char数组中。如果缓冲区已满,则应发送“!”通过串口到C#。 正如我与Arduino的IDE的串行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("!;");
}
}
的的serialEvent被激发每一个Arduino的接收端口字节的时间。 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
。
听起来合法的,但同时C#应用程序保持其流从未发生过收到任何东西。我认为你的答案可能是对的,但我很好奇,如果它100%正确的话。如果我保持流式传输,则没有响应。 – Mika
我已经用你提到的睡眠()测试过了,但是这也没有帮助:(也许我错过了arduino端的东西? – Mika
如果我告诉Arduino在接收到一个字节后写入smth到串口也没有工作。 char c =(char)Serial.read(); buffer [buffercount ++] = c; Serial.print(“L”); – Mika