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

julek_g
-
-
Posty:3
Rejestracja:13 paź 2003, o 16:40
Lokalizacja:gliwice
Program w c++ wysyłający na port LPT bajt danych

Postautor: julek_g » 6 lis 2003, o 12:01

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.

zysiu
-
-
Posty:19
Rejestracja:14 lis 2003, o 01:38
Lokalizacja:Bydgoszcz, obecnie Koszalin
Kontaktowanie:

Postautor: zysiu » 5 gru 2003, o 21:27

pod dos, czy winda? jesli winda, to skorzystaj z API, tam sa funkcje odwolywujace sie do portow w kompie.

Baranek
-
-
Posty:4
Rejestracja:6 gru 2003, o 23:20
Lokalizacja:Koszalin
Kontaktowanie:

Postautor: Baranek » 7 gru 2003, o 00:00

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

Baranek
-
-
Posty:4
Rejestracja:6 gru 2003, o 23:20
Lokalizacja:Koszalin
Kontaktowanie:

Postautor: Baranek » 28 gru 2003, o 13:01

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

Kod: Zaznacz cały

extern PACKAGE TCommPort *Port;
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.

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; } }
W ten sposób załatwiliśmy parametry portu. Teraz przesyłanie danych. Masz do dyspozycji funkcje:

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

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

flaymen
-
-
Posty:2
Rejestracja:17 lut 2004, o 21:54

Postautor: flaymen » 17 lut 2004, o 21:59

hmm a jak bym chcial wysylac na port lpt to jak to napisac?? a i jak ktos bylby tak dobr i zaprezentowal mi przykladowa funkcje inicjujaca wyswietlacz 3X24 na sterowniku HD44780.

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości