Я хотел бы передать текстовый файл, содержащий 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
.
Звучит законно, но в то время как приложение C# сохраняет потоковое вещание, оно никогда не получает ничего. Я думаю, что ваш ответ может быть правильным, но мне интересно, если это на 100% правильно из-за этого. Если я продолжаю передавать потоки, ответа не будет. – Mika
Я тестировал это со своим упомянутым сном(), но это не помогает :(может быть, я что-то упустил на стороне arduino? – Mika
, если я скажу Arduino написать smth для serialPort после получения байта, который не работает Не работай. char c = (char) Serial.read(); buffer [buffercount ++] = c; Serial.print ("L"); – Mika