[an error occurred while processing this directive]
не понимаю что сложного в работе с потоком ?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено DSN 29 марта 2005 г. 00:28
В ответ на: я этим не питаюсь, мне достаточно описаний API, в тяжелых случаях ищу примеры в инете и разбираюсь отправлено DSN 28 марта 2005 г. 23:58


//===============================================
unsigned int OpenComPort(scomport *dport)
{
dport->En=TRUE;//разрешить текущий поток.
dport->thr = CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE) ThreadR, //выполняемая функция.
dport, //параметры для потока.
0,
&dport->dwThrID); //идентификатор потока.
if(dport->thr == NULL){return(1);}
return(0);
}
//===============================================
unsigned int CloseComPort(scomport *sdport)
{
sdport->En=FALSE;//запретить текущий поток.
return(0);
}
//=============================================== !!! ПОТОК !!!
DWORD FAR PASCAL ThreadR(LPSTR lpData) //потоки.
{
scomport *dport;
//void (*recdata)(void *data);
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD mask;
DWORD cntrd;
OVERLAPPED lpOvpd; //структура синхронизации.
LPMSG lpMsg; //структура для обработки сообщений.
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);
PostMessage(Form1->Handle,WM_USER,0,(long)dport);
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;
memset(&lpOvpd,0,sizeof(OVERLAPPED));//сброс структуры.
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.
lpOvpd.Internal = NULL;
lpOvpd.InternalHigh = NULL;
lpOvpd.Offset = NULL;
lpOvpd.OffsetHigh = NULL;
ResetEvent(lpOvpd.hEvent); //ResetEvent(lpOvpd[1].hEvent);
WaitCommEvent(dport->hnd, &mask, &lpOvpd);//ожидание события.
while((WaitForSingleObject(lpOvpd.hEvent,100)!= WAIT_OBJECT_0)&(dport->En)){
i=0;
while(dport->tpp != dport->tpe){
buf[i]= dport->tbuf[dport->tpe];
(dport->tpe)++; dport->tpe = dport->tpe & 1023;
i++;
}//while transmit.
if(i>0){
ResetEvent(lpOvpd.hEvent);
WriteFile(dport->hnd, buf, i, &cntrd, &lpOvpd);
if(WaitForSingleObject(lpOvpd.hEvent,50)==WAIT_OBJECT_0){
GetOverlappedResult(dport->hnd, &lpOvpd, &cntrd, FALSE);
}
}//if i>0
//--------transmit end
}
//WaitForMultipleObjects(2,lpOvpd,FALSE,INFINITE);
//GetOverlappedResult(dport->hnd, &lpOvpd, &mask, FALSE);
//----------------------------------------/
if(mask & EV_ERR){
ClearCommError(dport->hnd, &dwErrorFlags, &ComStat);//сборос ошибки порта.
//Form1->Memo1->Lines->Add("ERROR");
}//if err
//----------------------------------------/
if(mask & EV_RXCHAR){ //проверить на наличие принятых данных
ReadFile(dport->hnd, buf, sizeof(buf), &cntrd, &lpOvpd);
if(GetLastError() == ERROR_IO_PENDING){
ResetEvent(lpOvpd.hEvent);
if(WaitForSingleObject(lpOvpd.hEvent,100)==WAIT_OBJECT_0){//INFINITE
GetOverlappedResult(dport->hnd,&lpOvpd,&cntrd,FALSE);//получить кол-во даных.
//Form1->Memo1->Lines->Add(CharToStr(buf,cntrd));
dport->tmout = 0;
for(i=0;i }//if WaitForSingle...
}// if GetLastError
} //if read
//----------------------------------------/
if(mask & EV_CTS){ //изменилось состояние CTS прочитать.
GetCommModemStatus(dport->hnd,&(dport->ModStat));
//Form1->Memo1->Lines->Add("CTS="+IntToStr(dport->ModStat & MS_CTS_ON ));
}//CTS
//----------------------------------------/
} //while
//----------------------------------------//цикл потока.
CloseHandle(lpOvpd.hEvent);//закрытие объекта события
CloseHandle(dport->hnd);//закрытие порта.
ExitThread(0);
return(TRUE);
}


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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru