![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| ProgramerForever |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 15.11.2006 Где: Новосибирск Репутация: нет Всего: 5 |
Делаю некое подобие осциллографа (точнее, самописца). Захотел сделать управление устройством с компьютера.
Самый простой способ - команда вместе с параметрами упаковывается в 1 байт. А на стороне контроллера делаем getchar() - и то, что приняли, то и выполняем. Но. Минусы: -= Число команд ограничено 255ю. -= Нужно запоминать что какой байт означает. -= Если придёт какая-то помеха, то контроллер её выполнет, что приведёт к непредсказуемым последствиям. Если делать команды более понятные человеку (например, "setcountchanells 3"), то сразу решаются вышеперечисленные проблемы. Но я не совсем представляю, как их обрабатывать.. Приходит в голову только так: хранить команды в char-массивах. Принимать по байту, и сравнивать. Приняли команду - принимаем параметр. До конца строки (#13 или #10#13 , не помню точно). А потом выполнять. Может как-нибудь по-другому, и попроще можно сделать? Это же придётся городить огород ещё тот. |
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Твоя задача стара как COM-порт.
В общем тебе нужно использовать протокол. Желательно какой нибудь стандартный, например Modbus, поскольку там уже всё продумано до тебя. Но можно и самописный. При создании своего протокола желательно придерживаться простых правил: 1) посылка начинается с заголовка 2) затем идёт длина посылки в байтах 3) передаваемые данные 4) контрольная сумма Если контрольная сумма неверна, команду просто следует игнорировать. Если же посылка принята нормально, то следует послать в ответ посылку квитирующую принятые данные. Отсутствие этой посылки даст знать, что посылка не дошла, и её следует послать ещё раз. Это сообщение отредактировал(а) Mazzi - 15.5.2010, 18:30 -------------------- Мне нужны помощники. |
|||
|
||||
| ProgramerForever |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 15.11.2006 Где: Новосибирск Репутация: нет Всего: 5 |
Да, наверное так и буду делать (запрос-ответ) с контрольными суммами. В ущерб скорости. Всё равно я делаю прибор для школьного эксперимента, а там тысячи выборок в секунду не важны.
готовый не буду юзать: сложно это. просто в дипломе напишу, что "есть в мире подобные протоколы, например Modbus". Фрейм = Заголовок(признак начала) - Длина_данных - Данные - Контрольная сумма. 1) Что выбрать в качестве начала пакета? 2) Какой длины заголовка будет достаточно? 3) Контрольную сумму вычислять от данных? 4) Какой алгоритм контрольной суммы лучше использовать? (чтобы была простая реализация и, опционально, высокая скорость) |
|||
|
||||
| ProgramerForever |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 15.11.2006 Где: Новосибирск Репутация: нет Всего: 5 |
Сделал так:
Запрос: с_CPX Ответ: OKD с_ - заголовок C - номер команды P - параметр команды X - контрольная сумма (C Xor P) OK - заголовок ответа D - возвращаемые данные |
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |