вы видимо порт асинхронно открывали, а я синхронно...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено DSN 06 марта 2004 г. 17:47
В ответ на: Делал 2 thread помимо основного: 1- rxd, 2- txdl; SetCommTimeouts (hPort, &CommTimeouts используете? Также event можно сгенерить, если handle глобальный... отправлено xc164 06 марта 2004 г. 17:40

вот мой поток.
на билдере.
//=============================================== !!! ПОТОК !!!
DWORD FAR PASCAL ThreadR(LPSTR lpData) //потоки.
{
scomport *dport;
//void (*recdata)(void *data);
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD mask;
DWORD cntrd;
OVERLAPPED lpOvpd; //структура синхронизации.
int error;
unsigned int i;
char buf[1024];
//----------------------------------------------
dport=(scomport*)lpData;//получение указателя на структуру.
//----------------------------------------------
dport->hnd = CreateFile(dport->port, GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
0, NULL );//open Port.
// FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL, NULL );//open Port.
if(dport->hnd==INVALID_HANDLE_VALUE)
{
error = GetLastError();
dport->En=FALSE;
dport->Err = error;
MessageBox(0,"Error Open Port","Error Open",MB_OK);
return(1);
}//невозможно открыть порт.
//----------------------------------------------
GetCommState(dport->hnd,&dport->sdcb); //чтение значений в структуру.
dport->sdcb.DCBlength=sizeof(DCB); //размер структуры.
dport->sdcb.BaudRate=CBR_9600; //скорость обмена.
dport->sdcb.fBinary=TRUE; //двоичный режим.
dport->sdcb.fParity=FALSE; //контроль четности.
dport->sdcb.fOutxCtsFlow=TRUE; //слежение и контроль CTS
dport->sdcb.fOutxDsrFlow=FALSE; //слежение и контроль DSR
dport->sdcb.fDtrControl=DTR_CONTROL_ENABLE; //режим управления DTR
dport->sdcb.fDsrSensitivity=FALSE; //чувствительность к сигналу DSR
dport->sdcb.fOutX=FALSE; //XON/XOFF для управления потоком.
dport->sdcb.fInX=FALSE; //XON/XOFF для управления приемником.
dport->sdcb.fNull=FALSE; //обработка нулевых байт при передаче.
dport->sdcb.fRtsControl=RTS_CONTROL_ENABLE; //разрешения исп сигнала RTS
dport->sdcb.ByteSize=8; //размерность байта.
dport->sdcb.Parity=NOPARITY; //режим контроля четности.
dport->sdcb.StopBits=ONESTOPBIT; //кол-во стоп битов.
SetCommState(dport->hnd,&dport->sdcb); //установка значений в струтуре.
//----------------------------------------------
GetCommTimeouts(dport->hnd,&dport->ct); //получение таймаутов.
dport->ct.ReadIntervalTimeout=10; //время между двумя соседними символами.
dport->ct.ReadTotalTimeoutMultiplier=0;
dport->ct.ReadTotalTimeoutConstant=0;
dport->ct.WriteTotalTimeoutMultiplier=10;
dport->ct.WriteTotalTimeoutConstant=0;
SetCommTimeouts(dport->hnd,&dport->ct);
//----------------------------------------------
PurgeComm(dport->hnd,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);//очистка буферов драйвера.
//----------------------------------------------
GetCommMask(dport->hnd,&mask);
mask &= EV_EVENT1|EV_EVENT2|EV_PERR|EV_RX80FULL;
//mask = mask|EV_RXCHAR|EV_TXEMPTY|EV_ERR;
mask |= EV_RXCHAR|EV_ERR|EV_CTS|EV_TXEMPTY;
SetCommMask(dport->hnd,mask);//режимы приема/передачи
//----------------------------------------------
//(void*)recdata=dport->proc;//получения указателя на процедуру обработки.
//----------------------------------------------
lpOvpd.Internal = NULL;
lpOvpd.InternalHigh = NULL;
lpOvpd.Offset = NULL;
lpOvpd.OffsetHigh = NULL;
lpOvpd.hEvent = CreateEvent( //создание обьекта события.
NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL); // no name
//----------------------------------------------

//char buft[]=" test send messages! ";
//DWORD trn;
//WriteFile(dport->hnd, buft, sizeof(buft), &trn, NULL);

//----------------------------------------//цикл потока.
while(dport->En)//продолжать пока истинно.
{
mask=0;//Reset mask Events.
ResetEvent(lpOvpd.hEvent);
WaitCommEvent(dport->hnd, &mask, NULL);//&lpOvpd);//ожидание события.
//----------------------------------------/
if(mask & EV_ERR){
ClearCommError(dport->hnd, &dwErrorFlags, &ComStat);//сборос ошибки порта.
//Form1->Memo1->Lines->Add("ERROR");
}//if err
//----------------------------------------/
if(mask & EV_RXCHAR){ //проверить на наличие принятых данных
if(ReadFile(dport->hnd, buf, sizeof(buf), &cntrd, NULL)){
//Form1->Memo1->Lines->Add(CharToStr(buf,cntrd));
dport->tmout = 0;
for(i=0;i } //if read
//----------------------------------------/
if(mask & EV_CTS){ //изменилось состояние CTS прочитать.
GetCommModemStatus(dport->hnd,&(dport->ModStat));
//Form1->Memo1->Lines->Add("CTS="+IntToStr(dport->ModStat & MS_CTS_ON ));
}//CTS
//----------------------------------------/
count++;
Form1->Edit3->Text = IntToStr(count);
} //while
//----------------------------------------//цикл потока.
CloseHandle(lpOvpd.hEvent);//закрытие объекта события
CloseHandle(dport->hnd);//закрытие порта.
ExitThread(0);
return(TRUE);
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru