PDA

View Full Version : Connessione seriale


LimiT-MaTz
16-11-2005, 09:58
Vi posto ora un programmino di test che mi serve per inviare un byte sulla seriale. Dall'altro lato della seriale c'è un microcontrollore che mi fa il display del byte ke mando ( per intenderci un array di led ).

Sono sicuro che il microcontrollore sia programmato bene (.ASM) ho fatto tutti i test del caso, e' programmato per leggere dati che arrivato a 9600 1 bit di start 8 di dato 1 stop (NO PARITY).

il problema è che se io mando il carattere 'A' alla fine non ottengo la cod ASCII giusta (viene una cifra sbagliata)

Il mio problema quindi e' quello di capire se realmente vado a 9600 bps o meno. Secondo me l'errore e' proprio qui.

Ho provato ad usare setserial /dev/ttyS0 baud_base 9600
e dare un "echo A > /dev/ttyS0"
e alla fine ottengo lo stesso risultato (cifra binaria) che ottengo eseguendo il seg programma:

#include <iostream.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
int main(int argc,char * argv[])
{
int seriale = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);
if(seriale == -1){
cout<<"ERROR:"<<endl;
cout<<" Cannot Open Device < "<<argv[1]<<" >"<<endl;
exit(1);
}
struct termios options;
tcgetattr(seriale, &options);
cfsetispeed(&options ,B9600);
cfsetospeed(&options ,B9600);
// struttura lungezza
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
// struttura tempi
options.c_cc[VMIN]=0;
options.c_cc[VTIME]=1;
//
options.c_cflag |= (CLOCAL | CREAD);
if(tcsetattr(seriale, TCSANOW, &options) != 0){
cout<<"ERRORE"<<endl;}
// write on seriale
int wordwritten = write(seriale,argv[2],1);
cout<<"Write: "<<wordwritten<<"char"<<endl;
close(seriale);




return 0;
}

Consigli sul da farsi?

N.B: uso linux e il problema non e' sicuramente imputabile ai permessi.

ilsensine
16-11-2005, 10:19
Il settaggio sembra corretto. A riprova, usa un altro computer connesso con un null modem cable, con minicom aperto con le stesse impostazioni per la seriale, e verifica che la 'A' viene ricevuta.

LimiT-MaTz
16-11-2005, 10:24
Ho provato a scrivere direttamente su un terminale /dev/tty1 e e' apparsa la lettera sul framebuffer.
E' possibile che quello che mando alla seriale non usi la codifica ASCII?

per quanto riguarda la prova che mi hai detto di fare ora ho solo questo pc nel fine settimana cmq dovrei riuscire a testarlo.

ilsensine
16-11-2005, 10:29
Ho provato a scrivere direttamente su un terminale /dev/tty1 e e' apparsa la lettera sul framebuffer.
tty* non hanno nulla a che vedere con le seriali
E' possibile che quello che mando alla seriale non usi la codifica ASCII?
Non usa nessuna codifica; byte in -> byte out.

LimiT-MaTz
16-11-2005, 10:35
tty* non hanno nulla a che vedere con le seriali



Non sono le "console" ?


Non usa nessuna codifica; byte in -> byte out.

quindi se io scrivo la 'A' -> 01000001 dovrebbe uscire questo
sei io faccio una prova ecco il risultato 11000010

ilsensine
16-11-2005, 10:43
Non sono le "console" ?

Sono "terminali virtuali" (che possono essere usati come console).

LimiT-MaTz
16-11-2005, 10:50
Tornando a noi secondo te il problema quale potrebbe essere?

EDIT: provato anche con Ms HyperTerminal e il risultato e' esattamente lo stesso.
Quindi potrebbe essere un problema del firmware.
Provvedero' a fare tutti gli accertamenti necessari... certo avessi un oscilloscopio sarebbe tutto molto + semplice!

LimiT-MaTz
16-11-2005, 22:18
Ho risolto il problema avevo sbagliato un ritardo, e quindi il tutto non funzionava.

Ho ancora un problemino:
esiste una funzione che mi permette di inviare un valore binario.
ovvero vorrei che uscisse dalla seriale un byte cosi' fatto '00111111'

N.B: il byte che ho scritto e' puramente casuale.

Grazie

ilsensine
17-11-2005, 08:06
unsigned char val = 0x3f;
write(fd, &val, 1);