Hej! Seriell kommunikation är ett kapitel för sig inom datorvärlden. Det är så Tack för det uttömmande svaret!komunicera mot seriell port
Någon som har erfarenhet av att komunicera mot seriell port i VB?
Synpunkter, fällor och fel?
/BoSv: komunicera mot seriell port
många olika saker som kan behandlas. Protokoll, Gränssnitt, kablar
polling och interrupt med mera.
Jag skall försöka klara ut några begrepp.
Vi börjar med kablar.
En kabel kan i princip vara "korsad" eller "rak", när skall man använda
vilken kabel? För att svara på detta måste vi definera två olika typer
av kommunicerande utrustning.
1. DTE - Data Terminal Equipment
2. DCE - Data Communication Equipment
generellt kan man säga att en DCE är en intelligent enhet (master)
detta är ofta en dator, en PLC eller annan utrustning som kan agera master.
Det vill säga styra, bestämma och prata ut på ledningen.
En DTE är en dum (SLAVE) enhet. En seriell skrivare är ett bra exempel
på en DTE. En RS-232 till RS-485 Converter är ett annat. En DTE pratar
inte den bara lyssnar.
På baksidan av din dator har du förmodligen en 9-polig D-Sub kontakt.
Detta är din seriell port. Det finns även 25-poliga D-Sub kontakter, och
från första början var det tänkt att en sådan port skulle innehålla två kanaler.
Så är det emellertid inte i praxis idag, varför 9-poliga är mest förekommande.
Nåja kontakten på baksidan av din dator är en HANE. Hittar du en
enhet med seriellt gränssnitt och denna har en hona som kontaktdon är
det en DTE.
Följdaktligen kan man generellt säga att för att koppla ihop en DTE
med en DCE behöver man en kabel som har en hona i ena sidan (för att
koppla i datorn) och en hane i andra (för att koppla i DTE:n).
Sådana kablar är raka därför att DTE:n i princip bara tar emot datat från
DCE:n och gör nåt med det eller skickar det vidare.
Då man kopplar ihop två datorer har vi två hankontakter i varje DCE (Dator)
Här krävs alltså en kontakt med två honor. Dessa kablar är korskopplade.
Detta krävs för att enheterna skall kunna utbyta information med varandra.
Det hela är mycket enkelt och du kan jämföra det med två telefonlurar och
hur det funkar när du pratar i telefonen. Det du säger i din mikrofon måste
komma ut i den andres hörlur, och tvärtom. Detta är alltså en korskoppling
som måste till för att du som är en DCE och din kompis i andra ändan som
också är en DCE skall kunna prata med varanrda.
I en seriell kabel (RS-232) behövs minimalt 3 anslutningar göras.
Det är pinnarna 2,3 och 5 som kopplas.
2 är RD (Receive Data)
3 är TD (Transmit Data)
5 är GND (signaljord)
I en rak kopplas pinne 2 mot pinne 2, pinne 3 mot pinne 3 och pinne 5 mot pinne 5.
I en korsad kabel kopplas 2 mot 3, och 3 mot 2, 5 kopplas däremot mot 5.
Om maskinvaran kräver handskakning måste ytterligare pinnar kopplas
men detta tas inte upp här.
===================================================
Det finns även RS-485 som är vanlig i industri sammanhang eftersom
man kan ha mycket längre kabellängder än för RS-232. Med 485 kan
man ha ända upp till 1.2 Km. Fast för RS-232 gäller bara ca 1.8 meter
om man har snabbaste hastigheten, men det kan i gynsamma fall funka
i upp till 50 meter.
===================================================
Det enklaste sättet att skriva ett program på som kommunicerar med
andra enheter är med så kallad polling.
Det vill säga att man hela tidern med jämna mellanrum kollar om det
finns något data på porten att läsa. Om det gör det så läser man datat
och behandlar det.
Detta är ganska resurskrävande. Då kan man använda interrupt. Interrupt
eller avbrott som det heter på svenska fungerar så att en flagga sätts
i CPU när det finns data på porten. Då kan man ta hand om datat.
Detta sparar en massa resurser att hela tiden exekvera kod för att kontrollera
om det finns data på porten eller inte.
I Visual Basic, kan man använda event för att ta hand om data när ett
visst antal tecken kommit till porten. Jag skriver porten här, men det
riktiga vore att skriva bufferten för alla tecken som kommer in hamnar
i en buffert.
Genom att sätta en parameter kan man alltså få VB att avfyra ett event
då detta antalet tecken finns på porten.
===================================================
Sedan finns det ett antal standardiserade protokoll som brukar användas när man snackar seriellt. Se RFC 1055 SLIP-protokoll. SLIP står för
Serial Line IP.
Detta protokoll är speciellt användbart då du skall använda avbrotts-metoden
eller eventet i VB för att avgöra när du har fått ett helt datapaket.
Kort funkar SLIP-protokollet så att det tar ditt data du skall skicka
lägger på &HC0 först och sist (hexadecimala värdet C0) samt en checksumma.
På detta vis kan man alltid hålla reda på hela paket med data, för de börjar
ju med C0 och slutar med C0.
Det är enklast att se det data du skickar på porten som tecken ur
den utökade ASC-tabellen. 00-255 eller hex 00-FF. men C0 är reserverat
för SLIP-framen enligt protokollet.
Då C0 måste ingå som data så "bytestuffar" man och slänger in ett "ESC" före
På det viset vet SLIP-algoritmen att efterföljande data är data och inte slutet på en slipframe.
checksumman läggs på och med hjälp av den kan man kontrollera att datat
man fått inte korrupterats. Checksumman beräknas på enklaste sättet:
Summan av alla ingående teckens ascii värde modulus 256.
===================================================
Jag jobbar med moduler kallade "puckar" för att sätta eller läsa digitala in
och utgångar. Såväl som analoga eller temperaturmoduler.
Ett enkelt program för att läsa av statusen på en modul som sitter på adress
3 i ett RS-485 nätverk skulle se ut så här.
MSComm1.portopen = True
MSComm1.output = "@03" & VbCr
'// kod för att vänta några millisekunder så¨svaret hinner komma.
data = MSComm1.Input
Ungefär så enkelt är det. (Observera att metoden ovan använder polling).
Nåja Lycka till.
(Känner att jag måste skriva en kurs om detta till pelle soft)
/[peter.h]Sv: komunicera mot seriell port
Jag har skrivit diverse komunikationsprogramvaror i Quick Basic så
elementa kan jag. Jag har bara för mig att det var lite strul under
Vb i alla fal de tidigare versionerna. Jag använder VB6 just nu. Så
jag kanske kan tolka svaret att det inte är några problem?
/Bo