2017-01-10 4 views
0

serialPort를 통해 Arduino UNO에 G 코드가 포함 된 텍스트 파일을 스트리밍하고 싶습니다.serialPort를 통해 Arduino UNO에 큰 파일을 스트리밍하는 C#

Arduino는 SerialEvent로 모든 바이트를 수신하여 buffer라는 char 배열에 추가합니다. 버퍼가 가득 차면 "!;" 시리얼 포트를 통해 C#. Arduino IDE의 Serial Montior 응용 프로그램에서 테스트 한 결과 제대로 작동합니다. 하지만 C#에서 보낼 수있는 텍스트를 입력 할 수 없습니다. :)

C# 프로그램은 줄 바른 방식으로 G 코드 파일을 읽은 다음 줄의 각 문자를 arduino로 보냅니다. 각 문자 뒤에 Arduino가 버퍼가 가득 찼다 고 나에게 알려주는지 확인하고 싶습니다. 그렇지 않으면 스트리밍을 계속하십시오.

어떻게 든 C#은 "!;" 스트리밍하는 동안 Arduino에서 읽는 모든 바이트를 가져옵니다. serialPort.Write() 함수가 포트를 차단한다는 느낌이 들었습니다.

은 아두 이노 코드입니다 :

void serialEvent() 
{ 
    // wenn im Puffer noch platz ist 
    if (buffercount < MAX_BUF) 
    { 
    char c = (char)Serial.read(); 
    buffer[buffercount++] = c; 
    } 
    else 
    { 
    Serial.print("!;"); 
    } 
} 

serialEvent는 아두 이노 포트에 바이트를 수신 할 때마다 발생합니다. BytesToRead이 결코 없기 때문에

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()가 결코 발생하지 : Max_BUF는 64

의 값이 C# 코드입니다 있습니다. ";" 두 줄 끝에 대한 표시입니다. startStreaming은 비동기 스레드에서 BackGroundWorker으로 시작됩니다.

답변

0

어떻게 든 C#은 "!" 스트리밍하는 동안 Arduino에서 읽는 모든 바이트를 가져옵니다. serialPort.Write() 함수가 포트를 차단한다는 느낌이 들었습니다.

Write 명령이 포트를 차단하지 않습니다. Arduino는 컴퓨터보다 훨씬 느립니다. 이 두 선 사이 그래서 :

serialPort.Write(c.ToString()); 

if (serialPort.BytesToRead > 0) 

아두 이노 점유하고 데이터가 아직을 을받지 않습니다. 따라서 BytesToRead0입니다. 바로 지금 내 마음에 와서 해결할 수있는 두 가지 가능성.

1) 비동기 처리를 위해 serialPort.DataReceived 이벤트를 사용하십시오. 이는 데이터를 수신 할 때마다 트리거됩니다. 그런 다음 해당 이벤트에 수신 된 데이터에 반응 할 수 또는

2) 그냥 당신이 기다리는 최소 시간 범위 인 알아낼 필요 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가 serialPort에 바이트를 수신 한 후에 smeth를 써야한다면 '일하는 것도. char c = (char) Serial.read(); 버퍼 [buffercount ++] = c; Serial.print ("L"); – Mika