Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Errore trasmissione USART byte valore 13

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Errore trasmissione USART byte valore 13

Messaggioda Foto Utentespivo » 1 mag 2015, 19:08

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[2] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto Utentesimo85 » 1 mag 2015, 21:16

Che strano !

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

Ciao.
Simo
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto UtenteTardoFreak » 1 mag 2015, 21:23

Uhm ...
il 13 è il <CR>
il 10 è <LF>
<CR><LF>
mi dice qualcosa ...
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[4] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto Utentespivo » 1 mag 2015, 22:02

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

1
voti

[5] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto UtenteeAlucarD » 1 mag 2015, 22:22

leva ~IXON
Tredici comunque è speciale per read() un po come per Gregory House in House MD :mrgreen:
E l’uomo si addormentò e nel sogno creò il mondo
Avatar utente
Foto UtenteeAlucarD
1.210 3 5
Expert
Expert
 
Messaggi: 560
Iscritto il: 4 lug 2014, 11:01

0
voti

[6] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto Utentebobina » 1 mag 2015, 22:25

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.
Avatar utente
Foto Utentebobina
212 6
Frequentatore
Frequentatore
 
Messaggi: 177
Iscritto il: 27 dic 2009, 14:22

0
voti

[7] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto UtenteWALTERmwp » 1 mag 2015, 22:36

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[8] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto Utentespivo » 1 mag 2015, 22:39

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[9] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto Utentespivo » 1 mag 2015, 22:43

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[10] Re: Errore trasmissione USART byte valore 13

Messaggioda Foto UtenteWALTERmwp » 1 mag 2015, 23:40

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 5 ospiti