Я пишу простое приложение, в котором Ardunio отправляет прочитанные данные в программу C#, используя простые serial.write (). Я отправляю данные из Ardunio со специальным синтаксисом, и программа c# читает и интерпретирует их и, в конечном итоге, отображает данные.
Например, программа Ardunio отправляет данные
Serial.write("DATA 1 3 90;");
, что означает : Значения X и Y на графике 1 равны 3 и 90 соответственно. И программа c# читает ее, используя
private async void Serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
await serialport.BaseStream.ReadAsync(buffer, 0, 1024);
await Task.Run(() => Graph()); // Graph function graphs the data
}
. В функции graph () я конвертирую буфер в строку с помощью Encode.ASCII.GetString (buffer); и интерпретировать данные с синтаксисом и прочее. Но по какой-то причине либо программа c# не читает его достаточно быстро, либо Arduino не отправляет его достаточно быстро, и сообщения иногда прерываются. Например, полученный мной пакет:
DATA 2 5 90; ДАННЫЕ 5 90 10; ДАННЫЕ 1 1 <| -------- Я не могу получить последнее значение Y </p>
И следующий модуль данных начинается с
75; ДАННЫЕ 5 4 60; ДАННЫЕ 14 5 6; ДАННЫЕ
/ \
|
+ ======================== = Это здесь
Кстати, все пакеты по 32 байта.
Так что мне нужно либо получать данные построчно, но я не могу этого сделать, потому что ardunio отправляет их слишком быстро
Serial.write("DATA 1 3 90;");
Serial.write("DATA 2 4 40;");
Приходит к C# как ДАННЫЕ 1 3 90; ДАННЫЕ 2 4 40; в целом блок. Или мне нужно получить все сразу?
(я предпочитаю получать это построчно)
ОБНОВЛЕНИЕ:
Когда задержка (1000); добавляется между отправками. Данные обрабатываются правильно. Без задержек Arduino отправляет данные слишком быстро, а данные сбиваются и прерываются. Как я могу убедиться, что данные не задерживаются, но данные надежны и без перебоев?
ОБНОВЛЕНИЕ 2:
Когда размер буфера также увеличен до 100 *1024* 1024 Что касается метода readCount в методе ReadAsyn c, то сообщение чтения еще больше с прерываниями.
Я могу дать вам любую дополнительную информацию.
ОБНОВЛЕНИЕ 3:
Я постараюсь ответить на комментарии;
Прежде всего, я уже делаю это, и я забыл упомянуть об этом. Я разделяю входящие данные с точки с запятой и интерпретирую их одну за другой с помощью foreach l oop
Во-вторых, я использую буфер глобально, а не передаю его в качестве аргумента функции графика
Третий Я попробую Serial.PrintLine и сообщу вам о нем
ОБНОВЛЕНИЕ 4:
Мне удалось решить проблему, заменив ReadAsyn c на Serial.ReadLine () и serial.write. с serial.printline (); Решение предложено Хансом Пассантом
ОБНОВЛЕНИЕ 5:
Я все еще сталкиваюсь с той же проблемой, но по-другому. Функция графика asyn c, поэтому, когда я пишу данные так быстро, я пропускаю некоторые данные, пытаясь построить график и прочитать другие данные.
Кроме того, поскольку функция графика asyn c управление диаграммой строит точки без порядок и график становится беспорядочным.
Это может быть легко решено, если я добавлю задержку (50) между
PS Serial.println (). Я не дал весь код, потому что это большой блок. Но я могу дать его по частям, если вы скажете, где вы хотите.
Любая помощь приветствуется.