|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
Connessione seriale
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: Codice:
#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; } N.B: uso linux e il problema non e' sicuramente imputabile ai permessi. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
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. |
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#5 | ||
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
Quote:
Quote:
sei io faccio una prova ecco il risultato 11000010 |
||
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
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! Ultima modifica di LimiT-MaTz : 16-11-2005 alle 10:57. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
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 |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
unsigned char val = 0x3f;
write(fd, &val, 1);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:05.