|
написал на РС приложеньеце для работы с RS232, заработало. Решил переиначить на RS485. чтобы переключать приём/передачу пользую сигнал RTS. В результате алгоритм такой: сбрасываю сигнал RTS(настроил аппарат часть на вывод), передаю в слэйв данные,жду окончание передачи, устанавливаю сигнал RTS (настроил аппарат часть на ввод), и соответственно жду данные от слэйва, и т.д.
текст программы :
void CProgressAppDlg::CmComPort()
{
......
EscapeCommFunction(port,CLRRTS);//настроил апп часть на вывод
memset(&ovr,0,sizeof(ovr));
ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
WriteFile(port,buf_out,strlen(buf_out),&bc,&ovr);
if(WaitForSingleObject(ovr.hEvent,100)==WAIT_OBJECT_0) {
GetOverlappedResult(port,&ovr,&bc,FALSE);
}
else {
// Обработка ошибки
}
EscapeCommFunction(port,SETRTS);//настроил апп часть на ввод
ReadFile(port,buf_in,strlen(buf_in),&bc,&ovr);
.........
}
либо
void CProgressAppDlg::CmComPort()
{
...............
EscapeCommFunction(port,CLRRTS);//настроил апп часть на вывод
WriteFile(port,buf_out,strlen(buf_out),&bc,0);
EscapeCommFunction(port,SETRTS);//настроил апп часть на ввод
ReadFile(port,buf_in,strlen(buf_in),&bc,0);
.............
}
Инициализацию порта, открытие, и т.д. я опустил..
То бишь, пробовал я в синхронном режиме , пробовал в асинхронном режиме ждать событие конца передачи, а результат всегда один:
если длинна отправляемой посылки меньше 16 байт,то время выполнения ф-ции WriteFile(..) мизерное по отношению ко времени передачи всей посылки, соответственно время сброса сигнала RTS такое же мизерное и передача в аппаратной части завершается так и не успев начаться.Если посылка длиннее 16 байт, то передача идёт, но последние несколько байт всё таки "обрубаются", так как время сброса RTS почти такое как посылка, но немного короче . Пишу на VC++6.0
Вобщем встаёт резонный вопрос , кто виноват и что делать?
Люди добрые поможите кто чем может...можно конечно фиксированную задержку ввести на передачу, но это как то не спортивно...