Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Linux + sarjaporttiohjelmointi: ongelma

0 views
Skip to first unread message

Tommi Jauhiainen

unread,
Dec 10, 2000, 4:09:40 PM12/10/00
to
Olen viritellyt coodia ohjaamaan sarjaporttiin liitetty LCD-näyttöä,
jossa on myös kuusi nappulaa, jotka lähettävät asciina 1-6. Kun tulostan
suoraan niin ei ongelmaa, myöskin taustavalon sytytys ja sammutus futaa
mutta kun yritän lukea näppylöitä niin näppylänluku toimii, mutta
kirjoitus näyttöön alkaa sekoilla. Eli jos luen nappulaa ja jos tulee
'1' niin kutsutaan valo_on(). Ei syty valo eikä vastaavasti sammukaan.
Joku sotkee.

Ohessa ydinkohta koodista:

switch(pid=fork())
{
case -1:
{
perror("forkki ei futaa!");
exit(1);
}

case 0:
{
/* lapsukainen, luen nappuloita */
alusta_signaali_lapsi();
shmptr = ota_muisti(); /* liittyy shared memory blokkiin */
data_ptr = shmptr;
ppid = getppid();
printf("Olen lapsi!\n");
while(!done)
{
usleep(10000);
bptr = buf;
nbytes = read(ser_fd, bptr, 1);
if (nbytes > 0) /* dataa on, käytännössä nbytes = 1 */
{
(*data_ptr).data_in = buf[0];
kill(ppid, SIGUSR1); /* SIGUSR1 kertoo että on merkki */
}
}
printf("Lapsi sai SIGTERM, lopetan!\n");
exit(0);
}
default:
{
/* emo, kirjoitan lcd:lle */
alusta_signaali_emo();
shmptr = ota_muisti();
data_ptr = shmptr;
printf("Olen emo!\n");
while(!lapsi_lopetti)
{
usleep(1000);
secs = time(0);
t = localtime(&secs);
if (secs != secs_oli)
{
secs_oli = secs;
row = asctime(t);
write_row(row, 1); /* lcd:n ekalle riville aika */
}
if (data) /* signaalihandleri asettaa jos on dataa */
{
switch((*data_ptr).data_in)
{
case '1':
{
valo_on();
printf("Valo-on\n");
break;
}
case '2':
{
valo_off();
printf("Valo-off\n");
break;
}
}
data = 0; /* data luettu ja käsitelty */
}
}
wait(pid);
clear_lcd();
write_row("lcd-demoni lopetettu!", 1);
valo_off();
close(ser_fd);
shmdt(shmptr);
}
printf("Ohjelma lopettaa!\n");
}


Eli tässä oli ydinkohdat. Alkuun oli yhdessä prosessissa mutta yritin
forkkailulla kiertää ongelmaa, mutta ei se auttanut. Sarjaportti on
avattu RDRW ja molemmat suunnat ovat "raw". Mikä tuossa lukemisessa
(lukeminen toimii, valo-on/valo-off tulostuu oikeaan aikaan stdout:ille)
aiheuttaa kirjoitukseen ongelmia? Alussa kytketään samalla rutiinilla
(valo_on()) taustavalo päälle ja lopetuksessa se kytketään pois
valo_off():lla, tällöin nämä toimii oivasti.

PS. Serial-HOWTO:t yms luettu eikä iloa
PPS. Olen harrastelija, coodi on siksi ns. räkää

--
http://www.iki.fi/congo/ e-mail: co...@iki.fi
- Työ vapauttaa!

0 new messages