Всем привет!
Вопрос такой: чем заполняется dcb в следующем коде, если к СОМ1 подключено устройство(не важно какое)?
Дело в том, что мне не известно, какие данные будут передаваться(какого размера, чем заканчиваться и т.д.)
Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?
Здравствуйте, Nine, Вы писали:
N>Всем привет! N>Вопрос такой: чем заполняется dcb в следующем коде, если к СОМ1 подключено устройство(не важно какое)? N>Дело в том, что мне не известно, какие данные будут передаваться(какого размера, чем заканчиваться и т.д.) N>Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?
?? XoffChar — это для программного квитирования потока. если == 0 то пофиг, опять же, работает на приём.
N>В dcb записывается информация об устройстве или о порте?
О порте конечно. Имхо порту вообще фиолетово чего ты к нему подключшь.
N>Спасибо.
Здравствуйте, Nine, Вы писали:
N>Всем привет! N>Вопрос такой: чем заполняется dcb в следующем коде, если к СОМ1 подключено устройство(не важно какое)?
Согласен с Protey, после вызова GetCommState структура dcb заполняется данными об COM-порте. N>Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar?
Тут зависит от того, как ты управляешь потоком. Если fTXContinueOnXoff = TRUE, то при XoffChar принимать данные можешь(но буфер уже на пределе), при FALSE передача данных останавливается до символа XonChar или освобождения буфера.
N>>Будет ли данные передаваться из порта СОМ1 со стоповым битом dcb->XoffChar? PB>Тут зависит от того, как ты управляешь потоком. Если fTXContinueOnXoff = TRUE, то при XoffChar принимать данные можешь(но буфер уже на пределе), при FALSE передача данных останавливается до символа XonChar или освобождения буфера.
Я кажется не правильно сформулировал вопрос. То есть сообщение состоит из самих данных и кончается символом EofChar, как я понял. Ну и вот: нужно ли мне знать EofChar, что бы считать все сообщение?
Здравствуйте, Nine, Вы писали:
N>Я кажется не правильно сформулировал вопрос. То есть сообщение состоит из самих данных и кончается символом EofChar, как я понял. Ну и вот: нужно ли мне знать EofChar, что бы считать все сообщение?
Никаких eofChar тебе не нужно трогать, входящее сообщение кончается когда будет принято заданное тобой в ReadFile() кол-во байт, или превышен интервал между отдельными байтами.
Порт можно настроить так:
Здравствуйте, 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;
}
Здравствуйте, 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.
Раз уж пошла такая пьянка, то еще вопрос про скорость передачи.
Какую скорость я укажу в BaudRate с такой скоростью и будут передаваться данные? Зависит ли скорость передачи от устройства, если да то что будет когда возможная скорость для устройства меньше, че я укажу? И что будет если скорость не указать?
Здравствуйте, Nine, Вы писали:
N>Раз уж пошла такая пьянка, то еще вопрос про скорость передачи. N>Какую скорость я укажу в BaudRate с такой скоростью и будут передаваться данные?
Да. N>Зависит ли скорость передачи от устройства, если да то что будет когда возможная скорость N>для устройства меньше, че я укажу?
Зависит и даже больше, ты должен когфигурить COM-порт как указано в спецификации к устройству.
Помимо скорости, есть еще: parity, data bits, Flow control.... все эти параметры нужно правильно выставлять, иначе ты не сможешь работать с устройством(будет как "плохой телефон", каждый что-то говорит, но друг друга не понимают)
N>И что будет если скорость не указать?
по дефолту 9600.
Здравствуйте, PauseBreak, Вы писали:
PB>Здравствуйте, Nine, Вы писали:
N>>Раз уж пошла такая пьянка, то еще вопрос про скорость передачи. N>>Какую скорость я укажу в BaudRate с такой скоростью и будут передаваться данные? PB>Да. N>>Зависит ли скорость передачи от устройства, если да то что будет когда возможная скорость N>для устройства меньше, че я укажу? PB>Зависит и даже больше, ты должен когфигурить COM-порт как указано в спецификации к устройству. PB>Помимо скорости, есть еще: parity, data bits, Flow control.... все эти параметры нужно правильно выставлять, иначе ты не сможешь работать с устройством(будет как "плохой телефон", каждый что-то говорит, но друг друга не понимают)
N>>И что будет если скорость не указать? PB>по дефолту 9600.