port szeregowy w BC++Builder



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Łukasz R." <rezystor_at_nospam_poczta.wp.pl>
Subject: port szeregowy w BC++Builder
Date: Mon, 25 Mar 2002 00:21:01 +0100


witam

zrobilem termometr na 89c51 i DS1624 i chciałbym napisac prostą aplikację w
BC++B , ktora na początek odbierała by temperaturę po RS, uzupełniała ją o
datę i godzinę i zapisywała do pliku, problem w tym ze program ma działac w
win9x,2000,NT,XP, co oznacza ze muszę wykorzystac najlepiej jakis komponent
do RS, wiem ze do LPT dobry jest DLPortIO, nie wiem z kolei jaki wykorzystac
do RS'a.(znalazlem w sieci cport260, nrcomm ) W związku z tym mam pytanie
jakiego Wy uzywacie do takich prostych aplikacji? Zalezy mi równiez na
tym zeby był prosty w uzyciu ponieważ dopiero zaczynam moją przygodę w
builderem. Moze ktos zna jakis link, gdzie mógłbym poczytac i jak najwiecej
sie dowiedzec o pisaniu tego typu aplikacji?

pozdrawiam

Łukasz R.



Poprzedni Następny
Wiadomość
Spis treści
From: "Bielsky" <bielsky_at_nospam_poczta.onet.pl>
Subject: Re: port szeregowy w BC++Builder
Date: Mon, 25 Mar 2002 08:26:39 +0100


builderem. Moze ktos zna jakis link, gdzie mógłbym poczytac i jak
najwiecej
sie dowiedzec o pisaniu tego typu aplikacji?

Swego czasu używałem comdrv32. To było napisane w delphi, ale bez problemu
kompilowało się pod C++ B.
Była do tego dobra aplikacja testowa, niestety tylko w delphi.
O ile może się przydać, mogę jutro przesłać.



Poprzedni Następny
Wiadomość
Spis treści
From: "Bielsky" <bielsky_at_nospam_poczta.onet.pl>
Subject: Re: port szeregowy w BC++Builder
Date: Mon, 25 Mar 2002 08:29:11 +0100


Ps. Jest to pod adresem:
http://delphi.icm.edu.pl/ftp/d20free/comdrv32.zip



Poprzedni Następny
Wiadomość
Spis treści
From: "Łukasz R." <rezystor_at_nospam_poczta.wp.pl>
Subject: Re: port szeregowy w BC++Builder
Date: Tue, 26 Mar 2002 00:44:41 +0100



Użytkownik "Bielsky" <bielsky_at_nospam_poczta.onet.pl> napisał w wiadomości
news:a7mja9$610$1_at_nospam_news.onet.pl...
builderem. Moze ktos zna jakis link, gdzie mógłbym poczytac i jak


dziękuję wszystkim za podpowiedzi...jak sobie nie poradzę to wiem juz do
kogo mam sie zwrócic :)


pozdrawiam

Łukasz



Poprzedni Następny
Wiadomość
Spis treści
From: Ireneusz Niemczyk <i.niemczyk_at_nospam_multispedytor.com.pl>
Subject: uwaga - =?iso-8859-2?Q?d=B3ugawe=2E=2E=2E?=
Date: Mon, 25 Mar 2002 09:49:17 +0100


