[debian] Seriele poort monitoren

Pagina: 1
Acties:
  • 188 views sinds 30-01-2008
  • Reageer

  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Ik heb een schakeling gemaakt voor 15 knopjes aan mijn seriele poort om daarmee mijn (inmiddels functionerende) diskloze MP3 speler te kunnen besturen zonder toetsen e.d.
Waar ik nu naar op zoek ben (of wil maken) is een script/programma dat events genereert als bepaalde knopjes ingedrukt worden.
De schakeling functioneert, ik kan met cat /proc/tty/driver/serial zien welke kanalen van de seriele poort hoog zijn en voor elk knopje komt er een unieke combinatie uit. Dit kan ook met statserial, maar dit zijn beide programma's die op zijn hoogst elke seconde kijken hoe het erbij staat en dat is niet praktisch als je knopjes maar heel even ingeduwd worden.
In de serial-HOWTO staat eigenlijk niets over dit onderwerp en ik kwam met google ook niet veel verder.

De opzet waar ik aan dacht is dat de status van de poort bij verandering realtime naar een bestandje geschreven wordt en dat dat bestandje met een bepaalde frequentie uitgelezen wordt om daaruit akties te distilleren bij het indrukken van een knop. Maar ik sta natuurlijk open voor andere suggesties :)

Nog vergeten: cat /dev/ttyS0 levert geen output. Het opent wel de seriele poort (mijn power ledje op de schakeling gaat branden), maar er komen alleen maar hele laag frequente hoog/laag signalen binnen, maw niet echt "data" zoals bij een muis.

[ Voor 11% gewijzigd door VROEM! op 29-06-2004 09:25 ]

ieeeepppppp :P


  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Ik heb iets gevonden dat bruikbaar lijkt :)
Met statserial -d kun je een nummer als output van de status van de poort genereren. Elk knopje genereert een eigen nummer. Als je statserial -h gebruikt krijg je een nummer in hex, wat wel fijn is omdat dat minder karakters zijn.
Wat ik nu wil is snel loopen en elke keer de status checken, maar zonder de processor helemaal dicht te trekken.
Ik kan in de bash howto's alleen maar dingen vinden over loops een keer per zoveel seconden uitvoeren. Dat gaat natuurlijk niet werken als je een knopje maar heel even indrukt.
Hoe kan ik in bash zeg elke 0.01 seconden een check op de poort doen? Een check die op lage prioriteit loopt en dus ten tijde van "andere drukte" gewoon langzamer loopt is wat mij betreft ook prima. Zo lang de mp3's maar ongestoord blijven lopen.

ieeeepppppp :P


  • Sir Isaac
  • Registratie: September 2002
  • Laatst online: 21-05-2025
Ik denk dat je beter je schakeling kan aanpassen zodat hij een bepaald nummer gewoon even vasthoud. Dan hoef je niet zo vaak te checken.

  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Met sleepenh trek ik de processor langzaam maar zeker dicht, ook als ik elke 0.1s check op de een of andere manier. Maar ik heb inmiddels wat gevonden in de I/O port programming HOWTO over het gebruik van interrupts e.d :) Dus het gaat lukken zonder lelijke loop truukjes :)

ieeeepppppp :P


  • Zwerver
  • Registratie: Februari 2001
  • Niet online
uhm` VROEM! het is je al eens eerder gezegd/gevraagd, maar wil je aub gebruik maken van de edit knop? Want normaliter zou ik die tweede reply van je gewoon moeten weggooien ivm kicken binnen 24 uur. Thnx alvast

Woonachtig Down Under. Ik negeer je insults niet, maar tegen de tijd dat ik ze lees zijn ze meestal niet relevant meer


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Mischien voordehandliggend, maar als statserial dus in principe doet wat je wilt kun je toch gewoon de code er bij halen en een eigen app bakken die 't wel continu polled? Je hoeft er niet eens de processor voor dicht te trekken als je blocking I/O gebruikt (ofwel, wachten tot er invoer is en dan pas verder gaan, niet continu loopen om te checken of er invoer is)

All my posts are provided as-is. They come with NO WARRANTY at all.


  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Iemand heeft inmiddels de volgende source als suggestie gedaan:
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 <unistd.h>
#include <termios.h>
#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) {
   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 ("%d\n", button);
   }
   else {
   printf("Released\n");
   }
   }
return 0;
}

Dit werkt op zich prima, de output op het scherm is of het nummer van het ingedrukte knopje, of de melding "Released".
Enige probleem is dat die output zich op de een of andere manier niet laat vangen in een bestandje of variabele zoals met normale programma's zou moeten.
Bijv: ls >out.txt geeft wel output, ./mp3player > out.txt geeft een bestandje out.txt met lengte 0 en logischerwijs geen inhoud.
Ik heb wel wat dingen geprobeerd als refres() erachter, of fprintf, printw, maar dat geeft allemaal fouten bij het compileren.

[ Voor 11% gewijzigd door VROEM! op 01-07-2004 12:26 ]

ieeeepppppp :P


  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Het ziet er naar uit dat je stdout nog buffered is. Ik weet niet waarom je het naar file wil redirecten, maar in dit geval kun je het beste de stdout unbuffered maken.

code:
1
setvbuf( stdout, NULL, _IONBF, 0 );


Wel even toevoegen voor je while loop....

  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Ik wil gewoon uberhaupt de output in een shell script kunnen gebruiken, naar een file doorsturen is voor mij gewoon een test of er uberhaupt iets afgevangen wordt, maar dit doet het :) :) Dus dat is heel mooi, nu kan ik verder.
offtopic: Weet iemand een goede beginners on-line C-programmeer handleiding voor linux? Ik zou wel graag wat meer willen leren :)

ehm, update: De output naar een file sturen gaat nu wel, maar ik kan het nog niet afvangen naar een variabele die in bash scripts te gebruiken is. De string moet op de een of andere manier gesloten worden als ik dit document goed begrijp.

[ Voor 37% gewijzigd door VROEM! op 01-07-2004 17:04 ]

ieeeepppppp :P


  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Als je bedoeling is om een proces vanuit de shell te starten, afhankelijk van een stdout getalletje, is het mis^H^H^Hgebruik van omgevingsvariabelen!! Daarnaast is het niet altijd gegarandeerd dat de variabelen elders ook zichtbaar zijn.

Een snelle oplossing is via een standaard pipe ( ./printkey | ./parsekey )
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh

while 1
do
  read x
  case "$x" in

    1) echo script1;;
    2) echo script2;;
    3) echo script3;;

  esac
done


....maar het lijkt nu al snel op een script-request wat niet de bedoeling is.

  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Wat de bedoeling is is dat ik vanuit de shell een script start ongeveer als volgt:
code:
1
2
3
for $KNOPJE in `./knopjes` do
      mp3player $KNOPJE
done

Dan dat mp3player script iets als:
code:
1
2
3
4
5
6
7
case $1 in
   1)
    aktie 1 (zeg play)
    2)
    aktie 2 (eject CD)
    3)
    etc, voor alle 15 knopjes

Wat ook prima is is als het "knopjes" programma een shell script start en de laatste regel output mee geeft als input voor het script. Dan draai je maar 2 processen ipv 3.

Over het stukje script request:
Probleem is dat de programmeertaal C tot nu toe een beetje abracadabra voor me is. Shell scripts bouwen gaat redelijk, ik kan wat Visual Basic, maar de syntax in C gaat me nog een beetje boven de pet. Bij elke vraag die ik hier post zoek ik ook tien andere documenten door op internet voor ik hem stel, maar ik kan uit de handleidingen nog eigenlijk te weinig opmaken omdat ik het hele concept van pointers, strings, etc in C nog niet goed snap. Ik doe echt mijn best met zoeken en loop al 2 dagen weinig anders dan tien uur per dag C handleidingen te lezen, maar het zegt me allemaal zo weinig en als ik foutmeldingen door google haal komt er ook niet veel uit dat mij op ideeen brengt.
Ik hoop dat dat niet te irritant is en ik wil het graag leren, zie mijn vorige post, maar het gaat bij mij zachtjes gezegd allemaal niet vanzelf.

Wat bedoel je hier trouwens precies mee?
Als je bedoeling is om een proces vanuit de shell te starten, afhankelijk van een stdout getalletje, is het mis^H^H^Hgebruik van omgevingsvariabelen!!
Ik heb nu na de een na laatste printf een execve commando staan, als volgt.
code:
1
execve ("/root/mp3play",%d,0)

Dit geeft bij het compileren de melding dat er een parse error is voor het % teken.
Als ik quotes om %d zet (``/ ''/`/') krijg ik of een foutmelding, of het script dat ik aanroep krijgt letterlijk %d mee ipv de waarde van %d.
Wat gaat hier mis?

[ Voor 21% gewijzigd door VROEM! op 01-07-2004 18:57 ]

ieeeepppppp :P


  • Buffy
  • Registratie: April 2002
  • Laatst online: 26-12-2024

Buffy

Fire bad, Tree pretty

VROEM! schreef op 01 juli 2004 @ 17:50:
Wat de bedoeling is is dat ik vanuit de shell een script start ongeveer als volgt:
code:
1
2
3
for $KNOPJE in `./knopjes` do
      mp3player $KNOPJE
done

Dan dat mp3player script iets als:
code:
1
2
3
4
5
6
7
case $1 in
   1)
    aktie 1 (zeg play)
    2)
    aktie 2 (eject CD)
    3)
    etc, voor alle 15 knopjes

