Go Down

Topic: smadonnamenti con la seriale (Read 1 time) previous topic - next topic

lollotek

ciao a tutti questo è il mio primo post sul forum.
Sto iniziando un progetto nel quale mi devo interfacciare via seriale ad un altro componente, ma ho già dei problemi solo con l'invio dei comandi...

ho scritto il seguente codice:

Code: [Select]

int incomingByte = 0;      // for incoming serial data
int ledPin =  13;
byte select[] = {0x02,0x00,0x04,0x04,0x00,0x00,0x02};

void setup() {
 Serial.begin(9600);      // opens serial port, sets data rate to 9600 bps
 pinMode(ledPin, OUTPUT);
}

void loop() {

 Serial.write(select,7);
 if (Serial.available() > 0) {
   incomingByte = Serial.read();
   digitalWrite(ledPin, HIGH);
 }
 delay(500);
 digitalWrite(ledPin, LOW);
 delay(500);
 
}


che dovrebbe mandare un select e accendermi un led se ricevo una risposta.

Non vedendo la comunicazione funzionare mi sono messo a guardare nel serial monitor cosa mandavo.. e non è quello che mi aspetto!
il mio messaggio inizia con 0x02 cioè un STX, invece nel serial monitor vedo tutt'altro (credo fosse un 0xBF), non riesco a capirne la ragione.

Volevo capire se crea conflitto avere il cavo usb collegato e avere le uscite tx e rx collegate ad un'altra seriale.

Infine non capisco come mai mi trasmette sulla seriale solo con il cavo usb collegato e non quando alimento con la batteria, è perché al serial.begin non sente nessuna periferica collegata alla seriale?

grazie.


uwefed

ciao lollotek
Suppongo che hai un Arduino 2009.
Il problema é che hai attacato 2 cose sulla seriale (TX e RX); quei 2 pin vengono usati anche dal interfaccia USB-RS232 presente sulla scheda.
Il codice funziona, anche se non ho capito cosa vuoi spedire col comando
Code: [Select]
Serial.write(select,7);
Vedo che a ogni loop aspetti 1 secondo; l' hai voluto cosí?
Usa la libreria http://arduino.cc/en/Reference/SoftwareSerial per collegare il Tuo "altro componente".
L' ultima domanda non so rispondere.
Ciao Uwe

lollotek

Si, l'attesa di un secondo l'ho messa volutamente per non mitragriare troppo velocemente sulla seriale e riuscire a vedere il led di "debug".

nella parte:
Code: [Select]

byte select[] = {0x02,0x00,0x04,0x04,0x00,0x00,0x02};
Serial.write(select,7);


Voglio inviare la serie di byte, non è corretto?
Ho visto ora la libreria seriale, proverò con quella.

grazie mille.


uwefed

Ciao lollotek
Quel code dovrebbe essere giusto.
mi ripeto:
Il problema é che hai attacato 2 cose sulla seriale (TX e RX); quei 2 pin vengono usati anche dal interfaccia USB-RS232 presente sulla scheda.
Usa la libreria http://arduino.cc/en/Reference/SoftwareSerial per collegare il Tuo "altro componente".
Ciao Uwe

lollotek

ok, grazie mille, stasera ci provo...

Quote
altro componente


è così terribile quello che ho detto? comunque è un modulo rfid mifare, come potrei definirlo?

uwefed

ciao lollotek
Non é terribile , ti ho solo citato e per questo messo fra virgolette.  ;) :D
Ciao e buona fortuna.
Ciao Uwe

lollotek

Ok sto usando la libreria e funziona, però in uscita non ti trovo quello che mi aspetto..
io faccio :
Code: [Select]

 mySerial.print(2,BYTE);
 mySerial.print(0,BYTE);
 mySerial.print(4,BYTE);
 mySerial.print(4,BYTE);
 mySerial.print(0,BYTE);
 mySerial.print(0,BYTE);
 mySerial.print(2,BYTE);

Aspettandomi in uscita per esempio come primo carattere un STX, cioè il secondo carattere della tabella ascii.
invece leggendo il canale mi ritrovo in Hex i seguenti caratteri:
Code: [Select]

BF
F7
F7
FF
FF
FB
00
00


sbaglio qualcosa?
io sono in ascolto con le seguenti impostaizoni:
Baud rate: 9600
Parity: none
bit per data: 8
Stop bit: 1

che sono le stesse usate dal modulo rfid con il quale devo andare a comunicare..


uwefed

ciao lollotek

La funzione  mySerial.print(2,BYTE); da dove  la prendi? l' hai definta tu o fa parte di una libreria? Non so dirti niente se non so cosa fa la funzione.
ciao Uwe

lollotek

