Программирование WinCon i7188 |
Ответить |
Автор | |
Новичок Присоединился: 23 Январь 2010 Online Status: Offline Публикации: 27 |
Опубликовано: 16 Август 2010 07:53 |
Добрый день может кто может подсказать где можно найти описание функций используемых в WinCon? В стандартном manual приведены только несколько примеров и то не понятно как работающих!!! Или ответить на вопросы: 1. Для отправки двоичного числа 0000100000001000 на порт мне достаточно написать следующие строки: char data[4]="0808"; InstallCom(port,57600L/*(Кстати почему L)*/,8,0,1); Set485DirToTransmit(4); for(i=0;i<4;i++) ToCom(port,data); WaitTransmitOver(4); Set485DirToReceive(4); RestoreCom(4); 2. Чтобы получить данные достаточно написать: InstallCom(port,57600L,8,0,1); if(IsCom4()) { data=ReadCom4(); } RestoreCom4(); И что будет записанно в переменной data на сколько я понял все 8 принятых на Com порт байт??? В таком случае какой тип должен быть у переменной data??? И как потом обрабатывать полученные данные??? |
|
Действительный член Присоединился: 27 Июль 2006 Online Status: Offline Публикации: 304 |
|
1. Описание функций см. на фирменном диске в файле \Napdos\MiniOS7\Document\MiniOS7_API_Functions_ver?.?.pdf 2. Описанный алгоритм, по идее, должен отправить не двоичное число, а последовательность символов '0', '8', '0', '8'. Но у вас он отправит неизвестно что из-за ошибки в вызове ToCom. Должно бытьтак: ToCom(port,*data++); 3. Ваш вариант приема примет только 1 байт, при его наличии в буфере приема... и не сможет его никуда записать. Нормальный компилятор не должен пропустить такое: char data[4]; /*...*/ data = /*любое выражение */ Опять-таки, нужно разыменовывать указатель. То есть для приема вам нужно время от времени проверять наличие данных в порту (IsCom4()), при их наличии складывать байты в массив (например, так: *data++ = ReadCom4(); ), и параллельно отслеживать признак окончания приема. По достижению этого признака, обработать накопленные данные в массиве data. Тип у массива data должен быть char или unsigned char, размер должен быть достаточен для приема самой длинной из возможных посылок. Как обрабатывать - зависит от того, какие данные вы принимаете. |
|
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как. |
|
Действительный член Присоединился: 27 Июль 2006 Online Status: Offline Публикации: 304 |
|
Ах, да, L означает, что число представляет собой long int
|
|
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как. |
|
Действительный член Присоединился: 27 Июль 2006 Online Status: Offline Публикации: 304 |
|
вот что бывает, когда пишешь что-то второпях Для того, чтобы писать/читать что-то из массива с помощью указателя, надо создать отдельную переменную-указатель: char data[4]; char* pc = data; //Передача очередного байта в СОМ-порт ToCom(port,*pc++); /* ..... */ //Прием очердного байта *pc++ = ReadCom4(); |
|
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как. |
|
Новичок Присоединился: 23 Январь 2010 Online Status: Offline Публикации: 27 |
|
На сколько я понял данные в приведенном тобой примере записываються обратно в массив data или я не прав??? В примере такого небыло. Я уже давно понял что там многое не так написано!!! И если не трудно объясни поподробней как мне передать такой запрос как описан выше на датчик??? |
|
Действительный член Присоединился: 27 Июль 2006 Online Status: Offline Публикации: 304 |
|
Да, тот кусок кода, что я привел будет работать с одним и тем же массивом. Пример из последнего поста (как и твои предыдущие примеры) можно рассматривать только как примеры синтаксиса вызова функций. Для полноценной процедуры обмена нужно сделать много чего еще... А теперь конкретно - как отправить двоичное число: unsigned short int byData = 0x0808; char* pc = (char*) &byData; //дальше берем твой исходный код с минимальными изменениями: InstallCom(port,57600L,8,0,1); Вроде должно работать Надо только помнить, что место функциям типа InstallCom() там, где идет инициализация программы (т.е. вызывать Install... /Restore... надо только один раз в ходе работы программы, или если в процессе работы надо изменить параметры порта - скорость, биты данных и т.д.) |
|
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как. |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Новичок Присоединился: 19 Июль 2005 Категория: Ukraine Online Status: Offline Публикации: 39 |
|
Небольшая поправка. По идее т.к. sizoef(short int)==2, то должно быть for(i=0;i<2;i++) |
|
Действительный член Присоединился: 27 Июль 2006 Online Status: Offline Публикации: 304 |
|
Действительно, я пропустил этот момент. 0x0808 умещается в 2 байта |
|
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как. |
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Тут вроде не видно очень важных функций для приема данных, без которых нормальной работы не будет, а сплошная морока. Перед чтением данных нужно проверить что накопилось в буфере приема (после InstallCom драйвер работает автоматически). Есть две функции: IsCom(port) и DataSizeInCom(port). Какую из них применять, надо прикинуть по месту. Если цикл опроса быстрый и данные приходят неспеша - то удобна IsCom() которая проверяет один байт. Наоборот, когда цикл медленный и ожидается напор байтов - нужна DataSizeInCom() , она проверяет сразу блок. После проверки дату надо сразу читать, а то насыпет еще. Кроме того надо организовать буфер с динамическими указателями записи и чтения. Обычно это кольцевой буфер размером 256, 512, 1024 и т.д. байт. При чтении данные кладуться в буфер и указатель записи передвигается на число байт. Указатель чтения смотрит на сколько он отстал, и догоняет указатель записи. Главно чтобы общая средняя скорость заполнения буфера не превышала скорость извлечения данных, т-е указатель чтения всегда должен догонять запись. Ну а если и переполнится, не беда - буфер то кольцевой. С форматом данных разберитесь сами, это мелочь. С уважением,SAN |
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |