我想通过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 回答
Write
命令未阻止该端口 . arduino比你的电脑慢得多 . 所以在这两行之间:arduino被占用,没有收到数据 yet . 因此
BytesToRead
是0
. 解决的两种可能性就在我脑海中 .1)使用
serialPort.DataReceived
事件进行异步处理 . 每次收到数据时都会触发此操作 . 然后,您可以对该事件中收到的数据做出反应或2)只需给arduino一些时间
System.Threading.Thread.Sleep(1000);
您需要找出等待的最小时间 Span .