Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięProgram w c++ wysyłający na port LPT bajt danych
Moderatorzy:Jacek Bogusz, Moderatorzy
chialbym napisac w c++ program wystawiajacy na lpt bajt danych ,ale za bardzo nei wiem jak sie za to zabrac czy moglybm prosci o jakies wskazowki?bede wdzieczny za kazda pomoc.
Ostatnio zmieniony 27 mar 2007, o 13:50 przez julek_g, łącznie zmieniany 1 raz.
Temat jaki poruszyłeś jest naprawdę dość obszerny. Zysiu ma tutaj rację, pod każdym systemem komunikacja ze światem zewnętrznym przebiega inaczej. Postaram Ci się jednak nieco pomóc.
Jeśli zamierzasz obsługiwać porty pod dosem to masz trzy wyjścia:
1) dołącz conio.h i wówczas masz funkcje
int inp(unsigned port)
unsigned inpw(unsigned port)
int outp(unsigned port, int data)
unsigned outpw(unsigned port, unsigned data)
inp i outp operują na bajtach (byte), a inpw i outpw na słowach (word), co oznacza, że młodszy bajt jest pobierany/wysyłany na adres port, a starszy na port + 1
2) dołącz dos.h a otrzymasz:
unsigned inport(unsigned port)
unsigned char inportb(unsigned port)
void outport(unsigned port, unsigned data)
void outportb(unsigned port, unsigned char data)
Funkcje z literką b na końcu obsługują bajty, a bez "b" słowa. Jeśli pobierasz daną 16 bitową to młodszy bajt jest wczytywany z port, a starszy z port + 2. Jeśli wysyłasz 16 bitową daną, młodszy bajt automatyczne idzie na port, a starszy na port + 1
3) Wykorzystaj strumienie. Ten temat jest dość sporawy, ale jeśli będziesz chciał, to mogę Ci go szczegółowo opisać (najlepiej na forum, niech inni też skorzystają)
Pod Win95 i Win98 powższe metody też zadziałają. W tym wypadku 1) i 2) nie są eleganckimi rozwiązaniami, ale 3) jest jak najbardziej profesjonalnym rozwiązaniem.
Najlepiej wykorzystać funkcje systemowe windy, bo wówczas program zadziała też w Win2000 i WinXP. Mam gotową klasę opisującą transmiję przez port szeregowy com. Jeśli będziesz zainteresowany, wyślę Ci mailem
Jeśli zamierzasz obsługiwać porty pod dosem to masz trzy wyjścia:
1) dołącz conio.h i wówczas masz funkcje
int inp(unsigned port)
unsigned inpw(unsigned port)
int outp(unsigned port, int data)
unsigned outpw(unsigned port, unsigned data)
inp i outp operują na bajtach (byte), a inpw i outpw na słowach (word), co oznacza, że młodszy bajt jest pobierany/wysyłany na adres port, a starszy na port + 1
2) dołącz dos.h a otrzymasz:
unsigned inport(unsigned port)
unsigned char inportb(unsigned port)
void outport(unsigned port, unsigned data)
void outportb(unsigned port, unsigned char data)
Funkcje z literką b na końcu obsługują bajty, a bez "b" słowa. Jeśli pobierasz daną 16 bitową to młodszy bajt jest wczytywany z port, a starszy z port + 2. Jeśli wysyłasz 16 bitową daną, młodszy bajt automatyczne idzie na port, a starszy na port + 1
3) Wykorzystaj strumienie. Ten temat jest dość sporawy, ale jeśli będziesz chciał, to mogę Ci go szczegółowo opisać (najlepiej na forum, niech inni też skorzystają)
Pod Win95 i Win98 powższe metody też zadziałają. W tym wypadku 1) i 2) nie są eleganckimi rozwiązaniami, ale 3) jest jak najbardziej profesjonalnym rozwiązaniem.
Najlepiej wykorzystać funkcje systemowe windy, bo wówczas program zadziała też w Win2000 i WinXP. Mam gotową klasę opisującą transmiję przez port szeregowy com. Jeśli będziesz zainteresowany, wyślę Ci mailem
Witam!
Po dłuższej przerwie znów jestem online. Dostałem zapytanie mailem o sterowanie portem COM i uznałem, że warto odpowiedzieć w tym miejscu, jako że pytanie dotyczy tematu sterowania portów z poziomu języka c++. Może julka_g takie rozwiązanie też zainteresuje?
Sterowanie portem COM w Borland Builder
Zagadnienie jest o tyle proste, że jakiś czas temu znalazłem w sieci klasę obsługującą port COM. Jest ona freeware do zastosowań niekomercyjnych.
Tyle tytułem wstępu, bierzmy się do roboty.
Pliki klasy wysyłam mailem zainteresowanym, ponieważ nijak nie dały się dołączyć do tego postu, sorry. Wszystkie funkcje tej klasy zostały stworzone z myślą o obsludze wyjątków, ja jednak zastosowałem najprostrze rozwiązanie, które od prawie dwóch lat owocuje bezawaryjną obsługą wagi przemysłowej. Ot taka ciekawostka
Do pliku nagłówkowego dodajmy co pozwoli nam wykorzystać wskaźnik do klasy w innym pliku projektu (tak jest u mnie)
Teraz przejdźmy do głównej części projektu. Przede wszystkim trzeba ustawić parametry portu. Ja wczytuję te dane z pliku, ponieważ mój program umożliwia swobodną konfigurację portu, ale moża przecież ograniczyć to do ustawienia pożądanych wartości.
W ten sposób załatwiliśmy parametry portu. Teraz przesyłanie danych. Masz do dyspozycji funkcje:
Podejrzewam, że do wysyłania danych najbardziej użyteczna będzie funkcjia WriteString, dzieki której wyślesz sobie zestaw danych na przykład z przygotowanej wcześniej tablicy znakowej. Zwróć też uwagę na PutByte.
Poniżej przedstawiam prostę fukcję odczytującą dane z wagi
Na pewno nie wyczerpuje to całego tematu więc jeśli ktoś będzie miał jakieś pytania to z chęcią na nie odpowiem. Nie obrażajcie się, panowie programiści, że za dokładnie wszystko tłumaczę, chciałbym, żeby Ci, którzy dopiero zaczynają też mogli zrozumieć mój kod.
Po dłuższej przerwie znów jestem online. Dostałem zapytanie mailem o sterowanie portem COM i uznałem, że warto odpowiedzieć w tym miejscu, jako że pytanie dotyczy tematu sterowania portów z poziomu języka c++. Może julka_g takie rozwiązanie też zainteresuje?
Sterowanie portem COM w Borland Builder
Zagadnienie jest o tyle proste, że jakiś czas temu znalazłem w sieci klasę obsługującą port COM. Jest ona freeware do zastosowań niekomercyjnych.
Tyle tytułem wstępu, bierzmy się do roboty.
Pliki klasy wysyłam mailem zainteresowanym, ponieważ nijak nie dały się dołączyć do tego postu, sorry. Wszystkie funkcje tej klasy zostały stworzone z myślą o obsludze wyjątków, ja jednak zastosowałem najprostrze rozwiązanie, które od prawie dwóch lat owocuje bezawaryjną obsługą wagi przemysłowej. Ot taka ciekawostka
Do pliku nagłówkowego dodajmy
Kod: Zaznacz cały
extern PACKAGE TCommPort *Port;
Teraz przejdźmy do głównej części projektu. Przede wszystkim trzeba ustawić parametry portu. Ja wczytuję te dane z pliku, ponieważ mój program umożliwia swobodną konfigurację portu, ale moża przecież ograniczyć to do ustawienia pożądanych wartości.
Kod: Zaznacz cały
int FileHandle, FileLength;
//kolejno: pseudowskaźnik do pliku, długość pliku
unsigned char Ports, BaudRate, ByteSize, StopBits, Parity;
//zmienne do przechowania parametrów portu, nazwy mówią same za
//siebie
Port = new TCommPort(); //wskaźnik już mamy, teraz go inicjalizujemy
FileHandle = FileOpen("port.db", fmOpenRead);
//otwieramy sobie plik, ja do nazwy pliku dołączam jeszcze jego
//ścieżkę, ale to jest potrzebne tylko jeśli następuje zmiana źródeł
//danych, wtedy można zgubić ścieżkę do właściwego pliku
FileLength = FileSeek(FileHandle, 0, 2);
//odczytujemy dugość pliku przez przesunięcie wskaźnika na jego
//koniec, jeśli plik nie istnieje, to długość będzie -1
if(FileLength != -1) //dość prymitywne zabezpieczenie, ale jeśli nikt
//nie grzebie w plikach programu, to nie potrzeba
//sprawdzać czy plik zawiera odpowiednią liczbę
//bajtów, jeśli chcesz to zamień to na
//FileLenght == prawidlowa_dlugosc_pliku
{
FileSeek(FileHandle, 0, 0); //wracamy ze wskaźnikiem na początek
//pliku i po kolei odczytujemy dane
FileRead(FileHandle, &Ports, 1);
FileRead(FileHandle, &BaudRate, 1);
FileRead(FileHandle, &ByteSize, 1);
FileRead(FileHandle, &StopBits, 1);
FileRead(FileHandle, &Parity, 1);
FileClose(FileHandle);
//zamykamy plik
//A poniżej ustawiamy odpowienie parametry w zależości od tego co było
//w pliku. Jeśli Ci to nie potrzebne, to wybierz sobie te nastwy, które Cię
//interesują
switch(Ports)
{
case 0: Port->SetCommPort("COM1"); break;
case 1: Port->SetCommPort("COM2"); break;
}
switch(BaudRate)
{
case 0: Port->SetBaudRate(150); break;
case 1: Port->SetBaudRate(300); break;
case 2: Port->SetBaudRate(600); break;
case 3: Port->SetBaudRate(1200); break;
case 4: Port->SetBaudRate(2400); break;
case 5: Port->SetBaudRate(4800); break;
case 6: Port->SetBaudRate(9600); break;
case 7: Port->SetBaudRate(19200); break;
}
switch(ByteSize)
{
case 0: Port->SetByteSize(7); break;
case 1: Port->SetByteSize(8); break;
}
switch(StopBits)
{
case 0: Port->SetStopBits(ONESTOPBIT); break;
case 1: Port->SetStopBits(TWOSTOPBITS); break;
}
switch(Parity)
{
case 0: Port->SetParity(EVENPARITY); break;
case 1: Port->SetParity(ODDPARITY); break;
}
}
Kod: Zaznacz cały
void WriteString(const char *outString);
void WriteBuffer(BYTE *buffer, unsigned int ByteCount);
void WriteBufferSlowly(BYTE *buffer, unsigned int ByteCount);
int ReadString(char *string, unsigned int MaxBytes);
int ReadBytes(BYTE *bytes, unsigned int byteCount);
void PutByte(BYTE value);
BYTE GetByte();
Poniżej przedstawiam prostę fukcję odczytującą dane z wagi
Kod: Zaznacz cały
double ReturnWeight()
{
register int i;
char PortTab[23], WagaTab[11];
int Error;
double Waga;
//Otwieramy i czyścimy port
Port->OpenCommPort();
Port->PurgeCommPort();
//Ta pętelka jest mi potrzebna do oczekiwania na transmisję z wagi
//Jeśli zostanie przesłana odpowiednia ilość danych (w moim przypadku 23
//bajty) wtedy pętla zakończy działanie, można też przerwać pętlę
//naciskając ESC
do
{
Error = Port->ReadString(PortTab, 23);
if(GetAsyncKeyState(VK_ESCAPE) < 0)
{
Port->CloseCommPort();
return 0;
}
}
while(Error != 23);
//Zamykamy port
Port->CloseCommPort();
//Ta pętelka wybiera odpowiednie dane. No cóż, waga przesyła 23 bajty
//z których tylko część ma dla mnie istotne znaczenie, mianowicie 10
//bajtów począwszy od 6, jak to widać poniżej
for(i = 0; i < 10; i++)
WagaTab[i] = PortTab[i + 6];
WagaTab[10] = 0;
Waga = atof(WagaTab);
return Waga;
}
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości