Serieel progje geklust maar hoe werkt het

Pagina: 1
Acties:
  • 42 views sinds 30-01-2008

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 24-08 21:59

TrailBlazer

Karnemelk FTW

Topicstarter
Ok met behulp van een aantal bronnen
http://www.beyondlogic.org/serial/serial.htm
http://www.maxim-ic.com/appnotes.cfm/appnote_number/151
http://www.tldp.org/HOWTO/mini/IO-Port-Programming.html
Heb ik het volgende progje bij elkaar gejat om een aantal signalen van een RS232 poort hoog te maken/uitlezen (CTS/DSR DTR/RTS). Ik ben een noob op het gebied van C++. Maar ik heb wel programeer ervaring. Dit is de code

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>

static unsigned int MSR=0x2FE;
static unsigned int MCR=0x2FC;

int main()
{
  /* Get access to the ports */
 if (ioperm(MSR, 1, 1)) {perror("ioperm"); exit(1);}
 if (ioperm(MCR, 1, 1)) {perror("ioperm"); exit(1);}
 /* send a byet to MCR register */
 /*  outb(3, MCR);  */
 
  /* Sleep for a while (100 ms) */
  usleep(100000);
  
  /* Read from the status port (BASE+1) nd display the result */
   printf("status DTR: %d\n", inb(MCR) & 1);
   printf("status RTS: %d\n", inb(MCR) & 2);
   printf("status CTS: %d\n", inb(MSR) & 16);
   printf("status DSR: %d\n", inb(MSR) & 32);

  /* We don't need the ports anymore */
 if (ioperm(MSR, 1, 0)) {perror("ioperm"); exit(1);}
 if (ioperm(MCR, 1, 0)) {perror("ioperm"); exit(1);}

  exit(0);
}


Het enige wat ik niet begrijp in de code zijn de regels van de printf en dan specifiek de inb function. Die waardes er achter zijn de decimale waardes van het byte op dat geheugenadres. Maar wat doet de & precies. Dus wil ik weten of DSR hoog is dan vraag ik bit 5 van de MSR uit. Ik krijg als return waarde 32 als die input hoog is en 0 als die input laag is.
De uitvoer
Input op RS232 poort hoog door CTS en DTR te verbinden met DTR die al hoog was gemaakt
code:
1
2
3
4
5
Roodhaar:~/i2c# ./i2ca
status DTR: 1
status RTS: 2
status CTS: 16
status DSR: 32

input op CTS en DSR laag door ze gewoon open te laten liggen. Eigenlijk gek dat ik dan nul krijg maar ja dat zal uiteindelijk nooit voorkomen.
code:
1
2
3
4
5
6
Roodhaar:~/i2c# ./i2ca
status DTR: 1
status RTS: 2
status CTS: 0
status DSR: 0
Roodhaar:~i2c#

Verwijderd

Die & is gewoon een bitwise AND operator. Dus wat je doet met die inb() is een byte van een bepaalde poort lezen en met die '&' kijken of een bepaald bit gezet is.

32 is in binair 00010000, dus het 5e bit gezet.

inb() & 00010000 geeft dus of 00000000 terug als dat bit niet gezet is, of 00010000 terug als dat bit wel gezet is. Hetzelfde geldt voor de andere bits.

Verwijderd

Om echt een 0 of 1 te zien:

code:
1
2
3
4
   printf("status DTR: %d\n", inb(MCR) & 1) ;
   printf("status RTS: %d\n", ( inb(MCR) & 2)  >> 1 );
   printf("status CTS: %d\n", ( inb(MSR) & 16) >> 4);
   printf("status DSR: %d\n", ( inb(MSR) & 32) >> 5);

[ Voor 0% gewijzigd door Verwijderd op 21-09-2002 18:44 . Reden: Voutje ]


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 24-08 21:59

TrailBlazer

Karnemelk FTW

Topicstarter
digital_cow in jouw aanpassing wat doe je dan precies want ik zie het zo snel ff niet. (Zie eerste post mbt tot C++ noob) Het werkt wel prima.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Hoi,
P&W is een forum voor en door programmeurs die discussieren over programmeerproblemen die ze tegenkomen bij het zelf programmeren.
Er wordt hier al enig niveau van je verwacht, en er wordt ook van je verwacht dat je zelf enige moeite doet om iets te begrijpen en te leren.
Dit is hier dus niet de plek om je door iemand anders een taal te laten aanleren. Als je een programma wilt schrijven, leer dan programmeren ipv hier iedereen lastig te vallen over alle details. Ik stel voor dat je naar de boekenhandel gaat en daar een boek koopt over C++ of dat je hier op internet een tutorial zoekt.

https://fgheysels.github.io/


Dit topic is gesloten.