RS232 pod win32 pomocy

konstuuje taki modul poiarowy z czujnikem przyspieszenia i utknalem na transmisji szeregowej pod widows. Wszystko wydawalo sie proste ale niestety napotkalem na niespodziewane trudnosci. Owszem program otwiera port wysyla do ukladu zadany ciag bajtow gorzej jest z odbiorem. Programik wprawdzie odbiera cos z portu i to nawet +/- to co powinien tyle ze sie zawiesza po jakims czasie. Testowo odbieram 1024 bajty wpierw probowalem odebrac cale 1024 to wzykle zawieszal sie od razu, w tej chwili odbieram po znaku funkcja ReadFile umieszczona jest w metodzie execute watku tyle ze dziala to do pewnego momentu i znow program wisi. Podejrzwam ze zczytuje z pustego bufora albo jeszcze cos o czy nie wiem. Sama funkcja Drawit nie slyzy bynajmniej do rysowania ale poprostu dodaje element (wpisuje odebrany bajt) do tablicy i inkrementuje indeks. Docelowo potrzebuje odczytywac do 256kBajtow. jesli ktos spotkal sie z podobnym problemem lub jest w stanie mi cos zasugerowac to bardzo prosze o pomoc. maniplowac timeoutami tez probowalem ale o nie przynosi rezultatu.

Robert Nogiec snipped-for-privacy@poczta.onet.pl

void __fastcall TRead::Execute() {

DWORD dwBytesRead; FreeOnTerminate = true;

while(1) { //Form1->RadioButton1->Checked = true; if(czy_czytac==true) { ReadFile(portCOM,buf1,1,&dwBytesRead,NULL); if(dwBytesRead) { if(licz_probek>1024) { czy_czytac = false; } Synchronize(DrawIt); } }

} }

void __fastcall TRead::DrawIt() {

if(licz_probek<1024) { bufor[licz_probek] = buf1[0]; licz_probek++; buf1[1] = 0; //Form1->Memo1->SetSelTextBuf(buf1); } }

Reply to
Robert
Loading thread data ...

Robert wrote: > (...)

  1. Czy kasujesz gdzies licz_probek? Jesli nie: masz odpowiedz. Jesli tak - spróbuj zablokować dostep do tej zmiennej przez TCriticalSection (i wszystkiuch innych zmiennych wspoldzielonych miedzy watkami).

  2. Ja osobiscie nie mieszałbym logiki z interfejsem użytkownika. Wydaje mi się, że lepiej aby DrawIt była wywoływana z jakiegoś TTimer'a co pewien czas i sprawdzała sobie, czy ma coś zrobić (np. przez kontrolowanie stanu odpowiednich zmiennych blokowanych przez TCriticalSection)

  1. Pamietaj, ze w momencie gdy czy_czytac==false to nie masz zablokowanego odczytywania z portu, odebrane znaki sa kolejkowane w fifo systemu operacyjnego, jesli chcesz je tracic - odbieraj przez ReadFile i nic z nimi dalej nie rob.

  2. Zamiast "while(1)" uzyj "while(!Terminated)" - wazne!

  1. Dałbym Sleep w momencie gdy czy_czytac==false, aby petla nie krecila sie bez sensu

Na przyklad: while (!Terminated) { if (czy_czytac) { while (ReadFile(portCOM,buf1,1,&dwBytesRead,NULL)) { // tutaj co najmniej jeden znak odebrany ... } } else { while (ReadFile(portCOM,buf1,1,&dwBytesRead,NULL)) { // tutaj kipujemy fifo systemowe } } // mozemy tutaj oddac kontrole do systemu Sleep(20); }

Reply to
Paweł Sklarow

a bcb gorszy? :)

Reply to
Q

A właśnie - przecież już jest darmowy Async. Zapomniałem. W BCB będzie tak samo jak w Delphi.

Reply to
Paweł Sklarow

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.