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

no i zrozumiec :(
- po drugie: NTG
/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
Q
Guest
Wed Apr 28, 2004 12:29 am
Quote:
Uzywajcie Delphi - 3 linijki kodu i problem z glowy
a bcb gorszy?
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