Проблема с получением последовательного соединения между C # и C - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть микропроцессор с кодом C и компьютер с кодом C #.Я пытаюсь заставить их общаться через последовательное соединение (System.IO.Ports.SerialPort).У меня нет проблем с подключением, скорее проблемы с подключением.

В C # у меня есть такой код для отправки строки "rr \ n":

mySeiralPort.WriteLine("rr");

В C (на микроконтроллере),У меня есть такой код, чтобы получить строку:

gets(str);

Обратите внимание, что поток STDIN является потоком последовательного порта.Здесь вещи становятся интересными.В качестве теста у нас есть немного кода, который заставляет светиться светодиод, если str равно "rr".Это позволяет нам наблюдать, получил ли микроконтроллер его должным образом.

При использовании HyperTerminal я могу набрать «r», затем «r», затем нажать «Enter» ->, и светодиод загорается,сигнализируя, что он действительно прочитал «rr» из последовательного потока.Однако, когда я использую вышеупомянутую WriteLine функцию из C #, мы не получаем такого результата.

Я считаю, что это сводится к функциональности HyperTerminal, посылающей посимвольные символы, и что функция gets()читает символ за символом, пока не встретит символ новой строки.

Может кто-нибудь пролить свет на то, как заставить функции C # WriteLine() и C gets() работать вместе?

Ответы [ 5 ]

3 голосов
/ 09 февраля 2011

Классическая ошибка - забыть включить сигналы квитирования, включив аппаратное квитирование или установив для свойств SerialPort.DtrEnable и RtsEnable значение true. Устройства последовательного порта должны ничего игнорировать, пока не обнаружат, что другой конец включен и готов к приему.

Менее вероятно, что микроконтроллер недостаточно быстро реагирует на полученные байты. Либо потому, что он медленно реагирует на прерывание, либо использует опрос. Это может вызвать ошибку переполнения приемника с потерей полученного байта. Снижение скорости передачи данных исправит это.

1 голос
/ 09 февраля 2011

Вероятно, это проблема буферизации, но она также может быть связана с тем, что микропроцессор ожидает в качестве конца конца строки. HT отправляет только новую строку или возврат каретки после новой строки?

Прежде всего, определите, что ожидает микропроцессор в конце строки. Затем используйте Write вместо WriteLine и запишите отдельные байты в ASCII. Помните, что .NET любит использовать UNICODE, но микропроцессор, вероятно, ожидает ASCII.

Возможно, вы отправили байты Unicode или, возможно, вы отправили символ возврата каретки, который не ожидался и был присоединен к RR.

Обратите внимание, что у этого класса есть атрибут NewLine. Возможно, вы сможете настроить WriteLine, установив его правильно. Есть еще один атрибут, называемый кодированием. Вы установили ASCII?

1 голос
/ 09 февраля 2011

Рассматривали ли вы использование осциллографа или логического анализатора для определения проблемы?Если вы работаете со встроенными системами, эти инструменты необходимы.Использование этих инструментов может сказать вам, что метод WriteLine делает или не делает по сравнению с HT.

1 голос
/ 09 февраля 2011

HyperTerminal может (вероятно, есть) использовать символ новой строки из C #.Попробуйте написать «rr \ r» или «rr \ n» вместо использования WriteLine.

0 голосов
/ 09 февраля 2011

C # может отправлять 2 байта для каждого r (например, UTF16), тогда как гипертерминал, вероятно, просто отправляет 1 байт для каждого r (например, ASCII).

Возможно, вы захотите посмотреть на строки в c # для получения информации о том, как они кодируются.

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