У меня возник такой вопрос :
Принимается поток байтов ком портом.
Вопрос. Когда принятую строку символов можно считывать ?
Что является признаком того, что строка принята в полном составе, и ее можно считать функцией
ReadFile
Всегда и сразу.СЦБист писал(а):Когда принятую строку символов можно считывать ?
Обычно, маркером конца строки является... заранее оговорённый маркер конца строки.СЦБист писал(а):Что является признаком того, что строка принята в полном составе,
Вот этого не понял...СЦБист писал(а):и ее можно считать функцией
Я это понял так: "ее можно считать успешным результатом вызова функции ReadFile"mas123 писал(а):Вот этого не понял...СЦБист писал(а):и ее можно считать функцией
на словах не шибко понял. может на примере кода сможете показать? Буду очень признателен.Jack_A писал(а):[
Я это понял так: "ее можно считать успешным результатом вызова функции ReadFile"
Задайся вопросом: кто должен найти маркер окончания строки?СЦБист писал(а):Мне нужно считать полноценную строку, а не огрызки.
И что тебе это даст? Данные могут приходить когда угодно - зависит от скорости передачи, от "желания" источника передать данные.....СЦБист писал(а):Считывать нужно в какой-то определенный момент.
Тут есть такое понятие как тайм-аут.
Складывать данные в этот буфер, в процессе поиска конца строки.СЦБист писал(а):Про кольцевой буфер не понял с какой целью его лепить.
Разумеется. При отсутствии данных будет выход из функции по таймауту. Иначе можно зависнуть на ожидании.СЦБист писал(а):что делать с тайм-аутами ? нужно их выставлять ?
Это и есть "когда угодно".СЦБист писал(а):Данные у меня приходят по запросу а не когда угодно.
Да-да-да, никто и никогда не передавал данные через различные соединения. Все эти Ethernet, RS-232, RS-485 и многие другие - это вымысел.СЦБист писал(а):Походу никто этого раньше не делал.
Э-э-э, поясни? Если у строки нет конца - т что ты собираешься искать?СЦБист писал(а):По поводу конца строки. Нету у нее не конца не начала.
Удачи. Когда найдешь ответ - перечитай снова эту тему с самого начала.СЦБист писал(а):и искать ответ в другом месте.
СЦБист писал(а):режим передачи асинхронный ясен пень.
Одно с другим не согласуется.СЦБист писал(а):тест показал что WriteFile завершится лишь когда все символы уйдут в линию.
Код: Выделить всё
OVERLAPPED Overlap;
Overlap.hEvent = CreateEvent(NULL, true, true, NULL);
WriteFile(handle, buffer_write, strlen(buffer_write), &numbytes_ok, &Overlap);
WaitForSingleObject(Overlap.hEvent, INFINITE);После сработки события вызовите GetOverlappedResult - она скажет сколько данных на самом деле принялось/отослалось. И если идёт отправка - то почему вы отметили, что буфер приёмный? У приёма свой экземпляр OVERLAPPED должен быть и отдельное событие нужно создавать и Read вызывать.СЦБист писал(а):посмотреть к-во байт в приемном буфере
186 - это размер буффера, либо длина С-строки там хранящейся?СЦБист писал(а):в буфере buffer_write 186 символов
Код: Выделить всё
if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(handle, &Overlap, &temp, true))) Код: Выделить всё
char *p = buffer_write;
int N = strlen(buffer_write);
int K = 0;
while (K < N)
{
if(!WriteFile(handle, p, 1, &numbytes_ok, &Overlap))
signal = WaitForSingleObject(Overlap.hEvent, INFINITE);
if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(handle, &Overlap, &temp, true)))
p++; K++;
}