RTV forum PL | NewsGroups PL

Problemy z odbiorem danych RS232 w module pomiarowym z czujnikiem przyspieszenia

RS232 pod win32 pomocy

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Problemy z odbiorem danych RS232 w module pomiarowym z czujnikiem przyspieszenia

Robert
Guest

Sun Apr 25, 2004 10:58 am   



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

zygmunt
Guest

Sun Apr 25, 2004 1:50 pm   



Uzytkownik "Robert" <raydenx@o2.pl> napisal w wiadomosci
news:408ca7e9.3344250@news.tpi.pl...
Quote:
konstuuje taki modul poiarowy z czujnikem przyspieszenia
i utknalem na transmisji szeregowej pod widows. Wszystko wydawalo sie...

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

Q
Guest

Sun Apr 25, 2004 10:28 pm   



Quote:
i utknalem na transmisji szeregowej pod widows. Wszystko wydawalo sie
proste ale niestety napotkalem na niespodziewane trudnosci.

- po pierwsze: przeczytaj najpierw to:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
/jest tu _wszystko_
/wada: musisz to przeczytac Smile no i zrozumiec :(

- po drugie: NTG Sad
/w czym pisales? w BCB? to tam zapytaj;

Paweł Sklarow
Guest

Tue Apr 27, 2004 8:47 am   



Robert wrote:
Quote:
(...)
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);
}
}
}
}
(...)

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)

3. 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.

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

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


--
pozdrawiam, Paweł Sklarow

J.Rydygier
Guest

Tue Apr 27, 2004 6:28 pm   



Quote:
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.

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

Q
Guest

Wed Apr 28, 2004 12:28 am   



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

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

to w sumie zasadnicza roznica bardzo Smile

Q
Guest

Wed Apr 28, 2004 12:29 am   



Quote:
Uzywajcie Delphi - 3 linijki kodu i problem z glowy

a bcb gorszy?
Smile

Paweł Sklarow
Guest

Wed Apr 28, 2004 7:16 am   



J.Rydygier wrote:
Quote:
(...)
Uzywajcie Delphi - 3 linijki kodu i problem z glowy
(...)

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


--
pozdrawiam, Paweł Sklarow

elektroda NewsGroups Forum Index - Elektronika Polska - Problemy z odbiorem danych RS232 w module pomiarowym z czujnikiem przyspieszenia

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map