/* Функции и структуры для работы с последовательным портом в ОС Windows */ /* для pmkcom v0.17 */ HANDLE hPort=NULL; /* Дескриптор порта, создается при открытии и используется для всех операций с портом */ DCB dcb; /* Device Control Block - установки, управляющие работой порта */ COMMTIMEOUTS cto; /* Структура, задающая тайм-ауты последовательного порта */ int openport; /* номер уже открытого порта, 0 - нет открытых */ long mkspeed=9600; // Текущая скорость обмена (для конкретной команды) long mkport_speed=9600; // Установленная скорость обмена int mkport_rinter=40; /*cto.ReadIntervalTimeout=40; Максимальное время между чтением байт, мс */ int mkport_rinter9=40; /*cto.ReadIntervalTimeout=40; Максимальное время между чтением байт, мс */ int mkport_rtconst=300; /* cto.ReadTotalTimeoutConstant=300; Время ожидания начала приема, мс */ int mkport_rtconst9=300; /* cto.ReadTotalTimeoutConstant=300; Время ожидания начала приема, мс */ int mkport_rtmult=0; /* cto.ReadTotalTimeoutMultiplier=0; Множитель для вычисления общего времени чтения */ int mkport_rtmult9=0; /* cto.ReadTotalTimeoutMultiplier=0; Множитель для вычисления общего времени чтения */ int mkport_wtconst=100; /* cto.WriteTotalTimeoutConstant=100; Время ожидания начала записи, мс */ int mkport_wtconst9=100; /* cto.WriteTotalTimeoutConstant=100; Время ожидания начала записи, мс */ int mkport_wtmult=10; /* cto.WriteTotalTimeoutMultiplier=10; Множитель для вычисления общего времени записи, мс */ int mkport_wtmult9=10; /* cto.WriteTotalTimeoutMultiplier=10; Множитель для вычисления общего времени записи, мс */ int mkport_popros=500; // период опроса, мс int mkport_pwrite=400; // период записи, мс int mkport_pwrite9=400; // период записи для 9600, мс int mkport_pread=300; // период чтения, мс int mkport_pread9=300; // период чтения для 9600, мс /*--------------------*/ /* ----------------------------------------------------------------- ПОРТ */ /*-------------------------------------------- PORT OPEN */ int port_open(int ncom) { /* В WIN порт открывается и закрывается при любой команде (для совместимости с USB-COM) */ int re=0; int i; maxlbuf=256; // Реально в ЭВМ команды не больше 256 байт /* Инициализация буферов */ for (i=0; i0)&&(lenrbuf=256) l-=256;} if (rbuf[lenrbuf-1]!=(BYTE)l) {re=257; goto end;} /* Проверка формата команды - наличие в ответе обязательных полей */ if ((rbuf[0]!=0)||(rbuf[1]!=n)) {re=257; goto end;} if ((rbuf[5]!=z) || (rbuf[6]!=r)) {re=257; goto end;} if (rbuf[4]==0x40) {re=rbuf[7]; goto end;} /* принят пакет с сообщением об ошибке */ if ((z>=0x10)&&(r!=0)&&(lenrbuf==13)) { /* если был запрос числовой величины и длина пакета соответствует типу float, выполнить соответствующее преобразование и перенести принятые данные в глобальную переменную dd */ for (i=7; i7)) { /* при запросе байтовых данных заполнить строку mstr */ for (i=7; i=32) mstr[i-7]=(char)rbuf[i]; else mstr[i-7]=' '; mstr[i-6]=0; } f_str=1; } end: return(re); }