Добрый день может кто может подсказать где можно найти описание функций используемых в 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??? И как потом обрабатывать полученные данные???
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, размер должен быть достаточен для приема самой длинной из возможных посылок. Как обрабатывать - зависит от того, какие данные вы принимаете.
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Ах, да, L означает, что число представляет собой long int
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
вот что бывает, когда пишешь что-то второпях
Для того, чтобы писать/читать что-то из массива с помощью указателя, надо создать отдельную переменную-указатель:
char data[4];
char* pc = data;
//Передача очередного байта в СОМ-порт
ToCom(port,*pc++);
/* ..... */
//Прием очердного байта
*pc++ = ReadCom4();
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
На сколько я понял данные в приведенном тобой примере записываються обратно в массив data или я не прав???
В примере такого небыло. Я уже давно понял что там многое не так написано!!!
И если не трудно объясни поподробней как мне передать такой запрос как описан выше на датчик???
Да, тот кусок кода, что я привел будет работать с одним и тем же массивом. Пример из последнего поста (как и твои предыдущие примеры) можно рассматривать только как примеры синтаксиса вызова функций. Для полноценной процедуры обмена нужно сделать много чего еще...
А теперь конкретно - как отправить двоичное число:
unsigned short int byData = 0x0808;
char* pc = (char*) &byData;
//дальше берем твой исходный код с минимальными изменениями:
InstallCom(port,57600L,8,0,1);
Set485DirToTransmit(4);
for(i=0;i<4;i++)
ToCom(port,*pc++);
WaitTransmitOver(4);
Set485DirToReceive(4);
RestoreCom(4);
Вроде должно работать Надо только помнить, что место функциям типа InstallCom() там, где идет инициализация программы (т.е. вызывать Install... /Restore... надо только один раз в ходе работы программы, или если в процессе работы надо изменить параметры порта - скорость, биты данных и т.д.)
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Небольшая поправка. По идее т.к. sizoef(short int)==2, то должно быть
Небольшая поправка. По идее т.к. sizoef(short int)==2, то должно быть
for(i=0;i<2;i++)
ToCom(port,*pc++);
Действительно, я пропустил этот момент. 0x0808 умещается в 2 байта
Теория - это когда все знаешь, но ничего не работает.
Практика - это когда все работает, но никто не знает как.
Тут вроде не видно очень важных функций для приема данных, без которых нормальной работы не будет, а сплошная морока.
Перед чтением данных нужно проверить что накопилось в буфере приема (после InstallCom драйвер работает автоматически). Есть две функции: IsCom(port) и DataSizeInCom(port). Какую из них применять, надо прикинуть по месту. Если цикл опроса быстрый и данные приходят неспеша - то удобна IsCom() которая проверяет один байт. Наоборот, когда цикл медленный и ожидается напор байтов - нужна DataSizeInCom() , она проверяет сразу блок. После проверки дату надо сразу читать, а то насыпет еще.
Кроме того надо организовать буфер с динамическими указателями записи и чтения. Обычно это кольцевой буфер размером 256, 512, 1024 и т.д. байт. При чтении данные кладуться в буфер и указатель записи передвигается на число байт. Указатель чтения смотрит на сколько он отстал, и догоняет указатель записи. Главно чтобы общая средняя скорость заполнения буфера не превышала скорость извлечения данных, т-е указатель чтения всегда должен догонять запись. Ну а если и переполнится, не беда - буфер то кольцевой.
Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме