Pagina 1 di 3

Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 19:08
da spivo
Ciao a tutti,
Scrivo perché mi succede qualcosa di strano che non riesco a capire.

L'intenzione è di far leggere dei valori a un pic18f46k22 e trasmetterli via usart a un Raspberry, questi valori sono inviati all'interno di byte e quindi variano da 0 a 255.

Se io invio dal PIC un byte con valore decimale 5, raspberry riceve un byte con valore 5, e così per tutti i valori possibili da 0 a 255;

TRANNE per il valore 13, se io invio un byte con valore 13 raspberry lo riceve con valore 10 !!!

A voi è masi successo? Avete qualche consiglio Ciao Ivo

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 21:16
da simo85
Che strano !

Hai programmato la ricezione in C ?
Posta il codice magari.

Ciao.
Simo

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 21:23
da TardoFreak
Uhm ...
il 13 è il <CR>
il 10 è <LF>
<CR><LF>
mi dice qualcosa ...

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 22:02
da spivo
Ciao,

Questo è uno stralcio del codice in c di raspberry

Codice: Seleziona tutto
// ************************** Dichiarazioni per trasmissione SERIALE

#define PORT "/dev/ttyAMA0"   // Device name
#define SPEED B115200         // Velocità banda
int Seriale;         // Serial handler
unsigned char buffer[50];   // Data buffer (Rx)
unsigned char ch_out[20];   // Dati in uscita

//**************************** CONFIGURAZIONE

int Configura_e_apri_seriale(void)
{struct termios tty;          // Device descriptor
 
Seriale = open (PORT, O_RDWR);    // Apre collegamento seriale

if (Seriale < 0)
          {printf ("Error %d opening %s: %s\n", errno, PORT, strerror (errno));
           return (-1);
          }

memset (&tty, 0, sizeof tty);
if (tcgetattr (Seriale, &tty) != 0)
        {printf("ERROR! %s\n", strerror(errno));
         return (-1);
        }

cfsetospeed (&tty, SPEED);                      // Set output speed
cfsetispeed (&tty, SPEED);                      // Set input speed
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;     // 8-bit chars
tty.c_iflag &= ~IGNBRK;                         // Disable break processing
tty.c_lflag = 0;                                // No signaling chars, no echo, no canonical processing
tty.c_oflag = 0;                                // No remapping, no delays
tty.c_cc[VMIN]  = 0;                            // Read doesn't block
tty.c_cc[VTIME] = 5;                            // 0.5 seconds read timeout
tty.c_iflag &= ~(IXON | IXOFF | IXANY);         // No xon/xoff ctrl
tty.c_cflag |= (CLOCAL | CREAD);                // Ignore modem controls, enable reading
tty.c_cflag &= ~(PARENB | PARODD);              // No parity
// tty.c_cflag |= 0;
tty.c_cflag &= ~CSTOPB;                         // Set bit stop
tty.c_cflag &= ~CRTSCTS;                        // No gandshake

if (tcsetattr (Seriale, TCSANOW, &tty) != 0)
        {printf("ERROR! %s\n", strerror(errno));
         return (-2);
        }
sleep(1);                                       // Kernel bug workaround - see text       
return (0);
}

//**************************** LETTURA DI 50 CARATTERI
   read (Seriale, buffer, 50);

Questo invece è parte del codice del pic18f46k22 che invia i dati
Codice: Seleziona tutto
void ConfigureUSART1(void)
{
    BAUDCON1bits.BRG16 = 1;
    // 11 520 bps 8 bit + 1 stop
    Open1USART( USART_TX_INT_OFF &
            USART_RX_INT_OFF &      //interrupts su ricezione
            USART_ASYNCH_MODE &
            USART_EIGHT_BIT &
            USART_CONT_RX &
            USART_BRGH_HIGH,
            138 );
}

void InviaDati(void)
{

   for (i=0;i<50;i++){
       Write1USART(ch_out[i]);
       while (Busy1USART());
   }
}


