Форум: Форум C++Разное
Новые темы: 00
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: COM-порт запись/чтение
 
 автор: exp   (13.02.2008 в 18:01)   письмо автору
 
 

неполучается сделать что-то вроде опрос модема сотового
нашёл только статью : http://ru.wikibooks.org/wiki/COM-%D0%BF%D0%BE%D1%80%D1%82_%D0%B2_Windows_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
но так как там у меня не заработало . даже нет нет этого include <vector>
попробовал обойти примерно так:
<?
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
static int TIMEOUT = 5000; 

int main(int argc, char *argv[])
{
DWORD feedback; // ?
unsigned char *str = "";
HANDLE port;
int i, len;

/* функция выходa перед return */
int nosc(char *txt) {
    printf("-- %s\n", txt);
     CloseHandle(port);
  system("PAUSE");
}

/*  функция записи */
int wrmodem(char *zapr) {
len = strlen(zapr);
if(!WriteFile(port, zapr, len, &feedback, 0) || feedback != len ) {
                    nosc("NET WriteFile");
                    return 0;
                    } 
FlushFileBuffers(port);
}

/* функция чтения ответа */
int modemread(char *str) {
   unsigned int begin = GetTickCount();
feedback = 0;
   unsigned int attempts = 3;
 printf("%d\n", (len = strlen(str))); // X

while(len && ((GetTickCount()- begin) < (TIMEOUT / 3) || attempts)) {
           if (attempts) attempts--;
           if(!ReadFile(port, str, 8, &feedback, NULL)) {
                        nosc("NET ReadFile");
                        return 0;
           }
           //assert(feedback <= len);  #include <assert.h>
// len -= feedback;
// str += feedback;
           printf("%s\n", str);
   }
   return 1;
}


/* открытие порта */
port = CreateFile("COM5", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (port == INVALID_HANDLE_VALUE) { 
         printf("Nel'zja otkryt' port\n");
         system("PAUSE");
         return 0;
}
/* настройки */
SetCommMask(port, EV_RXCHAR);
SetupComm(port, 1500, 1500);
   COMMTIMEOUTS CommTimeOuts;
        CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
        CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
        CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
        CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
        CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
if(!SetCommTimeouts(port, &CommTimeOuts)) {
                nosc("NET SetCommTimeouts");
  return 0;
        }
DCB ComDCM;
   memset(&ComDCM,0,sizeof(ComDCM));
        ComDCM.DCBlength = sizeof(DCB);
        GetCommState(port, &ComDCM);
        ComDCM.BaudRate = CBR_115200; // скорость портА модема
        ComDCM.ByteSize = 8;
        ComDCM.Parity = NOPARITY;
        ComDCM.StopBits = ONESTOPBIT;
        ComDCM.fAbortOnError = TRUE;
        ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
        ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
        ComDCM.fBinary = TRUE;
        ComDCM.fParity = FALSE;
        ComDCM.fInX = ComDCM.fOutX = FALSE;
        ComDCM.XonChar = 0;
        ComDCM.XoffChar = 0xff;
        ComDCM.fErrorChar = FALSE;
        ComDCM.fNull = FALSE;
        ComDCM.fOutxCtsFlow = FALSE;
        ComDCM.fOutxDsrFlow = FALSE;
        ComDCM.XonLim = 128;
        ComDCM.XoffLim = 128;
   if(!SetCommState(port, &ComDCM)) {
                nosc("NET SetCommState");
  return 0;
        }
/* запись запроса  */
// wrmodem("ATE0");
wrmodem("AT+CGMM");
        /* чтение */
modemread(&str);
             /* закрытие */
nosc("vsjo prochitano");
  return 1;
}

но почему-то сколько справочников не качал ни в одном нет даже таких функций
WriteFile(port, zapr, len, &feedback, 0) - непойму что за параметр feedback
и как-то странно объявляется DWORD feedback;
и ReadFile(port, str, 4, &feedback, NULL) тоже не смог сделать
там вместо 4 было int(data.size()), которое у меня не работает
я так понимаю оно определяло размер возвращаемого ещё его до получения.

вообще какие-то функции незнакомые типа GetTickCount()
но кажется неполучается из-за WriteFile и ReadFile и цикл while не работает как надо изза того что вместо data.size() - strlen(str)
как сделать правильно что-то похожее ?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования