oto moja obecna aplikacja "napisana" na podstawie innych programów przykładowych. Po kliknięciu w button pojawia mi się wartość w wybranym okienku i jest OK. Jednak gdy klikne kolejny button (w celu odczytania drugiego pomiaru) zaczynają się schody. Pojawia się najpierw wartość pomiaru 1 a dopiero po 5 kliknięciu wartośc z pomiaru nr2. czy to wina buforów i ich czyszczenie ?
Cytat:
#include <vcl.h>
#pragma hdrstop
#include "pulpit.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DWORD cbOutQueue = 32 ; //rozmiar bufora danych wyjściowych
DWORD cbInQueue = 32 ; //rozmiar bufora danych wejściowych
char*Buffer_O = new char[cbOutQueue] ;
char*Buffer_I = new char[cbInQueue] ;
//char Buffer_O[cbOutQueue]; // bufor danych wyjściowych
// char Buffer_I[cbInQueue]; // bufor danych wejściowych
DWORD Number_Bytes_Read; // liczba bajtów do czytania
HANDLE hCommDev; // identyfikator portu
DWORD fdwEvtMask;
COMSTAT Stat;
DWORD Errors;
//BOOL bResult = TRUE;
//int hThread_SR;
//unsigned ThreadID_SR;
//Cardinal intVar; // licznik pomiaru
LPCTSTR sbuffer1 = "Uwaga !";
LPCTSTR sbuffer2 = "Błąd !";
LPCTSTR sbuffer3 = "Niewłaściwa nazwa portu lub port jest"
" aktywny.";
LPCTSTR sbuffer4 = " Port nie został otwarty do transmisji.";
LPCTSTR sbuffer5 = " Działanie aplikacji zostanie zakończone.";
//-------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------
BOOL __fastcall Write_Comm(HANDLE hCommDev,
DWORD nNumberOfBytesToWrite)
{
DWORD NumberOfBytesWritten;
//if (WriteFile(hCommDev, &Buffer_O[0], nNumberOfBytesToWrite,
//&NumberOfBytesWritten , NULL) == TRUE)
if (WriteFile(hCommDev,Buffer_O,nNumberOfBytesToWrite,
&NumberOfBytesWritten , NULL)>0)
{
WaitCommEvent(hCommDev, &fdwEvtMask, NULL);
return True ;
}
else
return FALSE;
}
//--------------------------------------------------
BOOL __fastcall Read_Comm(HANDLE hCommDev,
LPDWORD lpNumberOfBytesRead, DWORD Buf_Size)
{
DWORD nNumberOfBytesToRead;
*lpNumberOfBytesRead = 0;
ClearCommError(hCommDev, &Errors ,&Stat);
if (Stat.cbInQue > 0)
{
if (Stat.cbInQue > Buf_Size)
nNumberOfBytesToRead = Buf_Size;
else
nNumberOfBytesToRead = Stat.cbInQue;
}
return ReadFile(hCommDev, &Buffer_I[0],
nNumberOfBytesToRead,
lpNumberOfBytesRead, NULL);
}
//----------------------------------------------------
void __fastcall TForm1::CloseCommClick(TObject *Sender)
{
switch(MessageBox(NULL, sbuffer5, sbuffer1,
MB_YESNO | MB_ICONQUESTION))
{
case ID_YES :
{
//SuspendThread((HANDLE)hThread_SR);
CloseHandle(hCommDev);
Application->Terminate();
break;
}
case ID_NO :
Abort();
break;
}
}
//------------------------------------------------
//--------------------------------------------------
void __fastcall TForm1::OpenCommClick(TObject *Sender)
{
LPCTSTR lpFileName;
DCB dcb;
lpFileName = "COM1";
hCommDev = CreateFile(lpFileName, GENERIC_READ |
GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, NULL);
if (hCommDev != INVALID_HANDLE_VALUE)
// sprawdza, czy port jest otwarty prawidłowo
{
SetupComm(hCommDev, cbInQueue, cbOutQueue);
dcb.DCBlength = sizeof(dcb);
GetCommState(hCommDev, &dcb);
dcb.BaudRate = CBR_9600;
dcb.Parity = ODDPARITY; // ustawienie parzystości
dcb.StopBits = ONESTOPBIT; // bity stopu
dcb.ByteSize = 7; // bity danych
//-przykładowe ustawienia flag sterujących DCB-
dcb.fParity = TRUE; // sprawdzanie parzystości
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDsrSensitivity = FALSE;
dcb.fAbortOnError = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;
SetCommState(hCommDev, &dcb);
GetCommMask(hCommDev, &fdwEvtMask);
SetCommMask(hCommDev, EV_TXEMPTY);
}
else
{
switch ((int)hCommDev)
{
case IE_BADID:
MessageBox(NULL, sbuffer3, sbuffer2, MB_OK);
break;
};
}
}
//----------------pomiar 1------------------------------
void __fastcall TForm1::MeasureONClick(TObject *Sender)
{
Buffer_O = "A"; // wyslanie znaku "A" do buffora wyj.
//uC odpowiada na ten znak pomiarem nr.1
Write_Comm(hCommDev,1); // wyslanie znaku z buffora do uC
memset(Buffer_I,0,cbOutQueue); //czyszczenie bufora wyjsciowego
Read_Comm(hCommDev,&Number_Bytes_Read,sizeof(Buffer_I)); //odczytanie pomiaru1 z bufora wejsciowego
Form1->RichEdit1->Text = Buffer_I; // wyswietlenie pomiaru
FlushFileBuffers(hCommDev);
}
//---------------pomiar 2------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Buffer_O = "B"; // wyslanie znaku "B" do buffora wyj.
Write_Comm(hCommDev,1); //uC odpowiada na ten znak pomiarem nr.2
memset(Buffer_I,0,cbOutQueue); //czyszczenie bufora wyjsciowego
Read_Comm(hCommDev,&Number_Bytes_Read,sizeof(Buffer_I)); //odczytanie pomiaru2 z bufora wejsciowego
Form1->RichEdit2->Text = Buffer_I; // wyswietlenie pomiaru
FlushFileBuffers(hCommDev); //czyszczenie bufora wej.
}
//---------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action=caFree;
}
//-------------------------------------------------------
p.s. Panowie bez awantur