Wat ook prima is is als het "knopjes" programma een shell script start en de laatste regel output mee geeft als input voor het script. Dan draai je maar 2 processen ipv 3.

[..]

Wat bedoel je hier trouwens precies mee?
[...]


Ik heb nu na de een na laatste printf een execve commando staan, als volgt.
code:
1
execve ("/root/mp3play",%d,0)

Dit geeft bij het compileren de melding dat er een parse error is voor het % teken.
Als ik quotes om %d zet (``/ ''/`/') krijg ik of een foutmelding, of het script dat ik aanroep krijgt letterlijk %d mee ipv de waarde van %d.
Wat gaat hier mis?
Je uitgangspunt is verkeerd. Als je wilt scripten moet je niet vanuit het programma bij een button press event het script aanroepen maar je moet vanuit het script het programma aanroepen en zoals richardt aangaf de uitvoer met een while-read lusje verwerken. Op een zelfde manier als je de output van een programma als 'cat', 'grep' etc zou verwerken.
Het 'read' commando leest normaal vanaf de standaard invoer maar je kan ook redirecten.

Probeer eens:

Bash:
1
2
3
4
com_lees_programma | while read x
do
    # doe hier iets met het event in de variable x
done

That which doesn't kill us, makes us stranger - Trevor (AEon FLux)
When a finger points at the moon, the imbecile looks at the finger (Chinese Proverb)


  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
Check, dat is em :)
Ik heb maar even echo gedaan, nu ga ik zo'n case etc scriptje klussen.

ieeeepppppp :P


Verwijderd

VROEM! schreef op 01 juli 2004 @ 17:50:
[KNIP...]

Ik doe echt mijn best met zoeken en loop al 2 dagen weinig anders dan tien uur per dag C handleidingen te lezen
Ik denk dat tien uur per dag theorie over C(++) doorlezen ook niet echt de manier is om C(++) te leren. Ten eerste kun je maar een beperkte hoeveelheid informatie tegelijk opnemen/verwerken, ten tweede moet je die theorie natuurlijk ook in de praktijk brengen (m.b.v. voorbeeldprogramma's bijv.).
, maar het zegt me allemaal zo weinig en als ik foutmeldingen door google haal komt er ook niet veel uit dat mij op ideeen brengt.
Ik hoop dat dat niet te irritant is en ik wil het graag leren, zie mijn vorige post, maar het gaat bij mij zachtjes gezegd allemaal niet vanzelf.

[KNIP...]
Je moet ook niet verwachten dat je een vrij complexe taal als C(++) even 1...2...3 leert, als je de basis eenmaal een beetje kent dan kun je m.b.v. van Google al veel meer informatie vinden die je nodig hebt. Aangezien je al ervaring hebt met andere programmeertalen denk ik dat je C(++) ook binnen niet al te lange tijd kan leren.

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

VROEM! schreef op 01 juli 2004 @ 17:50:

Ik heb nu na de een na laatste printf een execve commando staan, als volgt.
code:
1
execve ("/root/mp3play",%d,0)

Dit geeft bij het compileren de melding dat er een parse error is voor het % teken.
Als ik quotes om %d zet (``/ ''/`/') krijg ik of een foutmelding, of het script dat ik aanroep krijgt letterlijk %d mee ipv de waarde van %d.
Wat gaat hier mis?
Simpel: %d heeft helemaal geen waarde. Het is namelijk geen variable. '%d' is wat in printf()-achtigen gebruikt wordt om een decimal weer te geven. Bijvoorbeeld:
code:
1
2
3
printf("Getal: %d\n", 123);

Uitvoer: Getal: 123


Wat je wilt is
code:
1
execve("/root/mp3play", button, 0);

(Er van uit gaande dat je dat getal als argument aan je mp3play ding wilde geven)

[ Voor 12% gewijzigd door CyBeR op 01-07-2004 23:12 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • VROEM!
  • Registratie: Februari 2000
  • Laatst online: 18-05-2025

VROEM!

broembroem!

Topicstarter
CyBeR schreef op 01 juli 2004 @ 23:11:
[...]


Simpel: %d heeft helemaal geen waarde. Het is namelijk geen variable. '%d' is wat in printf()-achtigen gebruikt wordt om een decimal weer te geven. Bijvoorbeeld:
code:
1
2
3
printf("Getal: %d\n", 123);

Uitvoer: Getal: 123


Wat je wilt is
code:
1
execve("/root/mp3play", button, 0);

(Er van uit gaande dat je dat getal als argument aan je mp3play ding wilde geven)
Die had ik ook al geprobeerd, maar dat gaf een warning of een error bij het compilen. Anyway, het programma wordt as we speak vanuit een bash script aangeroepen en ik heb de functies voor een stuk of acht knoppen al werkend :)

ieeeepppppp :P

Pagina: 1