Witam. Na początku pragnę przedstawić swój projekt, który staram się wykonać.
Zbudowałem układ oparty na Atmega8 z układme MAX - komunikacja rs232, sprzętowe podłączenie napewno jest OK. Układ wykonuje pomiary czterech napięć (u1, u2, u3, u4).
Cały program na uC jest napisany w BASCOMIE.
Moim celem jest stworzenie pulpitu na monitorze (c++ builder) gdzie:
- wyświetlane są wyniki pomiarów
- wyświetlenie zawartości pamięci EEPROM na monitorze
- możliwośc wpisania nowych wartości do pamięcie EEPROM
W czym problem ... mianowicie potrafie wysłać dane odebrać dane w obie strony jednak robię to "po omacku".
Przykładowo wysyłam pomiary w bascomie
Print napiecie_a
Print napiecie_b
Print napiecie_c
Print napiecie_d
i chciałbym je wyświetlić tak że
napiecie_a -> znajdzie się w polu Edit1
napiecie_b -> znajdzie się w polu Edit2
napiecie_c -> znajdzie się w polu Edit3
napiecie_d -> znajdzie się w polu Edit4
niestety gdy odbieram dane z uC to wyświetla mi się wszystko w jednym polu Edit1 jednym ciągiem C++ jest dla mnie tu największą zagadką. w C++ operuje na Writefile, Readfile
w jaki sposób wybrać sobie z buffora poszczególne wartości aby ładnie je wyświetlić??
na co powinienem zwrócić uwagę i jak powinien wyglądać algorytm takiego procesu odczytu czterech wartości i wyświetleniu je w odpowiednich polach.
to jest 1 część moich problemów ) kolejne poruszę później jak ten jeden opanuje z mam nadzieje z Waszą pomocą.
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj się[c++] [bascom] AVR-RS232-PC
Moderatorzy:Jacek Bogusz, Moderatorzy
opierałem się na książce Daniluka.
Z komponentem miałem problem juz przy instalacji i niebardzo chciał mi zatrybić.
Z komponentem miałem problem juz przy instalacji i niebardzo chciał mi zatrybić.
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
{
OpenComm->Enabled=false;
CloseComm->Enabled=true;
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;
};
}
}
Write_Comm(hCommDev,1);
Read_Comm(hCommDev,&Number_Bytes_Read,sizeof(Buffer_I));
BOOL __fastcall Write_Comm(HANDLE hCommDev,
DWORD nNumberOfBytesToWrite)
{
DWORD NumberOfBytesWritten;
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=4;
//*lpNumberOfBytesRead = 0;
ClearCommError(hCommDev, &Errors ,&Stat);
if (Stat.cbInQue > 0)
{
if (Stat.cbInQue > Buf_Size)
nNumberOfBytesToRead = Buf_Size;
else
nNumberOfBytesToRead = Stat.cbInQue;
}
else {
*lpNumberOfBytesRead=0;
}
//&Buffer_I[0],
return ReadFile(hCommDev, Buffer_I,
nNumberOfBytesToRead,
lpNumberOfBytesRead, NULL);
}
Heh... nie lubie tych ulepszaczy builderowych... ale sprobujmy:
Jak widze po rzuceniu okiem, odbierasz 4 bajty i umieszczasz w Buffer_I, to jest string o ile pamietam.
Mozesz sprobowac wywolac 4 krotnie, zmienic DWORD nNumberOfBytesToRead=1; i zostawic wpisywanie do Edita jak jest;
albo zostawic odbieranie jak jest, i pobawic sie w przycinanie stringow tzn. Edit1.text=Buffer_I[0]; Edit2.text=Buffer_I[1]; itd. oczywiscie w takim przypadku przydalo by sie pewnie tez jakos przerzutowac te dane, bo pewnie uzyskasz w Edicie wartosc w hex, albo wrecz znak ASCII odpowiadajacy wartosci.
Btw. od bascomowego softu otrzymujesz napewno 4 bajty (dla 4 pomiarow)?? Jakos tam pomiary formatujesz, czy odrazu z ADC 8 bit bierzesz?
Poeksperymentuj, ja teraz tylko tak pomysly rzucilem na poczatek. Jak nie dasz rady moze ktos inny jeszcze cos podpowie, bo sam pewnie Buildera nie zainstaluje w najblizszym czasie, a wypadalo by to wyprobowac... jednak ew. kody bledow to skarbnica wiedzy
Jak widze po rzuceniu okiem, odbierasz 4 bajty i umieszczasz w Buffer_I, to jest string o ile pamietam.
Mozesz sprobowac wywolac 4 krotnie, zmienic DWORD nNumberOfBytesToRead=1; i zostawic wpisywanie do Edita jak jest;
albo zostawic odbieranie jak jest, i pobawic sie w przycinanie stringow tzn. Edit1.text=Buffer_I[0]; Edit2.text=Buffer_I[1]; itd. oczywiscie w takim przypadku przydalo by sie pewnie tez jakos przerzutowac te dane, bo pewnie uzyskasz w Edicie wartosc w hex, albo wrecz znak ASCII odpowiadajacy wartosci.
Btw. od bascomowego softu otrzymujesz napewno 4 bajty (dla 4 pomiarow)?? Jakos tam pomiary formatujesz, czy odrazu z ADC 8 bit bierzesz?
Poeksperymentuj, ja teraz tylko tak pomysly rzucilem na poczatek. Jak nie dasz rady moze ktos inny jeszcze cos podpowie, bo sam pewnie Buildera nie zainstaluje w najblizszym czasie, a wypadalo by to wyprobowac... jednak ew. kody bledow to skarbnica wiedzy
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 37 gości