Portál AbcLinuxu, 5. května 2025 13:09

Dotaz: Perl, printf(stderr vs. print.

25.1.2013 10:53 saf | skóre: 3
Perl, printf(stderr vs. print.
Přečteno: 305×
Odpovědět | Admin
Zdravím, řeším takový problém. Jak udělat aby fungoval normální print v tomto programu mi to nějak nejde:

### definice serioveho rozhrani

$port = "/dev/ttyUSB0"; # je COM1

### sada s stty nastavení portů

system "stty 57600 -F /dev/ttyUSB0 < $port";

### Otevřít COM port jako

open(COM, "+>$port") or die "nelze otevřít $port";

select(COM); # COM jako standardní I/O Nastavení

$| = 1; # Tabulka jediná záležitost není bufferu =

### Odešle Q1 na UPS pro váš stav

printf("t"); # UPS nemá rád normální konec řádku

#sleep(1) # 2400 BPS je pomalý ...

sysread(COM, my ($line), 50);

close(COM);

printf(stderr "Z venku balkon pokoj set.pok K\n");#OK

printf(stderr $line); # OK

print "$line\n"; #nefunguje

Děkuji Saf.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.1.2013 11:22 graviton
Rozbalit Rozbalit vše Re: Perl, printf(stderr vs. print.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kterak správně problémy hlásiti: Jinak moje křišťálová koule hlásí, že sekvence
select(COM)
close(COM)
print
asi bude tisknout někam do prázdna (=zavřeného deskriptoru).
25.1.2013 11:48 saf | skóre: 3
Rozbalit Rozbalit vše Re: Perl, printf(stderr vs. print.
OK, blbě jsem to napsal. Tohle je original:

#!/opt/bin/perl

### Serielle Schnittstelle definieren

$port = "/dev/ttyUSB0"; # entspricht COM1

### mit stty die Port-Einstellungen setzen

system "stty 57600 -F /dev/ttyUSB0 < $port";

### Port als COM öffnen

open(COM, "+>$port") or die "can't open $port";

select(COM); # COM als standard E/A festlegen

$| = 1; # Character einzeln ausgeben = nicht puffern

### Sendet Q1 an die USV zur Statusabfrage

printf("t"); # die USV mag kein normales Zeilenende

#sleep(1) # 2400 BPS sind recht langsam ...

sysread(COM, my ($line), 50);

printf(stderr "Z venku balkon pokoj set.pok K\n");

printf(stderr $line); # Ausgabe auf Console

close(COM);

To funguje, program načte z RS232 do $line a pak proběhne tisk na obrazovku, to je OK. Ale když budu pokračovat dále v programu a dám print "test vystup na obrazovku\n"; tak se nic neděje.
Řešení 1× (saf (tazatel))
wamba avatar 25.1.2013 12:21 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Perl, printf(stderr vs. print.
nechybí za close něco jako select(STDOUT);

hm.. select jeden s příkazů, který jsem v perl-u ještě nikdy nepoužil :)
This would have been so hard to fix when you don't know that there is in fact an easy fix.
25.1.2013 12:27 saf | skóre: 3
Rozbalit Rozbalit vše Re: Perl, printf(stderr vs. print.
Dík, to je ono.
25.1.2013 12:25 graviton
Rozbalit Rozbalit vše Re: Perl, printf(stderr vs. print.
Viz výše, select přesměruje print do COM, close ho zavře, pak už jdou všechny normální printy do nikam. Nepomohlo by select(COM) nahradit $oldfh = select(COM); a na konec dát zas select($oldfh); ?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.