Port szeregowy stosunkowo łatwo się czyta....
Zdobyć uchwyt i ustawic prosta konfigurację można np. tak:
-------------------------------------
HandleRS = CreateFile(NumerRS, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, NULL);
if (HandleRS != INVALID_HANDLE_VALUE)
{
RS232.DCBlength = sizeof(RS232);
RS232.BaudRate = CBR_9600;
RS232.Parity = NOPARITY;
RS232.StopBits = ONESTOPBIT;
RS232.ByteSize = 8;
RS232.fDtrControl = DTR_CONTROL_DISABLE; //brak kontroli
RS232.fParity = FALSE; //bez sprawdzania
RS232.fBinary = TRUE; //tryb binarny
SetCommState(HandleRS,&RS232);
}
else
{
MessageBox(NULL,"Brak portu lub jest on obecnie używany.","Błąd
RS232",MB_OK);
}
------------------------------------
Zamykanie może wyglądać tak:

if (HandleRS == 0 || (HandleRS == INVALID_HANDLE_VALUE))
MessageBox(NULL,"Wystąpił błąd przy zamykaniu portu!!!","Błąd RS232",MB_OK);
else
{
CloseHandle(HandleRS);
}

--------------------------------------
Samo zaś czytanie np. tak:
PurgeComm(HandleRS,PURGE_RXCLEAR); //bez smieci
poczatkowych...

WskaznikO = 0;
WskaznikN = 0;
COMSTAT Stat;
DWORD Error;
DWORD Indeks = 0;
DWORD Odebrane = 0;
DWORD Doodebrania = 0;
Timer1->Enabled = TRUE;
//ustalamy max. czas transmisji paczki danych.
while ((Indeks < 2160) & (Timer1->Enabled == TRUE))
{
ClearCommError(HandleRS,&Error,&Stat);
if (Stat.cbInQue > 0)
{
if (Stat.cbInQue < 63) Doodebrania = Stat.cbInQue;
else Doodebrania = 63;
ReadFile(HandleRS, &BuforN, Doodebrania, &Odebrane, NULL);
for(WskaznikN=0;WskaznikN<Odebrane;WskaznikN++)
BuforO[Indeks++] = BuforN[WskaznikN];
}
Application->ProcessMessages(); //na
potrzeby timera ;-)
}
if (Timer1->Enabled == FALSE)
{
for (WskaznikO=0;WskaznikO<3000;WskaznikO++) BuforO[WskaznikO]=NULL;
PurgeComm(HandleRS,PURGE_TXCLEAR);
PurgeComm(HandleRS,PURGE_RXCLEAR);
WskaznikO = WskaznikN = 0;
MessageBox(NULL,"Upłynął czas oczekiwania na transmisję danych!!!","Błąd
RS232",MB_OK);
return;
}

Gdzie:
DCB RS232; //struktura portu
LPCTSTR NumerRS = "COM2"; //nazwa wybranego portu;
HANDLE HandleRS; //uchwyt do portu

Trochę to chaotyczne - wycięte z trochę bardziej rozbudowanej apikacji. Może Ci
to pomoże w rozgryzieniu RS-a.
Generalnie z czytaniem jest ten kłopot - że nie wiesz czy już odebrałeś
wszystko, czy jeszcze coś bedzie. Nie możesz założyć że dane będą stale
napływały i czytać np: 20k na raz - bo pierwsze rozłączenie kabelka zwiesi Ci
program. nie można tez czytać po jednym znaczku - bo może on i tak nigdy nie
nadejść, a jak dostaniesz _szybką paczkę_ to możesz pogubic dane ;-))
Rozwiązaniem jest struktura COMSTAT (tutaj reprezentowana przez Stat), a w niej
Stat.cbInQue mówiąca o tym, czy wogóle mamy coś do odbioru z bufora RS-a i ile
tego jest - jeśli coś tam mamy, to czytamy port, ale uważajac na wielkości
zadeklarowanych przez siebie buforów do tego celu - inaczej bedzie zamazywany
jakiś RAM ;-) to tak z grubsza - reszta już łatwo (w twoim przypadku trzeba to
będzie lekko pozmieniać).

--
PZD, Irek.N.
ps. Acha - timer przerywa pętlę, gdyby transmisja nie zmieściła się w czasie -
inaczej mógł być czekać na dane w nieskończoność.


Poprzedni Następny
Wiadomość
Spis treści
From: "Neo" <matrix_at_nospam_terramail.pl>
Subject: Re: port szeregowy w BC++Builder
Date: Mon, 25 Mar 2002 10:24:55 +0100


Ja używam cport260 pod Xp i w2k. Działa bez problemu .
Pozdrawiam.

"Łukasz R." <rezystor_at_nospam_poczta.wp.pl> wrote in message
news:a7ln2k$19b$1_at_nospam_flis.man.torun.pl...
witam

zrobilem termometr na 89c51 i DS1624 i chciałbym napisac prostą aplikację
w
BC++B , ktora na początek odbierała by temperaturę po RS, uzupełniała ją
o
datę i godzinę i zapisywała do pliku, problem w tym ze program ma działac
w
win9x,2000,NT,XP, co oznacza ze muszę wykorzystac najlepiej jakis
komponent
do RS, wiem ze do LPT dobry jest DLPortIO, nie wiem z kolei jaki
wykorzystac
do RS'a.(znalazlem w sieci cport260, nrcomm ) W związku z tym mam pytanie
jakiego Wy uzywacie do takich prostych aplikacji? Zalezy mi równiez
na
tym zeby był prosty w uzyciu ponieważ dopiero zaczynam moją przygodę w
builderem. Moze ktos zna jakis link, gdzie mógłbym poczytac i jak
najwiecej
sie dowiedzec o pisaniu tego typu aplikacji?

