2015-06-20 23 views
0

Я хочу читать 6 датчиков данных от arduino до VC++ с помощью методов «handshaking», я отправляю «1» в arduino, после чего это устройство отправит данные на ПК. Мой формат данных: &data0,data1,data2,data3,data4,data5%неполные данные чтения последовательный порт

Но когда я прочитал его с VC++ данных всегда является неполным, даже думал, что размер буфера достаточно для всех данных

вот снимок моей программы VC++, я ставлю это на событии таймера

DWORD nbytes; 
    char buffer[24]; 

    //Read Sensors 

    if(!WriteFile(hnd_serial, "1", 1, &nbytes, NULL)){KillTimer(cTimer1);MessageBox(L"Write Com Port fail!");return;} 
    Sleep(5); 
    if(!ReadFile(hnd_serial, buffer, 23, &nbytes, NULL)){KillTimer(cTimer1);MessageBox(L"Read Com Port fail!");return;} 
    Sleep(50); 

Я изменил скорость передачи в бодах, но результат все тот же. , но если я уменьшу данные, такие как data5 (станет 5 датчиков), данные будут завершены. Я сделал что-то не так с моей программой?

+0

Вы проверили arduino, получив «1», или нет? –

+0

Да, ардуино получает 1 и отправляет данные, но данные не являются полными (3 последних данных) – Limavolt

+0

, сколько байтов данных? (data0, data1, ..) –

ответ

0

Вы можете поместить функцию ReadFile() внутри цикла do-while.

do{ 
    if(!ReadFile(hnd_serial, buffer, 23, &nbytes, NULL)){ 
     //Process error 
     break; 
    } 
    if (nbytes>= 6) 
    { 
     //Put your flag - or process here 
     break; 
    } 
}while(nbytes); 

ReadFile() возвращает только текущее состояние буфера, он не будет ждать получения полной ваших ожидаемых данных

+0

Спасибо, но чтение буфера никогда не доходит до конца данных (%). Возможно, потому, что «буфер» последовательного порта ограничен. – Limavolt

+0

вы можете попробовать поставить таймер задержки 1s перед вызовом ReadFile, чтобы проверить эту ситуацию –

0

Вы не говорите, что скорость передачи данных вы работаете с.

Вы также не говорите, что, если таковые имеются, были установлены таймауты.

Предположим, что это 9600, что означает, что порт передает 960 байт в секунду. Так что чуть более 1 миллисекунды за байт.

Если ваш сон (5) должен дождаться отправки «1» И чтобы данные возвращались, вы должны ждать достаточно долго, чтобы все ваши байты были переданы. Предполагая, что тайм-ауты установлены так, что ReadFile немедленно возвращается с любыми байтами в буфере RX, тогда есть шанс, что вы читаете слишком быстро.

Попробуйте большую задержку.

Смежные вопросы