RS232 pod win32 pomocy

Apr 25, 2004 6 Replies

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); } }


Uzytkownik "Robert" snipped-for-privacy@o2.pl napisal w wiadomosci news: snipped-for-privacy@news.tpi.pl...

Czy nie mozesz po prostu uzyc kontrolki mscomm ? Kilka programów dziala u mnie bez problrmów Zygmunt

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); }

Uzywajcie Delphi - 3 linijki kodu i problem z glowy

Procedura odbioru znaków z RS (fragment)

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var Str:String; begin ComPort1.ReadStr(Str, Count); BlockWrite(dt,Str[1],Length(Str)); end;

Wydaje mi sie ze glos jednego z grupowiczow ze NTG nie calkiem przystaje do aktualnej rzeczywistosci. Teraz jest bardzo duzo projektow w ktorych jest uzywany PC z Win. I jakos trzeba umiec to zrobic - najlepiej samemu. Wlasnie musialem zrobic przetwornik ADC 2x16 bitów z transmisja przez USB/RS232 do PC i program tez musialem sam napisac.

Pozdr.

J.Rydygier

typ uzywa com'a w trybie nonoverlapped (odpytywania), niech zacznie uzywac go w trybie overlapped (przerwaniowym)

to w sumie zasadnicza roznica bardzo :)

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required