[英]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.