2017-01-10 63 views
0

我想通过串口将包含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

回答

0

不知何故c#永远不会注意到“!;”甚至可以在流式传输时从Arduino读取任何字节。我有这种感觉,serialPort.Write()函数阻塞端口。

Write命令不被阻塞的端口。 arduino比你的电脑慢得多。所以,这两条线之间:

serialPort.Write(c.ToString()); 

if (serialPort.BytesToRead > 0) 

Arduino的被占用,没有数据接收尚未。因此BytesToRead0。解决这个问题的两种可能性立即出现在我的脑海中。

1)使用serialPort.DataReceived事件进行异步处理。这将在您每次收到数据时触发。然后你就可以在该事件中所接收到的数据作出反应或

2)只要给Arduino的一些时间System.Threading.Thread.Sleep(1000);

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

你需要找出哪些是最小的时间跨度等。

+0

听起来合法的,但同时C#应用程序保持其流从未发生过收到任何东西。我认为你的答案可能是对的,但我很好奇,如果它100%正确的话。如果我保持流式传输,则没有响应。 – Mika

+0

我已经用你提到的睡眠()测试过了,但是这也没有帮助:(也许我错过了arduino端的东西? – Mika

+0

如果我告诉Arduino在接收到一个字节后写入smth到串口也没有工作。 char c =(char)Serial.read(); buffer [buffercount ++] = c; Serial.print(“L”); – Mika