pozdrawiam

Łukasz R.





Poprzedni Następny
Wiadomość
Spis treści
From: "Marcin" <mkowalcz_at_nospam_elka.pw.edu.pl>
Subject: Re: port szeregowy w BC++Builder
Date: Mon, 25 Mar 2002 10:50:12 +0100


Witam

Do obslugi STANDARDOWEJ portu szeregowego pod Win 9x/NT/2k/XP nie potrzeba
zadnych dodatkowych bibliotek w stylu DLLPortIO. Wystarcza klasyczne
wywolania systemowe opisane w MSDN:

hPort = CreateFile("COM1",.......);
WriteFile(hPort,....);
ReadFile(hPort,....);
CloseHandle(hPort);

a ponadto jeszcze zbiór funkcji w PlatformSDK->BaseServices->Files and
I/O->Communication

GetCommState ...itp

Pozdrawiam
Marcin



zrobilem termometr na 89c51 i DS1624 i chciałbym napisac prostą aplikację
w
BC++B , ktora na początek odbierała by temperaturę po RS, uzupełniała ją
o
datę i godzinę i zapisywała do pliku, problem w tym ze program ma działac
w
win9x,2000,NT,XP, co oznacza ze muszę wykorzystac najlepiej jakis
komponent
do RS, wiem ze do LPT dobry jest DLPortIO, nie wiem z kolei jaki
wykorzystac
do RS'a.(znalazlem w sieci cport260, nrcomm ) W związku z tym mam pytanie
jakiego Wy uzywacie do takich prostych aplikacji? Zalezy mi równiez
na
tym zeby był prosty w uzyciu ponieważ dopiero zaczynam moją przygodę w
builderem. Moze ktos zna jakis link, gdzie mógłbym poczytac i jak
najwiecej
sie dowiedzec o pisaniu tego typu aplikacji?

pozdrawiam

Łukasz R.





Poprzedni Następny
Wiadomość
Spis treści
From: Grzegorz Redlarski <gred_at_nospam_kki.net.pl>
Subject: Re: port szeregowy w BC++Builder
Date: Tue, 26 Mar 2002 23:57:03 +0100


Mon, 25 Mar 2002 00:21:01 +0100 "Łukasz R." <rezystor_at_nospam_poczta.wp.pl>
napisal:

BC++B , ktora na początek odbierała by temperaturę po RS, uzupełniała ją o

Kiedyś wysłałem tu taką odpowiedź:
Subject: Re: jak wyciagnac z RS232 115kbs
Date: Fri, 19 Oct 2001 01:15:07 +0200
Message-ID: <5j0sstgm1u65po68avqgv35jl4t32am16p_at_nospam_news.tpi.pl>

Jesli to faktycznie pod windę, to polecam help win32api, a w nim
poszukać: DCB, CreateFile(), GetCommState(), SetCommState(),
ReadFile(), WriteFile(), CloseHandle() itd.

Gorąco polecam też: Allen Denver, Serial Communications in Win32
http://msdn.microsoft.com/library/techart/msdn_serial.htm

I jeszcze:
http://www.temporaldoorway.com/programming/cbuilder/windowsapi/index.htm
http://www.ep.com.pl/ftp/porty/page_32.html

gr


Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: port szeregowy w BC++Builder
Date: Thu, 28 Mar 2002 01:00:49 +0100


Łukasz R. wrote:

zrobilem termometr na 89c51 i DS1624 i chciałbym napisac prostą aplikację w
BC++B , ktora na początek odbierała by temperaturę po RS, uzupełniała ją o

datę i godzinę i zapisywała do pliku, problem w tym ze program ma działac w
win9x,2000,NT,XP, co oznacza ze muszę wykorzystac najlepiej jakis komponent


Do obslugi portu szeregowego (nie tylko w BC++ ale i w Visual C++)
najlepiej wykorzystac standardowe funkcje Windows API. Bedziesz mial nad
wszystkim kontrole, a jak sobie juz napiszesz oddzielny modul (po co
cala kontrolke, skoro i tak jej nie widac?) to programowanie bedzie
bardzo proste. Przejrzyj helpy funkcji CreateFile, SetCommTimeout itp.

--

Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows