2017-01-10 2 views
0

Я хотел бы передать текстовый файл, содержащий G-код, в Arduino UNO через serialPort.C# потоковой передачи большого файла через serialPort в Arduino UNO

Arduino получает все байты с SerialEvent и добавляет его в массив символов с именем buffer. Если буфер заполнен, он должен отправить сообщение «!;» через последовательный порт на C#. Это прекрасно работает, поскольку я тестировал его с помощью приложения Serial Montior в среде Arduino. Но я не могу набирать текст так быстро, как C# может отправить его :)

Программа C# считывает файл G-кода linuxise и затем отправляет каждый символ в строку на 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 не блокирует порт. Ардуино намного медленнее, чем ваш компьютер. Так между этими двумя линиями:

serialPort.Write(c.ToString()); 

if (serialPort.BytesToRead > 0) 

Arduino занят и никаких данных не получен еще. Поэтому BytesToRead - 0. Две возможности для решения этой проблемы сразу приходят мне в голову.

1) Используйте событие serialPort.DataReceived для асинхронной обработки. Это будет срабатывать каждый раз, когда вы получаете данные. Тогда вы можете реагировать на полученных данных, в этом случае или

2) Просто дайте Arduino некоторое время с System.Threading.Thread.Sleep(1000);

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

Вы должны выяснить, что является минимальным TimeSpan ждать.

+0

Звучит законно, но в то время как приложение C# сохраняет потоковое вещание, оно никогда не получает ничего. Я думаю, что ваш ответ может быть правильным, но мне интересно, если это на 100% правильно из-за этого. Если я продолжаю передавать потоки, ответа не будет. – Mika

+0

Я тестировал это со своим упомянутым сном(), но это не помогает :(может быть, я что-то упустил на стороне arduino? – Mika

+0

, если я скажу Arduino написать smth для serialPort после получения байта, который не работает Не работай. char c = (char) Serial.read(); buffer [buffercount ++] = c; Serial.print ("L"); – Mika

Смежные вопросы