Üdvözöllek! Ebben a cikkben részletesen bemutatom, hogyan olvashatsz adatot a soros portról a legendás Borland C++ segítségével. A UART (Universal Asynchronous Receiver/Transmitter) az egyik leggyakrabban használt kommunikációs protokoll az elektronikai eszközök és a számítógép között. Gondolj csak a régi modemes időkre, vagy a mai napig használt mikrokontrolleres alkalmazásokra. Ez a tudás nem csak elméleti, hanem gyakorlati is, hiszen számos ipari és hobbi projekt alapját képezi.
Mi is az a UART és miért fontos? ⚙️
A UART, ahogy már említettem, egy aszinkron soros kommunikációs protokoll. Az „aszinkron” azt jelenti, hogy nincs közös órajel a küldő és a fogadó között. Ehelyett a kommunikációt start- és stop-bitek szinkronizálják. Ez egyszerűbbé teszi a hardver megvalósítását, de fontos a helyes adatátviteli sebesség (baud rate) beállítása.
Miért fontos? Mert rengeteg eszköz használja! Mikrokontrollerek (Arduino, ESP32), GPS modulok, Bluetooth modulok, sőt, régebbi nyomtatók és modemek is. Ha ilyen eszközökkel szeretnél kommunikálni a számítógépedről, akkor a soros port (ami a UART interfészt valósítja meg a PC oldalon) a te barátod lesz.
A Borland C++ Környezet Beállítása 🛠️
A Borland C++ egy klasszikus fejlesztői környezet, ami sokak számára a C++ programozás kezdetét jelentette. Bár ma már vannak modernebb alternatívák, sokan még mindig használják egyszerűsége és sebessége miatt. Ha még nincs telepítve, keress rá a neten egy ingyenesen letölthető verzióra. Fontos, hogy a DOSBox-ra is szükséged lehet a futtatáshoz.
Miután telepítetted a Borland C++-t, indítsd el. Egy üres projektet hozz létre, és mentsd el valamilyen néven (pl. uart_reader.cpp
).
A Kód: Lépésről Lépésre 📜
Most jön a lényeg: a kód! Bemutatom a teljes kódot, majd részletesen elmagyarázom a részeit.
#include <stdio.h>
#include <dos.h>
#define COM1 0x3F8 // COM1 port címe
//UART port inicializálása
void init_uart(int port, int baudrate) {
unsigned int divisor = 115200 / baudrate; //115200 a maximális órajel
outportb(port + 3, 0x80); // DLAB beállítása (Divisor Latch Access Bit)
outportb(port + 0, divisor & 0xFF); // Alsó bájt
outportb(port + 1, divisor >> 8); // Felső bájt
outportb(port + 3, 0x03); // 8-bit, no parity, 1 stop bit
outportb(port + 1, 0x00); // Interrupt tiltása (egyszerűség kedvéért)
}
//Adat fogadása a UART portról
int receive_byte(int port) {
while ((inportb(port + 5) & 0x01) == 0); // Várakozás, amíg adat érkezik
return inportb(port + 0); // Adat beolvasása
}
int main() {
int port = COM1;
int baudrate = 9600;
init_uart(port, baudrate);
printf("Soros port inicializalva %d baud sebesseggel.n", baudrate);
printf("Varakozas adatra...n");
while (1) {
int data = receive_byte(port);
printf("Erkezett adat: 0x%X (%c)n", data, (char)data); //Hexadecimális és karakterként is kiírjuk
}
return 0;
}
A Kód Magyarázata:
- Include fájlok: A
stdio.h
a standard input/output műveletekhez (pl.printf
), ados.h
pedig a DOS-specifikus függvényekhez (inportb
,outportb
) szükséges. - COM port definíció: A
#define COM1 0x3F8
megadja a COM1 port címét a memóriában. Ez a cím alapértelmezett, de más portoknak eltérő címük lehet. init_uart()
függvény: Ez a függvény inicializálja a UART portot.- Kiszámolja az osztót (divisor) a kívánt baud rate alapján. A baud rate az adatátviteli sebességet jelenti (bit/másodperc).
- Beállítja a DLAB (Divisor Latch Access Bit) bitet a
port + 3
címen, hogy hozzáférhessen az osztó regisztereihez. - Beírja az osztó alsó és felső bájtjait a megfelelő portokra (
port + 0
ésport + 1
). - Beállítja az adatformátumot (8-bit, no parity, 1 stop bit) a
port + 3
címen. - Letiltja az interruptokat a
port + 1
címen (egyszerűség kedvéért).
receive_byte()
függvény: Ez a függvény fogadja a byte-ot a UART portról.- Várakozik, amíg adat érkezik. Ezt a
inportb(port + 5) & 0x01
kifejezéssel ellenőrzi. Aport + 5
címen lévő regiszter első bitje (bit 0) jelzi, hogy van-e adat a fogadó pufferben. - Ha adat érkezett, beolvassa azt a
port + 0
címről.
- Várakozik, amíg adat érkezik. Ezt a
main()
függvény: Ez a főprogram.- Beállítja a portot (COM1) és a baud rate-et (9600).
- Meghívja az
init_uart()
függvényt a port inicializálására. - Egy végtelen ciklusban folyamatosan fogadja az adatokat a
receive_byte()
függvénnyel, és kiírja azokat a konzolra hexadecimális és karakter formában is.
Fordítás és Futtatás 🚀
A Borland C++-ban nyomd meg a Ctrl+F9
billentyűkombinációt a kód fordításához és futtatásához. Ha minden jól megy, a program elindul, és várja az adatokat a soros porton.
Tesztelés 🧪
Ahhoz, hogy teszteld a programot, szükséged lesz egy másik eszközre, ami képes adatot küldeni a soros porton. Ez lehet egy másik számítógép, egy mikrokontroller (pl. Arduino), vagy egy speciális soros port teszter program. Be kell állítanod mindkét oldalon ugyanazt a baud rate-et, adatbit számot, paritást és stop bit számot.
Ha például egy Arduino-val teszteled, a következő kódot használhatod az adatok küldésére:
void setup() {
Serial.begin(9600); //Beállítjuk a soros portot 9600 baud-ra
}
void loop() {
Serial.println("Hello from Arduino!");
delay(1000); //Várunk 1 másodpercet
}
Ez a kód másodpercenként elküldi a „Hello from Arduino!” szöveget a soros porton.
Hibaelhárítás 🐛
Ha a program nem működik megfelelően, néhány dologra figyelj:
- Ellenőrizd, hogy a soros port helyesen van-e beállítva (baud rate, adatbit, paritás, stop bit).
- Ellenőrizd, hogy a kábel megfelelően van-e csatlakoztatva.
- Ellenőrizd, hogy a másik eszköz helyesen küldi-e az adatokat.
- Ha DOSBox-ot használsz, ellenőrizd, hogy a soros port helyesen van-e konfigurálva a DOSBox beállításaiban.
„Régi, de megbízható! A Borland C++ és a soros port kombinációja még mindig hasznos lehet számos projektben. Ne félj kísérletezni!”
Vélemény 💡
Saját tapasztalatom szerint a Borland C++ egy nagyszerű eszköz lehet a soros port kommunikáció tanulásához. Egyszerűsége és a DOS-közeli programozás lehetővé teszi, hogy mélyebben megértsük a hardver és a szoftver közötti kapcsolatot. Azonban fontos megjegyezni, hogy a Borland C++ már egy elavult technológia, ezért a modern projektekhez érdemesebb modernebb eszközöket használni. Például, a Visual Studio vagy a Qt Creator sokkal több funkciót és kényelmet nyújtanak, valamint támogatják a modern C++ szabványokat. Mindazonáltal, a Borland C++ által szerzett tudás átültethető a modernebb környezetekbe is.
Remélem, ez a cikk segített neked megérteni, hogyan olvashatsz adatot a soros portról a Borland C++ segítségével. Sok sikert a projekteidhez!