запись и чтение из COM port'a. Read- и WriteFile. AT commands

Тема в разделе "LANGS.C", создана пользователем cavy, 28 сен 2007.

  1. cavy

    cavy New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    5
    пытаюсь послать АТ команду модему
    WriteFile завершается успешно.

    если использовать
    SetCommMask (hCOM, EV_RXCHAR);

    то WaitCommEvent не завершается вообще...

    без SetCommMask
    WaitCommEvent завершается успешно
    ReadFile завершается успешно, но так ничего и не прочитав!

    в чем может быть проблема, и как все таки получить ответ?...
     
  2. cavy

    cavy New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    5
    вот что я делаю:
    Код (Text):
    1. HANDLE hCOM=CreateFile(Port.c_str(), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0, NULL);
    2.  
    3.         if (hCOM!=INVALID_HANDLE_VALUE)
    4.         {
    5.             printf("OK\n");
    6.            
    7.             COMMTIMEOUTS cto;
    8.                 cto.ReadIntervalTimeout = 1000;
    9.                 cto.ReadTotalTimeoutConstant = 1000;
    10.                 cto.ReadTotalTimeoutMultiplier = 1000;
    11.                 cto.WriteTotalTimeoutConstant = 1000;
    12.                 cto.WriteTotalTimeoutMultiplier = 1000;
    13.                 SetCommTimeouts(hCOM, &cto);
    14.  
    15.             PurgeComm(hCOM,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    16.     //      SetCommMask (hCOM, EV_RXCHAR);
    17.  
    18.             string c="ATI1\r" ;
    19.             printf("Sending %s\n", c.c_str());
    20.  
    21.             DWORD nb = 1;
    22.             OVERLAPPED ov;
    23.             ZeroMemory( &ov , sizeof( OVERLAPPED )) ;
    24.  
    25.             ov.hEvent = CreateEvent( NULL , TRUE , FALSE , NULL ) ;
    26.            
    27.             DCB dcb;
    28.             GetCommState(hCOM,&dcb);
    29.             BuildCommDCB("baud=9600 parity=n data=8 stop=1", &dcb);
    30.  
    31.            
    32.             BOOL res = WriteFile(hCOM,c.c_str(),c.length(),&nb,&ov);
    33.             printf("WriteFile %i\n", res);
    34.  
    35.             DWORD MASK = EV_RXCHAR;
    36.             DWORD *Mask = &MASK;
    37.        
    38.             int result = WaitCommEvent(hCOM, Mask, &ov);
    39.        
    40.             printf("WaitCommEvent %i\n", result);
    41.        
    42.            
    43.             char* ans[100];
    44.             ans[0] = '\0';
    45.  
    46.             nb=1;
    47.             BOOL ReadRes = ReadFile(hCOM, ans, 1, &nb, &ov);
    48.  
    49.             printf("ReadFile %i\n", ReadRes);
    50.  
    51.             if (!ReadRes)
    52.             {
    53.                 if (GetLastError()==ERROR_IO_PENDING)
    54.                 {
    55.                         DWORD resW =WaitForSingleObject(ov.hEvent, 10000);
    56.                         if (resW!=WAIT_OBJECT_0) printf ("TIMEOUT\n");
    57.                         printf("WaitForSingleObject %i\n", ReadRes);
    58.                         ReadRes = GetOverlappedResult(hCOM, &ov, &nb, 0);
    59.                         printf("OverlappedResult %i\n", ReadRes);
    60.                 }
    61.             }
    62.        
    63.             if (!ReadRes) printf("Last Error %i\n", GetLastError());
    64.  
    65.             printf("ReadFile %i\n", ReadRes);
    66.            
    67.             ans[nb] = '\0';
    68.             printf("Answer %s\n", ans);
    69.  
    70.             CloseHandle(hCOM);
    71.         }
    72.         else printf ("         Couldn't connect to COM port\n");
     
  3. cavy

    cavy New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    5
    а вот и результаты:
    OK
    Sending ATI1
    WriteFile 1
    WaitCommEvent 1
    ReadFile 1
    ReadFile 1
    Answer
     
  4. hybrid

    hybrid New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2007
    Сообщения:
    42
    Ну во-первых стоит сделать
    Код (Text):
    1. HANDLE hCOM=CreateFile(Port.c_str(), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL);
    Ну и еще такая мысль:
    Код (Text):
    1.         DWORD MASK = EV_RXCHAR;
    2.     DWORD *Mask = &MASK;
    3.     int result = WaitCommEvent(hCOM, Mask, &ov);
    на кой? не проще
    Код (Text):
    1. int result = WaitCommEvent(hCOM, &MASK, &ov);
    ?