purtroppo non ho il codice a portata di mano altrimenti te lo posto tutto..
comunque myserial è derivato dalla SoftwareSerial.
sono partito dall'esempio della sotware serial, ed ho visto che si utilizza il metodo print per inviare i dati.
Io dovrei riuscire a mandare il secondo carattere della tabella ascii che sarebbe un STX, fatto questo penso che poi di conseguenza riuscirei a fare tutto il resto..

lollotek

allora stando a quanto dice qui

con questo comando
Code: [Select]

Serial.print(byte(78)) gives "N" (whose ASCII value is 78)

oppure
Code: [Select]
Serial.print(78, BYTE) gives "N"
io mando il carattere numero "78"

che è il metodo che appunto ho usato come indicato di sopra..

anche qui indica lo stesso genere di problema.

è possibile che basglio qualcosa a livello hardware? io mi sono collegato con l'rx di una seriale aggiuntiva al pin che uso come tx con la software serial, e le cose non mi quadrano, potrebbe esserci per qualche strano motivo un disallineamento dei bit?

questa sera faccio altre prove e posto il codice completo.

lollotek

#10
Apr 20, 2010, 07:41 pm Last Edit: Apr 20, 2010, 07:57 pm by lollotek Reason: 1
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 4
#define txPin 5

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup() {

 pinMode(rxPin, INPUT);    // imposto rx in entrata
 pinMode(txPin, OUTPUT); // imposto tx in uscita
 
 mySerial.begin(9600);     // apro la software serial
 
}

void loop() {
 mySerial.print(byte(2)); // dovrei ritrovarmi STX
 delay(2000);
}


questo è il codice, e mettendomi in ascolto mi spara fuori il carattere "?" cioè 0x3F, anziché 0x02.

qualcuno sa darmi qualche spiegazione?

[edit]..inizia a venirmi il dubbio che sia la mia porta da usb a seriale che uso per controllare l'uscita che funzioni male..[/edit]

uwefed

ciao lollotek
Alcune domande cretine.
L' ordine dei Bit é giusto?
Il baudrate sono uguali?
Tu hai collegato la seriale del PC con i piedini 4 e 5 del Arduino? direttamente o hai messo qualche elettronica in mezzo?
Ciao Uwe

lollotek

si si, i baudrate è uguale, ripeto, io sono in scolto con le seguenti impostazioni:
Baud rate: 9600
Parity: none
bit per data: 8
Stop bit: 1

dal piedino 5 faccio partire un filo che va a toccare l'rx del cavo usb-seriale al qule però ho messo un mini attacco incrociato in modo da avere la parte "femmina" dove mettere il mio filo.

ho provato anche ad attaccare il cavo usb seriale ad un'altra porta usb, ed ad usare la libreria NewSoftwareSerial, ma i risultati sono comunque identici.

tu per ordine dei bit che intendi? mandandogli solo un carattere mi aspetto di leggere solo quello.
mi pare di aver provato di tutto, per questo mi viene da accusare il cavo usb-seriale.
ah, poi la massa è quella del pc, perchè comunque l'arduino è alimentato dal suo cavo usb.
Devo forse fare qualche altra impostazione di pinMode o impostare come alta o bassa l'uscita?

uwefed

#13
Apr 21, 2010, 04:11 pm Last Edit: Apr 21, 2010, 04:12 pm by uwefed Reason: 1
Ciao lollotek
Le uscite RX-Tx delArduino non hanno i livelli di tensione conforme alla RS232.
Il arduino ha i livelli HIGH: 5V e LOW: 0V mentre la RS232 i livelli sono definiti HIGH +3V a +25V e LOW -3 a -25V
Ti serve un adattatore tipo MAX232. o equivalente che Ti produce dai 5V +/- 8V.
Non so che adattatore USB-RS232 usi. Se usi uno da PC hai questo problema; Potresti usare per un telefonino; alcuin modelli hanno dalla parte telefonino il livelli logici adatti (non so dirti quale adattatore per quale modello di telefonino va bene.

L'ordine dei bit é se viene mandato prima quello la cifra piú bassa (1) o prima quella piú alta (128).

Ciao Uwe

lollotek

ah caspita, mi tocca farmi il circuitino quindi?
però mi sorge spontaneo un dubbio.. ma allora quelli che usano il Parallax (lettore rdif 125Khz) dovrebbero anche loro fare questa modifica? non mi pare di averlo mai visto.. collegano in reader e basta.

Anche nel mio caso vedere la comunicazione sulla seriale del pc sarebbe un "extra" l'importante è comunicare con il mio modulo rfid, che però usando anch'esso un'alimentazione da 5v credo che anche lui viaggi sugli stessi livelli di tensione dell'arduino per la comunicazione 232..

Go Up