C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: COM порт (настройки)  (Прочитано 12470 раз)
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


« : 21 Ноябрь 2007, 11:41:13 »

Пытаюсь работать с контроллером через СОМ порт при помощи компонентов...
Задача сводится к следующему:
есть набор байт: 0x02 0x03 0x40 0x00 0x03 - проверка линии (LineCheck)
в ответ должно придти : 0x02 0x03 0x40 0x00 0x06 - типа все ОК
в компоненте есть ф-ии Write (void *buff, int Count) и Read (void *buff, int Count)
делал вот так:
char IN_CMD[5] = {0x02, 0x03, 0x40, 0x00, 0x03};
char OUT_CMD[5];
ComPotr1->Write(IN_CMD, sizeof(INCMD));
do
  {
    ComPotr1->Read(OUT_CMD, 5);
  }while (!OUT_CMD);
и ниче не читает
грешу на настройки таймаутов, хотя циклу do-while вроде как по барабану на таймауты...
какие доп настройки порта покопать?
ЗЫ через API CreateFile и т.п. тоже пробовал, аналогично
Записан
bred
А моск есть?
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 387

Нет - это фантастика!


Re: COM порт (настройки)
« Ответ #1 : 21 Ноябрь 2007, 12:15:47 »

я так подозреваю, что Read должна возвращать либо число прочитанных байт либо результат прочитано/нет и тот же GetLastError может сообщить, что именно произошло. Мало того после этой строки "char OUT_CMD[5];" OUT_CMD равна какому-то 32-х разрядному числу отличному от 0, и следовательно цикл do...while(!OUT_CMD); выполнется всего 1 раз. Контролерр просто может не успеть вам ответить за это время.
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: COM порт (настройки)
« Ответ #2 : 21 Ноябрь 2007, 12:19:05 »

делал и бесконечный цикл while(1) таже ситуация
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


Re: COM порт (настройки)
« Ответ #3 : 21 Ноябрь 2007, 12:53:02 »

Цитировать
работать с контроллером через СОМ порт при помощи компонентов...
если необязательно привязывать к компоненту, могу сбросить библиотеку
щас с ней работаю, пока доволен

Цитировать
какие доп настройки порта покопать?
скорость порта

Цитировать
есть набор байт: 0x02 0x03 0x40 0x00 0x03 - проверка линии
тоже надо было подключить одно ут-во
там прога в комплекте, в начале, делала проверку линии
я подключил без проверки, работает нормально

Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: COM порт (настройки)
« Ответ #4 : 21 Ноябрь 2007, 13:01:27 »

Цитировать
если необязательно привязывать к компоненту, могу сбросить библиотеку
щас с ней работаю, пока доволен
буду весьма признателен за библиотечку
Цитировать
я подключил без проверки, работает нормально
проверка обязательна... тем более что комманды в том же формате идут...
т.е. если с подключением разберусь, то 90% будет сделано
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


« Ответ #5 : 21 Ноябрь 2007, 13:53:29 »

написал один хороший человек
для работы
Код
TCom port;
port.OpenPort();
port.SetBaund(19200);
 
port.SendBuffer записать буфер
port.BytesAvailable() проверка наличия байта на входе
port.TakeBytes считать буфер

там еще много чего, полность не разобрался
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: COM порт (настройки)
« Ответ #6 : 21 Ноябрь 2007, 13:55:20 »

вместо while(true) лучше поставить overlapped чтение с таймаутом.
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


« Ответ #7 : 21 Ноябрь 2007, 14:39:14 »

написал один хороший человек
для работы
спасибо!!!
а как перевести "Помилка!" ?
"час очікування" я догадался
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


Re: COM порт (настройки)
« Ответ #8 : 21 Ноябрь 2007, 15:57:50 »

Цитировать
а как перевести "Помилка!" ?

найти мусорную корзинку и бросить туда контроллер
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: COM порт (настройки)
« Ответ #9 : 21 Ноябрь 2007, 23:45:15 »

вот такие настройки порта (компонента TComPort)
Код:
  object ComPort1: TComPort
    Tag = 1
    Connected = True
    BaudRate = br9600
    Port = 'COM1'
    Parity.Bits = prEven
    Parity.Check = True
    Parity.Replace = True
    StopBits = sbOneStopBit
    DataBits = dbEight
    Events = [evRxChar, evTxEmpty, evRxFlag, evRing, evBreak, evCTS, evDSR, evError, evRLSD, evRx80Full]
    FlowControl.OutCTSFlow = True
    FlowControl.OutDSRFlow = True
    FlowControl.ControlDTR = dtrEnable
    FlowControl.ControlRTS = rtsEnable
    FlowControl.XonXoffOut = False
    FlowControl.XonXoffIn = False
    FlowControl.DSRSensitivity = True
    FlowControl.TxContinueOnXoff = True
    FlowControl.XonChar = #0
    FlowControl.XoffChar = #0
    Timeouts.ReadTotalMultiplier = 1
    SyncMethod = smWindowSync
    Left = 32
    Top = 56
  end

вот код посыла-чтения:
Код:
 
  const char CMD[5] = {0x02, 0x03, 0x40, DeviceNumber, 0x03};
  char cmd[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
  const char cmd_cmp[5] = {0x02, 0x03, 0x40, DeviceNumber, 0x06};

  int i = ComPort1->Write((void*)CMD, 5);

  do
   {
      i= ComPort1->Read((void*)cmd, 5);

    }while (i == 0);
   ComPort1->Connected = false;
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: COM порт (настройки)
« Ответ #10 : 22 Ноябрь 2007, 17:34:08 »

переписал под WinAPI:

Код
  LPVOID lpInBuffer;
 
 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
     Memo1->Lines ->Add("Handle create error");
 
 int i;
 i = PurgeComm(hcom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR | PURGE_RXCLEAR);
 if (i == Null())
     Memo1->Lines->Add("Purge error");
 
 if ((i=ClearCommBreak(hcom))==Null())
    Memo1->Lines->Add("ClearComm Break error");
 
 DCB dcb;
 if ((GetCommState (hcom, &dcb))==Null())
     Memo1->Lines->Add("GetCommState error");
 
 dcb.BaudRate=CBR_9600;
 dcb.ByteSize=8;
 dcb.Parity=NOPARITY;
 dcb.StopBits=ONESTOPBIT;
 
 //dcb.fOutxCtsFlow=false;
 //dcb.fOutxDsrFlow=false;
 
 if ((i=SetCommState(hcom, &dcb))==Null())
     Memo1->Lines->Add("SetCommState error");
 
 
 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())
    Memo1->Lines->Add("SetCommNask error");
 
 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);
 

читается только один байт
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: COM порт (настройки)
« Ответ #11 : 22 Ноябрь 2007, 19:09:31 »

сравните с рабочим кодом: https://cbuilder.ru/index.php/topic,633.msg3808.html#msg3808
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: COM порт (настройки)
« Ответ #12 : 22 Ноябрь 2007, 19:52:23 »

принципиальных отличий нет
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.093 секунд. Запросов: 22.