реклама на сайте
подробности

 
 
> COM-порт - МК, Управление устройствами на МК с компьютера
Tiny
сообщение Aug 22 2010, 12:31
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 10-07-06
Пользователь №: 18 720



Вопрос к тем, кто работал по данной теме.
100 устройств. На каждом установлен по одному MEGA16, которые должны при поступлении команды от компьютера сбросить один из 13 пинов устройства на ноль.
Реализовал следующим образом. Компьютерную часть программы писал на Borland Builder C++. На удаленном компьютере нажимается кнопка, соответствующая команда (3 знака - номер устройства + 2 знака - номер пина, например 00101 - 1-е устройство, 1 пин) поступает на сервер. С сервера через СОМ-порт на UART МК.
Для МК писал в CodeVision AVR. При получении сигнала происходит прерывание UART, полученные данные перекодируются из кода ASCII в десятичные и сохраняются. Если номер устройства совпал с реальным номером данной платы (задается положением переключателей на потре B ), то анализируются полученные данные. Соответствующий пин порта А или С сбрасывается на 0, обратно для подтверждения отправляется полученный код, предварительно перекодировав его обратно в код ASCII из десятичных.
МК работает с кварцевой стабилизацией 14400кГц. (Реально стоит 14,31818, другого пока не нашел). Скорость UART 14400кГц.
С одним МК работает. Когда достану преобразователь RS232-RS485 - подключу в линию другие устройства.
Возникает вопрос. Когда будут подключены 100 устройств на 100МК и с Интернета на сервер будут одновременно обращаться десятки команд, будет ли все это работать?
При передаче команды вначале идет старт-бит, данные, стоп-бит. В эту процедуру никто посторонний не влезет. Так для передачи 00101 от 1-го пользователя эта процедура должна произойти 5 раз. А не получится ли так, что после передачи двух младших разрядов сюда вклинется другой пользователь передающий команду, допустим 05603?


Сообщение отредактировал Tiny - Aug 22 2010, 12:34
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Aug 22 2010, 13:43
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Tiny @ Aug 22 2010, 15:31) *
А не получится ли так, что после передачи двух младших разрядов сюда вклинется другой пользователь передающий команду, допустим 05603?

Коллизия не возникнет, если вы правильно напишите алгоритм работы сервера. Выход сервера должен быть буферизирован. Т.е. он не должен отправлять команды аппаратам в тот же момент, как приходит команда от клиента, а должен складывать сформированные команды в (циклический) буфер FIFO. А физическая передача на аппаратную "шину" производиться уже из буфера, причем в порядке ОБЩЕЙ ОЧЕРЕДИ.
Поэтому, заказ клиента будет дешифроваться, превращаться в команды, а затем помещаться в буфер. Причем следует особо озаботиться тем, чтобы команда аппарату писалась в буфер не по частям, а сразу в один присест. Тогда если у вас приложение однопоточное, то коллизии с наложением байтов не возникнут, а если многопоточмное, что придется сделать какой-нибуть семафор, чтобы не позволял другому процессу писать в буфер, пока в него не окончит запись другой. Такая ситуция типична для многих многопроцессорных алгоритмов.
Короче говоря, вам надо создать очередь на вывод в виде буфера и организовать в него запись исключительно целыми командами. Сделать это всегда возможно, т.к. в момент формирования команды все ее байты полностью известны.

Можно поступить и по-другому, учитывая, что посылка от клиента занимает всего один байт, - класть в буфер однобайтные запросы от клиентов, а в содержимое буфера обрабатывать в порядке очереди, преобразуя байт-запрос в командную посылку, и тут же ее отправлять. Тогда коллизий тоже не возникнет, но какой-то арбитраж на буфере все равно понадобится, т.к. придется следить за тем, чтобы его счетчик очереди инкреметировался правильно. В конце концов то на то и выйдет.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.04267 секунд с 7
ELECTRONIX ©2004-2016