【发布时间】:2017-05-24 14:32:25
【问题描述】:
我想通过串行端口将包含 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 启动。
【问题讨论】:
标签: c# arduino serial-port streaming communication