Работа с СОМ-портом в matlab

stm2383383

Здравствуйте, уважаемые форумчане.
У меня есть некий прибор, который взаимодействует с копьютером через СОМ-порт. Программа, которая идет с прибором, слишком убога, чтобы использовать все возможности прибора. Долго пытался работать с ней, но вот теперь окончательно решил, что надо писать свою.
Прогаю я на матлабе, с СОМ-портом он работать может. Однако я никогда с подобным не сталкивался, поэтому сразу встретил кучу вопросов.
Скажу сразу, если кто-то имеет опыт написания функций в матлабе для работы с приборами (двухстороний обмен данными) через СОМ-порт, готов предложить завкафу рассмотреть вариант оплаты создания парочки подобных функций (думаю, прокатит. Кстати, есть описание протокола от производителя, т.е. перехватывать данные и расшифровывать их не надо будет). Интерфейс я сам напишу. Нужны только функции для обмена данными с прибором.
Если кто-то знает хороший интернет-ресурс, где новичку можно почитать по этой теме, то я тоже буду очень благодарен.
Если нет, то не пинайте сильно за вопросы, которые я тут буду задавать. Я не программист, некоторые вещи могут показаться вам примитивными, однако я их не знаю. Как, например, округление в двоичной системе десятичной дроби, о чем я уже тут спрашивал.

stm2383383

Коннектиться к СОМ-порту и читать с него протокол NMEA я уже научился. Теперь осваиваю двухсторонний бинарный обмен данными.
Итак, первый вопрос.
В руководстве от производителя сказано, то программа сначала посылает прибору запрос 0х00 и ждет от него ответ 0х24.
Что это за формат записи числа? Каким образом эти числа мне создать в матлабе?

c3po

hexadecimal
Нужно послать 8 бит, содержаших 00000000, и получить 8 бит, содержащих 00100100.
В матлабе uint8(0) и uint8(36)

stm2383383

Спасибо. Но я все равно не понимаю. Например, откуда взялось число 36?
В общем, как расшифровать запись 0х24 (пусть будет AxBC).

Vlad128

0х24 (пусть будет AxBC).
0xZYX — это ZYX в шестнадцатеричной системе 0x24 = 2 * 16 + 4 = 36

stm2383383

Ага.
Спасибо. Кое-что прояснилось. Теперь буду пробовать коннектиться к прибору.

stm2383383

Продолжаю ботать СОМ-порт.
Чтобы было понятно, выложу, что прислал производитель прибора:
1. Инициализация обмена
Скорость 28800, 8 бит, 1 стоп
ПК шлет 0х00, до тех пор, пока не получит в ответ 0х24,
и результат команды «Версия прибора» (см. ниже)
после инициализации обмена, прибор находиться в режиме ожидания
команд от ПК и не выполняет больше никаких действий.
2. Команда «Версия прибора»
ПК: 0х24 0х49 0х56
Прибор: 0х24
word - версия ПО
byte - день даты ПО
byte - месяц даты ПО
byte - год даты ПО
word - версия памяти
Я написал такую вот простенькую программку:
s = serial('COM1');
isvalid(s)
set(s, 'BaudRate', 28800)
set(s, 'StopBits', 1)
set(s, 'Timeout', 0.05')
fopen(s)
for i =1:100
fwrite (s, 0)
inp = fread(s)
if ~isempty(inp)
break
end
end

fclose (s)
delete (s)
clear s

Программка с интервалом 0.05 сек кидает 0 в компорт и ждет от него хоть какого-нить ответа.
Первый вопрос в том, что на это уходит несколько секунд. Например, может 50 шаге ответить, может раньше, может позже. Хотя программа от производителя практически мгновено коннектится. В какую сторону здесь ботать? Хотя, это, конечно, неважно пока.
Вопрос второй. После того, как моя программа получается хоть какой-нить ответ, она останавливается и показывает, что получила. Прибор действительно "зависает" в ожидании действий от компьютера, однако я не понимаю ответ.
В переменной inp у меня сохраняется стоблец
252
40
32
0
второй вариант
252
40
0
252
еще вариант:
252
28
20
32
То есть постоянно только первое число.
Это не похоже на то 0х24 (36 в десятичной системе которое должен мне выдать прибор. Как вы думаете, куда надо двигаться? Потому как я в некотором ступоре.

seregaohota

по-моему в винде через (гипер)терминал в Пуск-стандартные-связь можно посмотреть что передается через COM и записать в файл полный протокол обмена

stm2383383

К сожалению, прибор не шлет данные в комп, пока не получит из компа команду. То есть, если я подключу гипертерминал к СОМ-порту, там ничего не будет. Я побовал подключать гипертерминал к виртуальному СОМ-порту, который соединен нульмодемным кабелем со вторым виртуальным портом, к которому подключена программа. Получалось, что при нажатии кнопки в программе, в гипертерминале появлялаось $CE Через несколько секунд еще раз $CE и программа говорила, что не может подключиться к прибору.
Права, гипертерминал не может работать на скорости 28800, но другие скорости дают тот же результат.

stm2383383

Через виртуальный СОМ-порт я коннектился к программе. Она действительно посылает 0. Я отправлял ей 36 (0х24 и программа подвисала чуть дольше, но выдавала ошибку прибора, а не невозмжность к нему подключиться. То есть, что-то тут работает. Но где-то я неправильно делаю.

seregaohota

на вики про ком ссылка на викиучебник про программирование под виндой
там на си примеры, еще поэкспериментировать с таймаутом разные числа эспериментально подобрать, можно ли прогу производителя через терминал законнектить и посмотреть что они пишут если так быстро им прибор отвечает и слизать
еще плата есть с ком не виртуальным, кто-то спрашивает тут периодически старый комп ком-портом, но я свой приятелю отдал
когда я программил в силу необходимости - у меня создалось впечатление шаманства, но мне надо было не особо этим заниматься - там другой парень программил основное и давно как-то, у меня прога пошла, я и забил дальше разбираться, тем более вскоре уволился
еще какой там поярдок-бит-байт, а то если твоя структура inp не побайтная, то ты там можешь с переставленными байтами что хочешь увидеть, это как в десятичном числе цифры переставить
и попроси модеров в девелопмент перенести, там более знающие люди по этой теме имхо, чем в стади

seregaohota

К сожалению, прибор не шлет данные в комп, пока не получит из компа команду. То есть, если я подключу гипертерминал к СОМ-порту, там ничего не будет
по-моему там можно даже ручками набрать и послать, или не там, не помню
Оставить комментарий
Имя или ник:
Комментарий: