Vai al contenuto
PLC Forum


Rs232 Fra Pc E Pic - ascii ?


Il Novizio

Messaggi consigliati

Ciao a tutti,

sto testando la comunicazione della seriale di un pic. (pic18f452 per l'esattezza)

Per fare questo ho programmato una semplice routine e vado a vedere con hyperterminal cosa ricevo,

ecco qui:

///////////////////////////////////

SPBRG = 65; //baud rate init

TXSTA = 0b00100000; //set TXEN, clear BRGH //transmit init

RCSTA = 0b10010000; //set SPEN, set CREN //receive init

while (1)

{

serialsendchar('A');

delay_ms(200);

};

///////////////////////////////////////

la funzione serialsendchar fa così:

//////////////////////////////

void serialsendchar (char value)

{

while (TXSTAbits.TRMT == 0); //wait here until trmt flag is set:tsr register is empty

TXREG=value;

}

/////////////////////////////

Il problema è che se io faccio ad esempio:

serialsendchar(0x41) //0x41 è il codice ascii esadecimale per la lettera A

allora hyperterminal riceve proprio A

ma se io faccio come sopra, cioè

serialsendchar('A')

hyperterminal mi riceve P :o:( , e così via, se mando v mi riceve 6 ecc...

Io credevo che i caratteri tipo 'A', racchiusi fra apici, così come le stringhe ("stringa"), fossero memorizzati e quindi poi inviati con il codice ascii giusto, e quindi che hyperteminal li ricevesse bene.

Non dovrò mica convertire nel valore hex corrispondente qualunque stringa che voglio inviare :D !

Anche perchè io questa routine per gestire la comunicazione seriale mica me la sono inventata... l' ho trovata già fatta da un tizio che inviava stringhe tipo "\13\10 reading memory" ecc...

Dov'è che sbaglio?

Aiutatemi, perchè ormai lo sapete, non ci capisco una maxxa. :lol:

Ciao

Link al commento
Condividi su altri siti


Ciao novizio,

premetto che non ci capisco niente di linguaggio C, ma dando uno sguardo veloce vedo che la lettera A la metti tra apici mentre l'esempio che menzioni riporta il messaggio chiuso tra "....".

Che sia quello?

Prova ma forse ho detto una castroneria.

Matik

Link al commento
Condividi su altri siti

ERRATA CORRIGE.

Allora, per quanto riguarda l'invio di singoli caratteri in realtà funziona. All'inizio non mi funzionava per un problema di baudrate leggermente diversa fra pic e hyperterminal.

Continua a dare problemi quando però invio una stringa.

Per fare questo, dico:

serialsendstring ("Ciao, gente");

e la funzione è:

//////////////

void serialsendstring (const char* text)

{

char i=0;

while (text !=0) serialsendchar (text[i++]);

}

//////////////

dove ricordo serialsendchar fa così:

//////////////////////////////

void serialsendchar (char value)

{

while (TXSTAbits.TRMT == 0); //wait here until trmt flag is set:tsr register is empty

TXREG=value;

}

/////////////////////////////

quando vado a fare il build all mi da un warning relativo alla linea dove scrivo serialsendstring ("Ciao, gente");

Warning [2066] type qualifier mismatch in assignment.

Evidentemente non gli piace che quella stringa sia passata a quel puntatore di costante char.

Poichè è un warning il file hex in uscita me lo dà lo stesso, e se lo testo sul pic, hyperterminal al posto di "Ciao gente" riceve una serie di caratteri strani, mentre se subito dopo la linea dove mando la stringa, invio anche un carattere singolo, allora quello lo riceve giusto.

Questa cosa ancora non l'ho capita.

Qualche suggerimento? :)

Ciao.

Link al commento
Condividi su altri siti

Non conosco bene il C ma a naso sembra che il warning ti dica che tu stai usando un tipo di variabile al posto di un'altra. Se non ricordo male il char contiene un solo carattere mentre la stringa e' un array (o vettore) di char. Sembra quindi che tu passy un array dove la funzione si aspetta un solo carattere.

ciao

Roberto

Link al commento
Condividi su altri siti

Ciao Roberto.

In C le stringhe sono memorizzate come un array di char. Il nome dell'array è un puntatore al primo elemento, quindi passare una stringa ad una funzione che si aspetta un puntatore a char è corretto. Il warning si riferisce al type qualifier, cioè, a const.

Ciao.

Link al commento
Condividi su altri siti

Esattamente, grazie giacomo, funziona. :)

Mi ero scordato di specificare il compilatore, ma il buon giacomo pare leggere anche nel pensiero oltre al resto.

Si, mi era proprio passato di specificare rom.

thank you. B)

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...