Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не могу считать с СОМ порта

11
22 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
Есть контроллер, подключаеттся к сом порту
в мануале контроллера в настройках порта указано только:

BaudRate=CBR_9600;
ByteSize=8;
Parity=NOPARITY;
StopBits=ONESTOPBIT;

проверка линии идет кодами:
0x02, 0x03, 0x40, 0x00, 0x03
должен ответить:
0x02, 0x03, 0x40, 0x00, 0x06

отправляю/принимаю команды:
Код:
hcom = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);

  if (hcom != INVALID_HANDLE_VALUE)
      Memo1->Lines ->Add("Handle create successeful");
  else retern;

  int i;
  i = PurgeComm(hcom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR | PURGE_RXCLEAR);
  if (i == Null()) return;

  if ((i=ClearCommBreak(hcom))==Null()) return;

  DCB dcb;
  if ((GetCommState (hcom, &dcb))==Null()) return;

  dcb.BaudRate=CBR_9600;
  dcb.ByteSize=8;
  dcb.Parity=NOPARITY;
  dcb.StopBits=ONESTOPBIT;


  if ((i=SetCommState(hcom, &dcb))==Null()) return;

  DWORD CommEventMask = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |
   EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY;

  if ((i = SetCommMask(hcom, CommEventMask))==Null()) return;
     
  const char CMD[5] = {0x02, 0x03, 0x40, 0x00, 0x03};
  char cmd[5] = {0x00, 0x00, 0x00, 0x00, 0x00};;



  OVERLAPPED OL;

  OL.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
  DWORD EventMask = 0;
  DWORD dwWrited;
  bool sucss =   WriteFile (hcom, (void*)CMD, 5, &dwWrited, &OL);
  if (!sucss) return;
  int dwread;
  do {
      i = WaitCommEvent(hcom, &EventMask, &OL);
      if ((!i) && (GetLastError()==ERROR_IO_PENDING))
         {
           Memo1->Lines->Add("Waiting for event");
           WaitForSingleObject(OL.hEvent, INFINITE);
          }
      if(EventMask || EV_RXCHAR)
        Memo1->Lines->Add("Event RXCHAR");

      DWORD ErrorMask = 0;
        COMSTAT CStat;
        ClearCommError(hcom, &ErrorMask, &CStat);
        DWORD quelen = CStat.cbInQue;

        DWORD dwReaded = 0;
        i = ReadFile(hcom, (void*)cmd, quelen, &dwReaded, &OL);
        if(EventMask & EV_RXCHAR)
          Memo1->Lines->Add(cmd);
        dwread =  dwReaded;
        if( dwReaded == 0 && GetLastError() == ERROR_IO_PENDING )
          {
            i = GetOverlappedResult(hcom, &OL, &dwReaded, FALSE) ;
          }
        else
          {
            if (dwReaded>0)
                Memo1->Lines->Add("");
            else
                Memo1->Lines->Add("error reciving");
          }

        PurgeComm(hcom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
        EventMask=0;
        ResetEvent(OL.hEvent);
   }while(dwread==0);
  CloseHandle(hcom);


в cmd приходит только первый байт 0x15
то же самое если делать через компоненту TComPort

где и какие настройки порта покопать, или что я не правильно делаю?
1
22 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333


в cmd приходит только первый байт 0x15
то же самое если делать через компоненту TComPort

где и какие настройки порта покопать, или что я не правильно делаю?


Проверь верно ли задается выполнение условия - код особо не просматривал - времени нет. Но я бы первое что сделал - установил точку останова на цикл do{}while и проверил по какому условию он завершается и то ли это условие которого ты ожидаешь - ведь судя по всему чтение одного байта всетаки происходит?

11
22 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
цикл выполняется 2 раза...
1-й раз ничего не читается (наверно дело в таймаутах)
во 2-й раз и попадает этот 1 байт...
пробовал while(true) та же история... больше одного байта не считывает
PS: сам девайс работает нормально... родная его софтина все делает
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог