Получение информации об устройстве? COM
От: Nine  
Дата: 13.06.04 19:17
Оценка:
Всем привет!
Вопрос такой: чем заполняется dcb в следующем коде, если к СОМ1 подключено устройство(не важно какое)?
Дело в том, что мне не известно, какие данные будут передаваться(какого размера, чем заканчиваться и т.д.)
Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?


DCB *dcb;
    
HANDLE port;


dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));
dcb->DCBlength=sizeof(DCB);

port=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

GetCommState( port, dcb );
HeapFree(GetProcessHeap(),0,dcb);
    
. . .
    
CloseHandle(port);

В dcb записывается информация об устройстве или о порте?

Спасибо.
Re: Получение информации об устройстве? COM
От: Protey Россия  
Дата: 15.06.04 05:20
Оценка:
Здравствуйте, Nine, Вы писали:

N>Всем привет!

N>Вопрос такой: чем заполняется dcb в следующем коде, если к СОМ1 подключено устройство(не важно какое)?
N>Дело в том, что мне не известно, какие данные будут передаваться(какого размера, чем заканчиваться и т.д.)
N>Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?
?? XoffChar — это для программного квитирования потока. если == 0 то пофиг, опять же, работает на приём.

N>В dcb записывается информация об устройстве или о порте?


О порте конечно. Имхо порту вообще фиолетово чего ты к нему подключшь.

N>Спасибо.
Re: Получение информации об устройстве? COM
От: PauseBreak  
Дата: 15.06.04 12:25
Оценка:
Здравствуйте, Nine, Вы писали:

N>Всем привет!

N>Вопрос такой: чем заполняется dcb в следующем коде, если к СОМ1 подключено устройство(не важно какое)?
Согласен с Protey, после вызова GetCommState структура dcb заполняется данными об COM-порте.
N>Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?
Тут зависит от того, как ты управляешь потоком. Если fTXContinueOnXoff = TRUE, то при XoffChar принимать данные можешь(но буфер уже на пределе), при FALSE передача данных останавливается до символа XonChar или освобождения буфера.
Re[2]: Получение информации об устройстве? COM
От: Nine  
Дата: 18.06.04 09:45
Оценка:
Здравствуйте, PauseBreak, Вы писали:


N>>Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?

PB>Тут зависит от того, как ты управляешь потоком. Если fTXContinueOnXoff = TRUE, то при XoffChar принимать данные можешь(но буфер уже на пределе), при FALSE передача данных останавливается до символа XonChar или освобождения буфера.

Я кажется не правильно сформулировал вопрос. То есть сообщение состоит из самих данных и кончается символом EofChar, как я понял. Ну и вот: нужно ли мне знать EofChar, что бы считать все сообщение?
Re[3]: Получение информации об устройстве? COM
От: Alex_13  
Дата: 18.06.04 10:41
Оценка: 1 (1)
Здравствуйте, Nine, Вы писали:

N>Я кажется не правильно сформулировал вопрос. То есть сообщение состоит из самих данных и кончается символом EofChar, как я понял. Ну и вот: нужно ли мне знать EofChar, что бы считать все сообщение?


Никаких eofChar тебе не нужно трогать, входящее сообщение кончается когда будет принято заданное тобой в ReadFile() кол-во байт, или превышен интервал между отдельными байтами.
Порт можно настроить так:

HANDLE OpenPort(int nPort)
{
    char szPort[10];
    sprintf(szPort, "COM%d", nPort);
    HANDLE hPort = CreateFile( szPort,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        0);
    if (INVALID_HANDLE_VALUE == hPort) return hPort;
    //
    // Изменение настроек СОМ-порта
    DCB dcb;
    dcb.DCBlength = sizeof(DCB);
    //
    BOOL err = GetCommState(hPort, &dcb);
    if (FALSE == err) return INVALID_HANDLE_VALUE;
    //
    dcb.BaudRate    = 115200;
    dcb.ByteSize    = 8;
    dcb.Parity    = NOPARITY;
    dcb.StopBits    = ONESTOPBIT;
    //
    err = SetCommState(hPort, &dcb);
    if (FALSE == err) return INVALID_HANDLE_VALUE;
    //
    return hPort;
}
Re[3]: Получение информации об устройстве? COM
От: PauseBreak  
Дата: 18.06.04 11:33
Оценка:
Здравствуйте, Nine, Вы писали:

N>Я кажется не правильно сформулировал вопрос. То есть сообщение состоит из самих данных и кончается символом EofChar, как я понял. Ну и вот: нужно ли мне знать EofChar, что бы считать все сообщение?