Anche io ho pensato che potesse centrare qualcosa anche il fatto che il tasto invio su certi sistemi vale 10 su altri 13 ma perché dovrebbe variare?

Ciao Ivo

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 22:22
da eAlucarD
leva ~IXON
Tredici comunque è speciale per read() un po come per Gregory House in House MD :mrgreen:

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 22:25
da bobina
Visto che non hai postato tutto il codice e neanche la parte di stampa è difficile analizzare il problema.
Ma penso che tu invoca una printf con "%s\n" quel \n è il valore 0x0A = 10 LF, il 13 che corrisponde al CR o \r in C.
Se invece la tua printf è "%x\n" e %x stampa un 10 al posto del 13 è molto strano.
Nei sistemi unix (Raspberry è un linux di conseguenza basato su unix) il terminatore di riga è composto da un solo carattere LF 0x0A 10, nei sistemi Mac invece il terminatore di riga è il carattere CR 0x0D 13, nei sistemi dos e windows è composto da 2 caratteri ed è la sequenza \r\n o CR LF.
Ma visto che windows per fortuna non è presente non credo sia questo il caso.
La variazione ci può essere solo se tui hai implementato qualche conversione, comunque senza la parte di codice che stampa la ricezione è un po' difficile dirlo.

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 22:36
da WALTERmwp
Ciao Foto Utentespivo provo anch'io a scrivere la mia anche se, in parte, Foto Utentebobina mi ha anticipato.
Nel codice ci sono solo output(s) per gli errori ma non si vede quello del buffer (mi pare).
I caratteri spediti dal PIC, dalla parte del lampone come vengono visualizzati/riscontrati ?
Hai veramente provato a spedire "tutti" i valori, da 0 a 255, e altrettanti ne hai riscontrati (a parte l'eccezione) ?

Saluti

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 22:39
da spivo
Ciao,
ho provato sia ad eliminare IXON | che a commentare tutta la riga
Codice: Seleziona tutto
tty.c_iflag &= ~(IXON | IXOFF | IXANY);         // No xon/xoff ctrl

il programma funziona lo stesso ma l'errore rimane.

La visualizzazione di raspberry è questa:
Codice: Seleziona tutto
   // visualizza lettura SERIALE
   printf("\x1b[5;1H>>");   
   for(ii=0;ii<50;ii++)
   {
   printf("%i ",buffer[ii]);
   }

comunque non è solo un errore di visualizzazione perché se metto un controllo del tipo if(buffer[ii] == 13) la condizione non si verifica anche se il PIC invia il valore 13.
Viceversa ho provato ad inviare una sequenza di byte da raspberry al PIC e se condiziono l'accensione di un led con la ricezione del valore 13 questa funziona, ma se imposto una specie di echo il byte che ritorna a raspberry è 10

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 22:43
da spivo
WALTERmwp ha scritto:Hai veramente provato a spedire "tutti" i valori, da 0 a 255, e altrettanti ne hai riscontrati (a parte l'eccezione) ?


Si con molta calma li ho provati tutti e 256, ma l'errore è solo per il 13 che con printf("%i"....) viene visualizzato 10

Re: Errore trasmissione USART byte valore 13

MessaggioInviato: 1 mag 2015, 23:40
da WALTERmwp
La print, per i 50 valori, prevede solo uno spazio (mi pare) da interporre rispetto al valore che segue quindi, quando esegui l'output del valore 0x0D (cioè 13, cioè <CR>) cosa vedi ?
C'è un ritorno a capo sulla medesima linea ?
Sembrerebbe una questione relativa all'output a video (immagino) e quindi di "interpretazione" che non dovrebbe operare, quantomeno se non intenzionalmente cercata.
Presumo che il valore 13 gli arrivi correttamente; per confermare questo bisognerebbe posizionare un analizzatore sulla seriale.

Saluti

p.s.
avevo erroneamente riportato 0x0C invece di 0x0D