Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema comunicazione seriale

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Problema comunicazione seriale

Messaggioda Foto Utenteboiler » 22 mar 2020, 11:26

daniele1996 ha scritto:
Codice: Seleziona tutto
void send_string(char * str){
   while((*str) != '\r'){
      TX(*str);
      str++;
   }
   //TX('\n');
}


Potrebbe esserci un problema con il carattere di fine stringa.
Le stringhe in C sono null-terminated, vuol dire che alla fine dell'array di caratteri che il compiler mette in memoria quando incontra una costante di tipo string c'è 0x00, tu usi \r che corrisponde a 0x0D.

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5599
Iscritto il: 9 nov 2011, 12:27

1
voti

[12] Re: Problema comunicazione seriale

Messaggioda Foto Utenteboiler » 22 mar 2020, 11:27

daniele1996 ha scritto:Debugger oltre che non averne non so nemmeno come si usa, per programmarlo ho un semplice USBASP, ma a parte questo, la Keyword volatile non l'ho mai usata (dovrei prima documentarmi a cosa serve, lo sto facendo ora)


In tal caso ho l'impressione che tu stia facendo il passo piú lungo della gamba.
Comincia con qualcosa di semplice e prenditi il tempo di imparare.

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5599
Iscritto il: 9 nov 2011, 12:27

0
voti

[13] Re: Problema comunicazione seriale

Messaggioda Foto Utenteluxinterior » 22 mar 2020, 11:36

Io modificherei anche il loop do trasamisisone così
Codice: Seleziona tutto
void send_string(char * str){
   while((*str) != '\r') && (*str != 0)) {
      TX(*str);
      str++;
   }
   //TX('\n');
}


così hail la certezza di fermarti prima o poi
Avatar utente
Foto Utenteluxinterior
4.311 3 4 9
Master EY
Master EY
 
Messaggi: 2690
Iscritto il: 6 gen 2016, 17:48

0
voti

[14] Re: Problema comunicazione seriale

Messaggioda Foto Utentedaniele1996 » 22 mar 2020, 11:40

boiler ha scritto:
daniele1996 ha scritto:
Codice: Seleziona tutto
void send_string(char * str){
   while((*str) != '\r'){
      TX(*str);
      str++;
   }
   //TX('\n');
}


Potrebbe esserci un problema con il carattere di fine stringa.
Le stringhe in C sono null-terminated, vuol dire che alla fine dell'array di caratteri che il compiler mette in memoria quando incontra una costante di tipo string c'è 0x00, tu usi \r che corrisponde a 0x0D.

0x00 sarebbe lo \0 ?
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[15] Re: Problema comunicazione seriale

Messaggioda Foto Utenteluxinterior » 22 mar 2020, 11:42

dimentichiamoci lo zero aggiungi solo && (*str) così non ci sono problemi

caxxo siete troppo veloci mi ero perso mezza discussione...
Avatar utente
Foto Utenteluxinterior
4.311 3 4 9
Master EY
Master EY
 
Messaggi: 2690
Iscritto il: 6 gen 2016, 17:48

0
voti

[16] Re: Problema comunicazione seriale

Messaggioda Foto Utentedaniele1996 » 22 mar 2020, 11:43

Effettivamente pensandoci il problema potrebbe essere lì perché se non trova lo \r prosegue ad inviare i valori delle locazioni di memoria sempre successive finché non trova uno \r
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

2
voti

[17] Re: Problema comunicazione seriale

Messaggioda Foto Utentehyroio » 22 mar 2020, 11:49

poi visogna vedere cosa passi a send_string.
Le stringhe c sono zero-terminate, se compilate in memoria programma oppure vengono zero-terminate dalle funzioni standard. Ma se il buffer lo prepari tu ...

Se scrivi tramite puntatori byte per byte in un buffer non inizializzato, ricorda alla fine di aggiungere in maniera forzata uno 0.
Avatar utente
Foto Utentehyroio
106 1 4
CRU - Account cancellato su Richiesta utente
 
Messaggi: 137
Iscritto il: 17 mar 2020, 13:06

0
voti

[18] Re: Problema comunicazione seriale

Messaggioda Foto Utentedaniele1996 » 22 mar 2020, 12:06

Identificato il problema: la stringa del buffer ha un problema di terminazione!
Quando azzero il vettore, imposto tutti i caratteri in \r, quindi quando scrivo i caratteri nella stringa (entro la dimensione massima del vettore) rimane almeno un carattere \r e quindi la funzione termina alla lettura dello \r
però se la richiamo così:
Codice: Seleziona tutto
send_string("Mia Stringa");

la funzione non termina perché la stringa termina con uno \0 al posto di uno \r...
Quindi c'è da decidere sul carattere di terminazione del vettore di caratteri, me la devo pensare!
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[19] Re: Problema comunicazione seriale

Messaggioda Foto Utentedaniele1996 » 22 mar 2020, 12:30

Risolto! ho sostituito lo \r nelle funzioni clear_buffer() e nella funzione send_string(); con \0 in questo modo la funzione termina appena trova uno \0, potevo anche risolvere anche così:
Codice: Seleziona tutto
send_string("Stringa di prova\r");

E aggiunto nella funzione open() (Quella che apre la porta seriale) la funzione clear_buffer() in modo che all'avvio la stringa viene già impostata tutta a \0
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti