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.
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.