Как поддерживать связь c# и ardunio в синхронизации c? - PullRequest
0 голосов
/ 04 мая 2020

Я пишу простое приложение, в котором 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 (). Я не дал весь код, потому что это большой блок. Но я могу дать его по частям, если вы скажете, где вы хотите.

Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...