Вот текст програми, почему виснет ?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено whale 07 ноября 2004 г. 15:11
В ответ на: HELP ! по windows и com port отправлено whale 07 ноября 2004 г. 11:53

Сначала жмем кнопку 2 - открываем прот
Затем кнопку1 - цико опроса - здесь то и виснет
Если без цикла и жать на кнопку1 через таймер (20мс)-работает, но иногда пропускает данные :(
//---------------------------------------------------------------------------
void __fastcall TForm1::OpenComPort()
{
COMMTIMEOUTS ct;
DCB dcb;

FillMemory(&dcb, sizeof(dcb), 0);

ct.ReadIntervalTimeout=0; // мах время ожидания между двумя байтами
ct.ReadTotalTimeoutMultiplier=0; // время посылки из 4 байт
ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile(comport,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if ( port == INVALID_HANDLE_VALUE )
{ Button2Click(NULL);
char mess[40] = "Невозможно открыть порт";
MessageBox (NULL, TEXT(strcat(strcat(mess," "),comport)),TEXT("Error"), MB_OK);
*mess=0;
CloseHandle(port);
goto exit;
}

// установка параметров порта
GetCommState(port, &dcb); // чтение параметров порта
dcb.BaudRate = CBR_1200 ;
dcb.fParity = FALSE;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fNull = FALSE;

SetCommState(port,&dcb); // уст параметров порта
SetCommTimeouts(port,&ct); // уст временных интервалов
PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR); // обнуление буфера порта
SetupComm(port,256,256); // передача параметров в порт

exit:
}
//------------------------ чтение порта -----------------------------------
void __fastcall TForm1::ReceivePort(HANDLE comport,int num)
{
DWORD bc;
ReadFile(comport,buf_in,num,&bc,NULL);
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

for (i=0; i<1000; i++)
{

ReceivePort(port,4); // прием 4-х байтов из com порта

x=x+1; // ось x

Rm=buf_in[0];
Rct=buf_in[1];
Ym=buf_in[2];
Yct=buf_in[3];

Rct=Rct*256+Rm; // преобразование в десятичное число
Yct=Yct*256+Ym;

Series1->AddXY(x,Rct,"",clRed);
Series2->AddXY(x,Yct,"",clYellow);

}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (ComboBox1->ItemIndex==0) comport="Com1";
if (ComboBox1->ItemIndex==1) comport="Com2";
if (ComboBox1->ItemIndex==2) comport="Com3";
if (ComboBox1->ItemIndex==3) comport="Com4";


OpenComPort();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
CloseHandle(port);
}
//---------------------------------------------------------------------------


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

Ответы



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

E-mail: info@telesys.ru