PDA

View Full Version : ubuntu . porta seriale non va


gandrea
12-02-2007, 21:13
help ! nn so proprio dove mettere le mani . ho un amico che ha installato ubuntu e windows sullo stesso pc . a questo pc tramite una porta seriale è stata connessa una stazione meteo. da windows questa stazione dialoga col pc . da linux cio' nn avviene . io ho la stessa stazione e lo stesso programma su linux e la stazione dialoga perfettamente . entrambi abbiamo ubuntu . da che cosa puo' dipendere questo problema ? io x far funzionare la mia stazione nn ho dovuto fare nulla di particolare tranne che fare chmod su ttyS0 . nel pc del mio amico è presente ttyS0 S1 S2 S3 . con nessuna va . che verifiche posso fare x vedere dove sta il problema ? .

gandrea
13-02-2007, 22:48
il pc ha una scheda pci seriale e 1 porta sulla scheda madre ( quella dove è collegata la stazione )

al boot si legge
[17179571.872000] Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
[17179571.872000] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[17179571.872000] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

con lspci la scheda pci seriale è sta qua 02:07.0 Serial controller: Timedia Technology Co Ltd PCI2S550 (Dual 16550 UART) (rev 01)

ogni tanto la stazione viene letta ( è successo solo a lui a me mai da ssh ) . poi cmq al comando successivo nn va . ho provato con un comando nn ricordo quale era x vedere se la porta è occupata da qualcuno ma nn ritorna niente .

i permessi credo siano settati giusti xchè anche io li ho settati nello stesso modo .

ho provato a buttare comandi di tutti i tipi dentro ( nn so manco che fanno ) . tipo questo ho provato
echo "blabla" > /dev/ttyS0 e nn ritorna nessun errore

gli irq che sta indirizzando x la s0 mi pare irq 3 x la s3 irq 4 la s2 e s1 irq 177 che è l'irq che assegna alla scheda pci seriale .


qualche idea ? test da fare ? help !

ilsensine
14-02-2007, 09:32
Intanto ficcaci un modem e controlla se kppp riesce ad interrogarlo.

Non vedo che fastidio possa dare la seriale pci (che da quello che ho capito non è la porta che stai usando).

gandrea
14-02-2007, 21:03
eccomi scusa nn avevo visto il post . nel frattempo il mio amico ha messo il tutto su un altro pc su cui c'era suse ( la prova cmq nn avrei potuta farla nn ho un modem seriale ) ma manco farlo apposta pure la ha problemi . li c'è una sola seriale che funziona solo che è lentissima . ho un crontab che chiama un servizio che deve leggere sulla seriale ma quando viene chiamato trova ancora la chiamata precedente che deve terminarsi ( 3 min circa prima che si termini ) .

se faccio
lsof /dev/ttyS*
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
log2300 6513 michele 4uW CHR 4,64 2807 /dev/ttyS0

qua si crea una lista lunghissima dove si accodano tutte le chiamate a quella porta . come mai è così lenta ?

stty -a < /dev/ttyS0
speed 2400 baud; rows 0; columns 0; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>;
min = 0; time = 10;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

ilsensine
15-02-2007, 13:11
Controlla che non ci siano altri processi (tipo qualche mgetty) in ascolto sulla stessa seriale, altrimenti si pestano i piedi.

Accertati inoltre di attivare il controllo di flusso (crtscts) se il dispositivo connesso lo supporta a sua volta. Ricorda infine che la seriale _non_ è un canale affidabile, alcuni byte potrebbero andare persi (anche se la probabilità è molto bassa).

gandrea
16-02-2007, 12:23
allora ho provato a controllare i vari mgetty . nessuno lavora sulla ttyS0 . ho provato ad abilitare quella cosa che mi dicevi ma niente nn cambia nulla lavora allo stesso e identico modo . che sia un problema dell'ultimo kernel ? su un altro pc abbiamo provato a mettere la ubuntu ( un pc che aveva windows e che già giirava la stazione velocemente su win ) . stesso problema . letture lentissime . il programma va perchè io uso lo stesso e nn ha problemi . la stazione meteo idem perchè da windows viene letta . ho cercato in /proc/interrupts se ci sono conflitti di irq ma nn c'è nessuno che usa lo stesso irq. :confused:

ilsensine
16-02-2007, 12:58
Ci sono stati lavori sul layer tty negli ultimo kernel, ma non vedo perché debbano causare questi problemi. Che di sicuro non sarebbero passati inosservati.

Puoi testare un modem come ti ho suggerito?

gandrea
17-02-2007, 20:47
purtroppo nn avevo il modem x provare e nemmeno il mio amico . mi sono messo li a litigare credendo che la porta funziona e basta . mi sono messo a provare mille cose e alla fine ho risolto . in pratica era un problema del programma ! vai a saperlo il perchè . lo abbiamo provato su una distro identica e a lui nn va a me si . in pratica il problema sta in queste righe ( su un timer ? magari se c'è qualche programmatore )

/* READ WIND SPEED AND DIRECTION */

sprintf(tempstring,"%.1f ",
wind_all(ws2300, config.wind_speed_conv_factor, &tempint, winddir));
strcat(logline, tempstring);
sprintf(tempstring,"%.1f %s ", winddir[0], directions[tempint]);
strcat(logline, tempstring);




nella funzione o quello che è wind_all


/********************************************************************
* wind_all
* Read wind speed, wind direction and last 5 wind directions
*
* Input: Handle to weatherstation
* wind_speed_conv_factor controlling convertion to other
* units than m/s
*
* Output: winddir_index
* Current wind direction expressed as ticks from North
* where North=0. Used to convert to direction string
* winddir
* Array of doubles containing current winddirection
* in winddir[0] and the last 5 in the following
* positions all given in degrees
*
* Returns: Wind speed (double) in the unit given in the loaded config
*
********************************************************************/
double wind_all(WEATHERSTATION ws2300,
double wind_speed_conv_factor,
int *winddir_index,
double *winddir)
{
unsigned char data[20];
unsigned char command[25]; //room for write data also
int i;
int address=0x527; //Windspeed and direction
int bytes=6;

for (i=0; i<MAXWINDRETRIES; i++)
{
if (read_safe(ws2300, address, bytes, data, command)!=bytes) //Wind
read_error_exit();

if ( (data[0]!=0x00) || //Invalid wind data
((data[1]==0xFF) && (((data[2]&0xF)==0)||( (data[2]&0xF)==1))) )
{
QUESTA LINEA SLEEPLONG l'ho commentata e ora l'output torna in 10 secondi , prima 3 minuti o +
sleep_long(10); //wait 10 seconds for new wind measurement
continue;
}
else
{
break;
}
}

//Calculate wind directions

*winddir_index = (data[2]>>4);
winddir[0] = (data[2]>>4)*22.5;
winddir[1] = (data[3]&0xF)*22.5;
winddir[2] = (data[3]>>4)*22.5;
winddir[3] = (data[4]&0xF)*22.5;
winddir[4] = (data[4]>>4)*22.5;
winddir[5] = (data[5]&0xF)*22.5;

//Calculate raw wind speed - convert from m/s to whatever
return ( (((data[2]&0xF)<<8)+(data[1]) ) / 10.0 * wind_speed_conv_factor);
}


su un altro file trovo

/* Platform dependent functions */
int read_device(WEATHERSTATION serdevice, unsigned char *buffer, int size);
int write_device(WEATHERSTATION serdevice, unsigned char *buffer, int size);
void sleep_short(int milliseconds);
void sleep_long(int seconds);


c'è una spiegazione valida ?