Теперь понятно. Я бы решил твою проблему так:
1. Делаю объект структуры COMSTAT (после того, как считаю, что буфере COM-порта уже есть данные).
в этой структуре узнаю число символов в приемном буфере (поле cbInQue).
2. ReadFile(), где считываю столько байт, сколько указала структура COMSTAT.
Пример:
(Порт уже открыт и сконфигурён)
void receiver()
{
  BYTE RecBuf[1000];
  COMSTAT cs;
  unsigned long error;
  unsigned int num_read;

  ClearCommError( com, &error, &cs ); 
  if ( error ) 
  {
    PurgeComm( com, PURGE_RXCLEAR );
    return;
  }
  if ( !cs.cbInQue ) return;
  if ( !ReadFile( com, RecBuf, cs.cbInQue, &num_read, NULL ) ) // число считанных байт из структуры COMSTAT (cs.cbInQue)
    if ( GetLastError() != ERROR_IO_PENDING )
       return;
}
Re[4]: Получение информации об устройстве? COM
От: PauseBreak  
Дата: 18.06.04 11:36
Оценка: 2 (1)
Здравствуйте, PauseBreak, Вы писали:

PB>Здравствуйте, Nine, Вы писали:


N>>Я кажется не правильно сформулировал вопрос. То есть сообщение состоит из самих данных и кончается символом EofChar, как я понял. Ну и вот: нужно ли мне знать EofChar, что бы считать все сообщение?


PB>Теперь понятно. Я бы решил твою проблему так:

PB>1. Делаю объект структуры COMSTAT (после того, как считаю, что буфере COM-порта уже есть данные).
PB>в этой структуре узнаю число символов в приемном буфере (поле cbInQue).
PB>2. ReadFile(), где считываю столько байт, сколько указала структура COMSTAT.
PB>Пример:
PB>(Порт уже открыт и сконфигурён)
PB>
PB>void receiver()
PB>{
PB>  BYTE RecBuf[1000];
PB>  COMSTAT cs;
PB>  unsigned long error;
PB>  unsigned int num_read;

PB>  ClearCommError( com, &error, &cs ); 
PB>  if ( error ) 
PB>  {
PB>    PurgeComm( com, PURGE_RXCLEAR );
PB>    return;
PB>  }
PB>  if ( !cs.cbInQue ) return;
PB>  if ( !ReadFile( com, RecBuf, cs.cbInQue, &num_read, NULL ) ) // число считанных байт из структуры COMSTAT (cs.cbInQue)
PB>    if ( GetLastError() != ERROR_IO_PENDING )
PB>       return;
PB>}
PB>

Поправка в комментарию)) — число считыВАЕМых байт из структуры COMSTAT (cs.cbInQue) , а реально сколько счтали это num_read.
Re[2]: Получение информации об устройстве? COM
От: Nine  
Дата: 18.06.04 18:23
Оценка:
Раз уж пошла такая пьянка, то еще вопрос про скорость передачи.
Какую скорость я укажу в BaudRate с такой скоростью и будут передаваться данные? Зависит ли скорость передачи от устройства, если да то что будет когда возможная скорость для устройства меньше, че я укажу? И что будет если скорость не указать?

Спасибо.
Re[3]: Получение информации об устройстве? COM
От: PauseBreak  
Дата: 18.06.04 22:00
Оценка: 2 (1)
Здравствуйте, Nine, Вы писали:

N>Раз уж пошла такая пьянка, то еще вопрос про скорость передачи.

N>Какую скорость я укажу в BaudRate с такой скоростью и будут передаваться данные?
Да.
N>Зависит ли скорость передачи от устройства, если да то что будет когда возможная скорость N>для устройства меньше, че я укажу?
Зависит и даже больше, ты должен когфигурить COM-порт как указано в спецификации к устройству.
Помимо скорости, есть еще: parity, data bits, Flow control.... все эти параметры нужно правильно выставлять, иначе ты не сможешь работать с устройством(будет как "плохой телефон", каждый что-то говорит, но друг друга не понимают)

N>И что будет если скорость не указать?

по дефолту 9600.
Re[4]: Получение информации об устройстве? COM
От: Nine  
Дата: 20.06.04 09:15
Оценка:
Здравствуйте, PauseBreak, Вы писали:

PB>Здравствуйте, Nine, Вы писали:


N>>Раз уж пошла такая пьянка, то еще вопрос про скорость передачи.

N>>Какую скорость я укажу в BaudRate с такой скоростью и будут передаваться данные?
PB>Да.
N>>Зависит ли скорость передачи от устройства, если да то что будет когда возможная скорость N>для устройства меньше, че я укажу?
PB>Зависит и даже больше, ты должен когфигурить COM-порт как указано в спецификации к устройству.
PB>Помимо скорости, есть еще: parity, data bits, Flow control.... все эти параметры нужно правильно выставлять, иначе ты не сможешь работать с устройством(будет как "плохой телефон", каждый что-то говорит, но друг друга не понимают)

N>>И что будет если скорость не указать?

PB>по дефолту 9600.

Ага, спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.