Доброе время суток! Возникла проблема: код на 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' то продолжаем. Нет - отбрасываем, начинаем сначала.
Комментариев нет:
Отправить комментарий