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
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
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.
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# |