Ik heb op dit moment een mp3 bakje draaien dat ik aanstuur met de seriele poort.
De programmatuur die daarbij zit heb ik deels bij elkaar gescharreld en deels zelf geklust. Op dit moment is er een perl script voor een LCD display aan de parallelle poort, een bash script voor playlists etc managen, nog wat kleine scripts voor mini ondingen en een C - programma om de poort uit te lezen.
Dit is allemaal wat chaotisch, dus ik dacht ik integreer alles in 1 programma. Daarbij is mijn keuze gevallen op perl.
Het schema dat ik gebruik is van de winamp poort control uit de CME faq.

Wat ik nu in het perl script wil is iets vergelijkbaars als gebeurt in dit C-programma:
Nu probeer ik uit te vissen hoe je die ioctl's direct aan kan roepen in perl. Ik heb wel modules en zo gevonden, maar die kunnen niet omgaan met de tiocmiwait ioctl.
Ook is bij het gebruik van een module de complexiteit weer ietsje groter, ik wil graag iets maken dat werkt als stand alone pakket en zo min mogelijk afhankelijk is van modules/software van derden.
Bovendien wil ik tiocmiwait gebruiken om te wachten op een knop event, terwijl de voorbeelden die op internet rondgaan allemaal gebruik maken van een loop die keihard eens in de zoveel tijd afgelopen wordt.
Na veel klooien heb ik het volgende script in elkaar geklust:
Dit script blijft echter niet hangen op de regel met tiocmiwait, bovendien geeft hij direct aan dat alle lijnen hoog zijn, terwijl dat niet het geval is.
Ik heb veel geprobeerd te zoeken, maar ik heb nergens kunnen vinden wat ik precies aan het doen ben en al helemaal niet wat er fout gaat.
Het grootste gat in mijn kennis is hoe ik met ioctl's direct in perl de seriele poort aan kan roepen. De documentatie is hierover niet erg duidelijk en ik heb er ook weinig voorbeelden van kunnen vinden.
De programmatuur die daarbij zit heb ik deels bij elkaar gescharreld en deels zelf geklust. Op dit moment is er een perl script voor een LCD display aan de parallelle poort, een bash script voor playlists etc managen, nog wat kleine scripts voor mini ondingen en een C - programma om de poort uit te lezen.
Dit is allemaal wat chaotisch, dus ik dacht ik integreer alles in 1 programma. Daarbij is mijn keuze gevallen op perl.
Het schema dat ik gebruik is van de winamp poort control uit de CME faq.

Wat ik nu in het perl script wil is iets vergelijkbaars als gebeurt in dit C-programma:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| #include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
int main(int argc, char **argv)
{
int fd;
int status, button;
unsigned int serial;
fd = open(argc == 2 ? argv[1] : "/dev/ttyS0", O_RDONLY|O_NONBLOCK|O_NOCTTY);
if (fd < 0) {
perror("Cannot open serial device");
exit(1);
}
while (1) {
ioctl(fd, TIOCMIWAIT, TIOCM_RNG|TIOCM_CTS|TIOCM_DSR|TIOCM_CD);
status = ioctl (fd, TIOCMGET, &serial);
if (status != 0) {
perror ("TIOCMGET failed");
continue;
}
button = 0;
if (serial & TIOCM_CD) {
button |= 1;
}
if (serial & TIOCM_DSR) {
button |= 2;
}
if (serial & TIOCM_CTS) {
button |= 4;
}
if (serial & TIOCM_RI) {
button |= 8;
}
if (button) {
printf("Button %d pressed\n", button);
}
else {
printf("Button released\n");
}
}
return 0;
} |
Nu probeer ik uit te vissen hoe je die ioctl's direct aan kan roepen in perl. Ik heb wel modules en zo gevonden, maar die kunnen niet omgaan met de tiocmiwait ioctl.
Ook is bij het gebruik van een module de complexiteit weer ietsje groter, ik wil graag iets maken dat werkt als stand alone pakket en zo min mogelijk afhankelijk is van modules/software van derden.
Bovendien wil ik tiocmiwait gebruiken om te wachten op een knop event, terwijl de voorbeelden die op internet rondgaan allemaal gebruik maken van een loop die keihard eens in de zoveel tijd afgelopen wordt.
Na veel klooien heb ik het volgende script in elkaar geklust:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
| printf "Gebruik Variabelen \n";
use Fcntl;
use POSIX qw(:termios_h);
use IO::Handle;
require 'sys/ioctl.ph'; # Using this for TIOCM* stuff
use Getopt::Std;
printf "Maak variabelen\n";
my ($tty_dev_name_in);
my ($button);
my ($status);
my ($flags);
my ($CD);
my ($DSR);
my ($CTS);
my ($RI);
printf "Vul variabelen in\n";
$tty_dev_name_in = "/dev/ttyS0";
$CD = 0;
$DSR = 0;
$CTS = 0;
$RI = 0;
printf "Poort openen \n";
sysopen(TTY_IN, $tty_dev_name_in, O_RDWR) ||
die ("Can't open tty_in '$tty_dev_name_in' - error : $!");
$status = ioctl (FILE, &TIOCMSET, &TIOCM_DTR);
printf "Wachten op knop event\n";
while (1){
$status = ioctl (FILE, &TIOCMIWAIT, TIOCM_RI|&TIOCM_CTS|&TIOCM_DSR|&TIOCM_CD);
if ($status != 0) {
printf "TIOCMGET failed\n";
}
$button = 0;
$CD = 0;
$DSR = 0;
$CTS = 0;
$RI = 0;
if (FILE, &TIOCMGET, &TIOCM_CD) {
$CD = 1;
}
if (FILE, &TIOCMGET, &TIOCM_DSR) {
$DSR = 2;
}
if (FILE, &TIOCMGET, &TIOCM_CTS) {
$CTS = 4;
}
if (FILE, &TIOCMGET, &TIOCM_RI) {
$RI = 8;
}
if ($button) {
printf("Button %d pressed\n", $button);
}
else {
printf("Button released\n");
}
printf "$CD\n";
printf "$DSR\n";
printf "$CTS\n";
printf "$RI\n";
$button = $CD + $DSR + $CTS + $RI;
printf "$button pressed \n";
}; |
Dit script blijft echter niet hangen op de regel met tiocmiwait, bovendien geeft hij direct aan dat alle lijnen hoog zijn, terwijl dat niet het geval is.
Ik heb veel geprobeerd te zoeken, maar ik heb nergens kunnen vinden wat ik precies aan het doen ben en al helemaal niet wat er fout gaat.
Het grootste gat in mijn kennis is hoe ik met ioctl's direct in perl de seriele poort aan kan roepen. De documentatie is hierover niet erg duidelijk en ik heb er ook weinig voorbeelden van kunnen vinden.
[ Voor 5% gewijzigd door VROEM! op 07-11-2004 15:20 ]
ieeeepppppp :P