|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 893
|
ubuntu . porta seriale non va
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 ? .
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 893
|
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 ! |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 893
|
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 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 893
|
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.
![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 893
|
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 ? |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:57.