C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
работа с com портом
serg_1
Отправлено: 17.08.2006, 10:02


Не зарегистрирован







нужно организовать быстрый обмен по сом порту. проверяю при закороченных 2 и 3 контактах разьема.работаю через WaitForSingleObject по времени ожидания и приему определенного количества байт. все работает.
проблема первая:
на некоторых машинах при таймауте 1-20мсек иногда вылетает по превышению времени ожидания. если больше 20 ,все нормально
вот кусок кода
...
Ovr_r.hEvent=CreateEvent(NULL,true,false,NULL); // ручной сброс
...
WriteFile(CommHandle,Transmit,kol_pered,&KolByte,&Ovr_w);
ReadFile(CommHandle,Resive,kol_prin,&Kols,&Ovr_r);
DWORD dwait=WaitForSingleObject(Ovr_r.hEvent,Time_ojid);
...
ResetEvent(Ovr_r.hEvent);

и 4 последних строки в цикле
kol_pered=kol_prin= 5...20

и проблема вторая:
необходимо принимать неизвестное количество байт и не ожидать таймаута. запрещенных символов нет(т.е. EofChar,EOF,EvtChar вроде как не пойдут). связь по двум проводам RxD,TxD. на другом конце процессоры в мультипроцессорном режиме(по биту четности адрес=1, данные=0). и хотелось бы в компьютере сделать то же самое. т.е. по биту четности определять окончание посылки. аппаратно. допустим использовать в маске EV_ERR. можно ли это сделать? и как вообще бит четности получить в программе в каждом байте? возможно ли это ? либо другой способ?
помогите разобраться.

serg_k
Отправлено: 12.09.2006, 16:59


Ученик-кочегар

Группа: Участник
Сообщений: 5



для решения вопроса написал следующее и через закоротку 2 и 3 работаю(передача:1-й байт адрес, 2-й -количество переданных, далее данные прием :2байта, далее чтение по одному до очистки буфера(было и сразу по количество переданных-2):

[CODE]

DCBCommport.Parity=MARKPARITY;
SetCommState(CommHandle,&DCBCommport);
WriteFile(CommHandle,Transmit_A,1,&KolByte,&Ovr_w);
DCBCommport.Parity=SPACEPARITY;
SetCommState(CommHandle,&DCBCommport);
WriteFile(CommHandle,Transmit,kol_pered-1,&KolByte,&Ovr_w);

ReadFile(CommHandle,Resive,2,&Kols,&Ovr_r);
DWORD dwait=WaitForSingleObject(Ovr_r.hEvent,Time_ojid);
switch (dwait)
{ case WAIT_OBJECT_0 :
{
...
do
{
ReadFile(CommHandle,Resive,1,&Kols,&Ovr_r);//читаем
...
}
}
while ( Kols> 0);
break;
}
case WAIT_TIMEOUT {...}
case WAIT_FAILED : {...}
}
ResetEvent(Ovr_r.hEvent);
[CODE]

это запускается по кнопке.

первый раз проходит. а далее уже после первой записи в Resive появляется сразу первый байт и далее происходит сдвижка массива.Что-то не так, помогите разобраться.


Вернуться в Работа с внешними устройствами