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

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

Отправлено DSN 07 ноября 2004 г. 15:49
В ответ на: Вот текст програми, почему виснет ? отправлено whale 07 ноября 2004 г. 15:11

//===============================================
void programing(void)
{
char port[] = "\\COM1";
//-----------------------------------------------
strcpy(dport.port,port);
if(dport.En){MessageBox(0,"WORK !!!","Test",MB_OK);
return;}
dport.En=TRUE;//разрешить текущий поток.
CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE) ThreadProg, //выполняемая функция.
&dport, //параметры для потока.
0,
&dport.dwThrID); //идентификатор потока.
}
//===============================================
DWORD FAR PASCAL ThreadProg(LPSTR lpData) //потоки.
{
sport *dport;
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD mask;
OVERLAPPED lpOvpd; //структура синхронизации.
int i,n,rs;
DWORD cntrd;
char data[1024];
unsigned int adrp;
HANDLE fhn;
LPOFSTRUCT lpReOpenBuff;
//----------------------------------------------
dport=(sport*)lpData;//получение указателя на структуру.
//----------------------------------------------
dport->hnd = CreateFile(dport->port, GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL, NULL );//open Port.
if(dport->hnd==INVALID_HANDLE_VALUE)
{
dport->En=FALSE;
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_115200;
dport->sdcb.fBinary=TRUE;
dport->sdcb.fParity=FALSE;
dport->sdcb.fOutxCtsFlow=FALSE;
dport->sdcb.fOutxDsrFlow=FALSE;
dport->sdcb.fDtrControl=DTR_CONTROL_DISABLE;
dport->sdcb.fDsrSensitivity=FALSE;
dport->sdcb.fTXContinueOnXoff=TRUE;
dport->sdcb.fOutX=FALSE;
dport->sdcb.fInX=FALSE;
dport->sdcb.fErrorChar=FALSE;
dport->sdcb.fNull=FALSE;
dport->sdcb.fRtsControl=RTS_CONTROL_DISABLE;
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=100;
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;
SetCommMask(dport->hnd,mask);//режимы приема/передачи
//----------------------------------------//цикл потока.
ClearCommError(dport->hnd, &dwErrorFlags, &ComStat);//сборос ошибки порта.
dport->buftr = trbuf;
dport->sztbf = sizeof(trbuf);
dport->bufrc = rcbuf;
dport->szrbf = sizeof(rcbuf);
//----------------------------------------------
error=0;
//проверка наличия программатора.
for(i=0,n=0;i<=5;i++)if(TestHardware(dport)){n++;}
if(n==0){Form1->StatusBar1->Panels->Items[0]->Text = "ОШИБКА: Не найден программатор !!!";
error=1;}else{Form1->StatusBar1->Panels->Items[0]->Text = "Программатор ОК";
//VCC - 1(1) / Reset - 2(0) / CS - 4(0)
data[0]=0x05; //включить питание.
if(SendCommand(2,1,data,dport))if(RecivCommand(dport))
if(0xff&dport->bufrc[3]==0x12){Form1->Memo1->Lines->Add("Питание: ON");}
data[0]=0xD0; //ноги вкл.
if(SendCommand(4,1,data,dport))if(RecivCommand(dport))
if(0xff&dport->bufrc[3]==0x14){Form1->Memo1->Lines->Add("Выходы: ON");}
data[0]=0x07; //выйти из сброса.
if(SendCommand(2,1,data,dport))if(RecivCommand(dport))
if(0xff&dport->bufrc[3]==0x12){Form1->Memo1->Lines->Add("Разрешить кристалл: ОК");}
rs = AT45GetStat(dport);
if((rs&0x3f)!=0x1a){Form1->Memo1->Lines->Add("Не найдена AT45DB321: ERR");
}else{Form1->Memo1->Lines->Add("Обнаружена AT45DB321: ОК");
if(FileExists(FileName)){
fhn = CreateFile(fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);
if(fhn==INVALID_HANDLE_VALUE){Form1->Memo1->Lines->Add("Невозможно открыть файл:"+FileName);}
else{Form1->Memo1->Lines->Add("Записано:");
adrp=0;rs=0;
do{
cntrd = 528;
if(ReadFile(fhn, data, cntrd, &cntrd, NULL)){rs+=cntrd;
AT45Write(dport, adrp, data, cntrd);
adrp+=0x0400;//следующая страница.
}
Form1->Memo1->Lines->Delete(Form1->Memo1->Lines->Count-1);
Form1->Memo1->Lines->Add("Записано:"+IntToStr(rs));
}while(cntrd==528);
CloseHandle(fhn);
}//if
}else{Form1->Memo1->Lines->Add("Не найден Файл:"+FileName);}
}//test cristall
data[0]=0xff; //ноги выкл.
if(SendCommand(4,1,data,dport))if(RecivCommand(dport))
if(0xff&dport->bufrc[3]==0x14){Form1->Memo1->Lines->Add("Выходы: OFF");}
data[0]=0x00; //сброс кристала.
if(SendCommand(2,1,data,dport))if(RecivCommand(dport))
if(0xff&dport->bufrc[3]==0x12){Form1->Memo1->Lines->Add("Кристалл: OFF");}
//----------------------------------------//цикл потока.
}//test progr
CloseHandle(dport->hnd);//закрытие порта.
dport->En = FALSE;
//ExitThread(0);
return(TRUE);
}

//===============================================
BOOL WritePort(sport *dp)
{
OVERLAPPED ovr; //структура синхронизации.
BOOL res = FALSE; //результат.
//-------------------------
memset(&ovr,0,sizeof(OVERLAPPED));//сброс структуры.
ovr.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //создать событие.
ResetEvent(ovr.hEvent);
WriteFile(dp->hnd, dp->buftr, dp->sztbf, &dp->trncnt, &ovr);
if(WaitForSingleObject(ovr.hEvent,500)==WAIT_OBJECT_0){
GetOverlappedResult(dp->hnd, &ovr, &dp->trncnt, FALSE);
res = TRUE;
}else{ }//error
CloseHandle(ovr.hEvent); //удалить событие.
return(res);
}
//===============================================
BOOL ReadPort(sport *dp)
{
OVERLAPPED ovr; //структура синхронизации.
BOOL res = FALSE; //результат.
int error;
//-------------------------
memset(&ovr,0,sizeof(OVERLAPPED));//сброс структуры.
ovr.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //создать событие.
//ResetEvent(ovr.hEvent);
ReadFile(dp->hnd, dp->bufrc, dp->szrbf, &dp->reccnt, &ovr);
if(WaitForSingleObject(ovr.hEvent,1000)==WAIT_OBJECT_0){
if(GetOverlappedResult(dp->hnd, &ovr, &dp->reccnt, FALSE)){
res = TRUE;}
}else{ }//error
CloseHandle(ovr.hEvent); //удалить событие.
return(res);
}

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

Ответы



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

E-mail: info@telesys.ru