LimiT-MaTz
22-02-2006, 11:35
Ciao a tutti,
Ho "costruito" un device composto da 2 microcontrollori che devono lavorare (cooperare).
Dapprima mi son occupato della parte ricevente, invio dati dal pc sulla porta seriale e questi vengono analizzati perfettamente e processati dal microcontrollore.
Ok la parte ricevente del dispositivo sono sicuro al 100% che funzioni correttamente.
Ora andiamo a occuparci della parte trasmittente, per prova ora impostiamo il tutto in modo che mandi sulla Seriale una Serie di ('A') infinite.
Ok, a questo punto proviamo a collegare l'uscita del dispositivo trasmittente a quello ricevente.
Il dispositivo si "accorge" che sta ricevendo una serie di 'A'
Ora colleghiamo il tutto a un PC.
Con windows => apro hyperterminal e imposto 9600 bps 8 bit no bit parità
e vedo lo schermo riempirsi di 'A'
Perfetto funziona.
Ora andiamo a scrivere un programmino Prova per linux:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <fstream.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
using namespace std;
int main(int argc , char **argv)
{
char *buff;
int cont=0;
buff = new char[10];
int seriale = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if(seriale == -1){
cout<<"ERROR:"<<endl;
cout<<" Cannot Open Device < "<<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;}
while(1)
{
if(cont=read(seriale,buff,10)>0)
cout<<buff<<endl;
cout<<c
}
return 0;
}
A prescindere dalla schifezza in se (mi serve solo da test) andiamo a leggere...
e voila:
Non legge nulla
Cosa peggiore manda una serie di segnali (che non mi e' facile decifrare) sulla linea di send
il problema quindi e' sicuramente di impostazione della seriale
Ho scritto anche un altro programmino (che da pc invia alla seriale) con le stesse opzioni di sopra e questo va a scrivere perfettamente.
Sapreste aiutarmi?
Ho "costruito" un device composto da 2 microcontrollori che devono lavorare (cooperare).
Dapprima mi son occupato della parte ricevente, invio dati dal pc sulla porta seriale e questi vengono analizzati perfettamente e processati dal microcontrollore.
Ok la parte ricevente del dispositivo sono sicuro al 100% che funzioni correttamente.
Ora andiamo a occuparci della parte trasmittente, per prova ora impostiamo il tutto in modo che mandi sulla Seriale una Serie di ('A') infinite.
Ok, a questo punto proviamo a collegare l'uscita del dispositivo trasmittente a quello ricevente.
Il dispositivo si "accorge" che sta ricevendo una serie di 'A'
Ora colleghiamo il tutto a un PC.
Con windows => apro hyperterminal e imposto 9600 bps 8 bit no bit parità
e vedo lo schermo riempirsi di 'A'
Perfetto funziona.
Ora andiamo a scrivere un programmino Prova per linux:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <fstream.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
using namespace std;
int main(int argc , char **argv)
{
char *buff;
int cont=0;
buff = new char[10];
int seriale = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if(seriale == -1){
cout<<"ERROR:"<<endl;
cout<<" Cannot Open Device < "<<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;}
while(1)
{
if(cont=read(seriale,buff,10)>0)
cout<<buff<<endl;
cout<<c
}
return 0;
}
A prescindere dalla schifezza in se (mi serve solo da test) andiamo a leggere...
e voila:
Non legge nulla
Cosa peggiore manda una serie di segnali (che non mi e' facile decifrare) sulla linea di send
il problema quindi e' sicuramente di impostazione della seriale
Ho scritto anche un altro programmino (che da pc invia alla seriale) con le stesse opzioni di sopra e questo va a scrivere perfettamente.
Sapreste aiutarmi?