Страницы

Поиск по вопросам

суббота, 16 марта 2019 г.

Чтение данных с arduino uno через COM порт

Доброе время суток! Возникла проблема: код на arduino нормально работает, во встроенном мониторе порта данные правильно отображаются. Но в приложении на C#, особенно очень часто в самом начале приходит непонятных мусор вместо значений. Типичные значения во встроенном мониторе:
145 0 145 0
Значения в программе на C#:
SSH(??j - откуда берутся эти строки? 145 143 ??j
Код программы
public partial class MainWindow : Window { SerialPort sp = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
public MainWindow() { InitializeComponent();
sp.DataReceived += new SerialDataReceivedEventHandler(OnDataReceived); sp.Open(); }
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e) { Dispatcher.BeginInvoke(new Action(delegate() { this.console.Text += sp.ReadExisting(); }));
}
private void ReadPort(object source, ElapsedEventArgs e) {
}
private void readButton_Click(object sender, RoutedEventArgs e) {
} }
}


Ответ

Много работал с компортом и ардуиной. Тагер(для лезертага) делал и прочее. Как я понял мусор в компорте - это вообще норма. Собственно для этого и существуют различные протоколы передачи данных. В простейшем случае, ты должен сначала слать идентификатор начала данных. Это может быть что угодно. Допустим [StartData]. Следом шлешь данные. А после идентификатор конца данных. [StopData]. Не плохо бы еще прикрутить контрольную сумму(гугли по CRC) и длину данных. Тогда в с# ты будешь сначала искать в потоке компорта идентификатор начала пакета. Потом читать ответ до идентификатора конца пакета.
Реализовывать чтение можно по-байтово. Считываем байт - если равен '[', то читаем дальше, если следующий 'S' то продолжаем. Нет - отбрасываем, начинаем сначала.

Комментариев нет:

Отправить комментарий