Newsgroup: it.hobby.elettronica.digitale
Titolo: Comunicazione Seriale

Voglio far comunicare un pic 16F84 con un PC senza utilizzare
l'hiperterminal. La parte del microcontrollore l'ho realizzata, grazie a
Tanzilli. Ma il programma sul PC ho scoperto che è ben più arduo da
realizzare.
Ho scoperto che su Windows (non considerando quelli al di sotto il 98) è un
casino, poichè accedendo alla porta seriale si crea un eccezione, che è un
bordello togliere.
Allora mi sono avvicinato al mondo Linux, dove è tutto più "semplice", forse
ho usato impropriamente la parola, poichè ho trovato si meno ostacoli, ma
dopo un tre giorni di bestemmie, mi sono arreso.
Il programma che ho fatto, riesce si ha inviare ma non riesce a ricevere.
C'è qualche anima pia che possiede un esempio scritto in C (per linux) di
comunicazione seriale completo?
In modo da poter confrontare quello che ho fatto e capire dove ho sbagliato.
se possibile rispondetemi all'indirizzo (togliere la faccina) :
?
elfi...@libero.it
Grazie a chiunque mi aiuterà

Scusate la faccina è diventata un punto interrogativo

Ciao, Vibo!
Il giorno 31/07/2003 alle ore 00:59 hai scritto:
 V> Ho scoperto che su Windows (non considerando quelli al di sotto il 98) è
 V> un casino, poichè accedendo alla porta seriale si crea un eccezione, che
 V> è un bordello togliere.
Ma che vai dicendo, un'eccezione ? Ma in che film ?
Lancia il Visual Basic e inserisci nel form un Microsoft Comm Control, poi
vai su 
msdn.microsoft.com
 e cercati la documentazione, con tanto di esempi.
 V> Allora mi sono avvicinato al mondo Linux, dove è tutto più "semplice",
 V> forse ho usato impropriamente la parola, poichè ho trovato si meno
 V> ostacoli, ma dopo un tre giorni di bestemmie, mi sono arreso.
Ah sicuramente piu' semplice.
 V> Il programma che ho fatto, riesce si ha inviare ma non riesce a
 V> ricevere.
Le seriali sotto Linux si gestiscono come normali file quindi dovrebbero
funzionare le normali istruzioni fread, fgetc, ecc.
 V> C'è qualche anima pia che possiede un esempio scritto in C (per linux)
 V> di comunicazione seriale completo?
Hai provato ad inserire qualche parolina in un qualsiasi motore di ricerca ?
Bye

 In modo da poter confrontare quello che ho fatto e capire dove ho sbagliato.
Io uso minicom con il 16F877; attenzione a settare i parametri della
seriale.
In particolare, se usi la seriale a "tre fili" (solo massa, tx e rx)
devi disabilitare
tutti i controlli di flusso, sia hardware che software.
Per fare questo:
- da minicom, usa il menu di configurazione;
- dalla shell, usi "stty"
- dal codice C usa le funzioni di termios.h (tcsetattr() dovrebbe
bastare, "man tcsetattr")
Di solito il problema č il controllo di flusso abilitato.
In bocca al lupo.

Il programma che ho fatto, riesce si ha inviare ma non riesce a ricevere.
Il problema è di autorizazioni ( anche qui :D ) avovo trovato un
programma che settave le autorizzazioni ma pultroppo non le ho + sotto
mano...  vediamo se lo ritovo... l'ho cercato boh 5 giorni fa vediamo
nella history...
No non lo trovo cmq domani chiedo in giro se torvo qualcosa ti faccio
sapere
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
ICQ     : 67552596
-----------------------------------------------
Founder of MediaPlayer Project
http://mpp.iwebland.com

Ciao, Il!
Il giorno 01/08/2003 alle ore 01:25 hai scritto:
 IR> Su windows ( con kernel NT ) hanno le porte chiuse ai processi nomali
 IR> bisognerebbe scrivere un drv ( che anno invece  pieno diritto ed
 IR> accesso alle porte ) per fortuna una azioneda l'ha fatto per noi ora
 IR> vediamo se ritorovo il link
E' vero che sotto NT le porte non sono accessibili, ma la porta seriale (di
cui si sta parlando) e' perfettamente accessibile a tutti, basta sapere cosa
usare e ci sono milioni di siti che lo spiegano.
Bye

 The Only Good Windows is an uninstalled Windows
Ti riferisci a creare un driver che chiama Ke386IoSetAccessProcess() per
alzare l'IOPL di un processo a scelta, avevo provato a seguire anche questa
strada, ma non ho trovato materiale.
La strada che avevo provato a seguire era quella di creare un driver in
stile /dev/port di Linux che espone un oggetto periferica che traduce
richieste di lettura e scrittura in chiamate alle varie READ_PORT_*() /
WRITE_PORT_*()
E il programma che ho fatto riesce a spedire ciò che mi interessa sulla
seriale (testato con oscilloscopio), ma nel momento che deve leggere: buio.
E poi mi fa un altra cosa stranissima, appena il PIC riempie il buffer della
seriale del PC con ad esempio un byte, viene subito svuotato, rispedendo il
byte al PIC, tutto senza che la READ_PORT*() veda niente.
Hai qualche informazione su questo approccio?
Grazie a tutti del tempo che mi avete dedicato

 cui si sta parlando) e' perfettamente accessibile a tutti
Uh? un po' contraddittorio :)
Cmq la soluzione più lampante credo che sia usare l'ActiveX MsComm per
controllare la seriale, come hai già detto.
Non so come sia fatto, cmq riesce a controllare la seriale anche su XP.
--
...:::Zmaster:::...
DSL powered
zmast[ANTISPAMSYSTEM]@
freemail.it
www.zmasterworld.8m.com
Collaboratore del Media Player Project


Ma l'ActiveXMsComm funziona con il VB o con il C++?

 In bocca al lupo.
Non sono sicuro se l'ho disabilitato, ma mi sembra di si, semmai non riesco
a capire cosa devo settare per evitare che quello che spedisco dal micro
verso il pc venga rispedito automaticamente.

Ciao, Zmaster!
Il giorno 01/08/2003 alle ore 14:18 hai scritto:
 >> E' vero che sotto NT le porte non sono accessibili, ma la porta seriale
 Z> (di
 >> cui si sta parlando) e' perfettamente accessibile a tutti
 Z>
 Z> Uh? un po' contraddittorio :)
Per niente se per porte intendi porte di I/O generiche.
 Z> Cmq la soluzione più lampante credo che sia usare l'ActiveX MsComm per
 Z> controllare la seriale, come hai già detto.
 Z> Non so come sia fatto, cmq riesce a controllare la seriale anche su XP.
Ma va' ?
Leggere un po' di documentazioni no vero ?
Ti diro' di piu', udite udite, si puo' fare anche in C... come ? La
soluzione alla prossima puntata.
Bye

 soluzione alla prossima puntata.
da quello che so ci sono alcuni metodi per superare l'ostacolo, tipo usare
driver appositi, disabilitare le protezioni di windows, ecc. ecc. lascio a
te presentarli.



con visual c++ lo puoi usare, mentre col c++ puro non penso.


Ciao, Zmaster!
Il giorno 01/08/2003 alle ore 18:20 hai scritto:
 Z> Vediamo: tu hai detto che le porte I/O non sono accessibili da un
 Z> windows con core NT, giusto?
Giusto.
 Z> la porta seriale è una di queste porte, come la parallela (a meno che
 Z> non sia cambiato qualcosa negli ultimi pc di cui non sono a conoscenza
 Z> :) Quindi a ragion di logica anche la seriale non dovrebbe essere
 Z> accessibile. (parlando in termini di controllo diretto)
Se vuoi controllarla direttamente in assembler con le istruzioni di in e out
ma dove e' scritto che per comunicare con la seriale e' necessario
programmare le routine di interrupt in assembler ? In DOS era cosi' ma non
si parlava di DOS o sbaglio ?
 Z> Come ho già detto non so come funzioni il controllo MSComm, forse con le
 Z> API riesce a fare qualcosa.
Si con le API e il miele. Ma prima di intervenire potresti almeno conoscere
l'argomento di cui si parla ? Ho detto che basta inserire quel controllo in
un form Visual Basic e documentarsi sul sito 
msdn.microsoft.com
 su come
usarlo, non e' necessario usare nessuna API. Poi se vuoi sapere come
funziona e rappresenti un Governo puoi sempre chiedere il sorgente alla
Microsoft.
 Z> Effettivamente è banale, ma per chi non ne ha mai sentito nominare
 Z> bisogna pur farglielo presente, no?
Viene dato con il Visual Basic caspita, non ci vuole molto a trovarlo, come
non ci vuole molto a trovare con Google come si usano le seriali in Windows.
Secondo te come ho fatto io a sapere che esiste quel controllo ? Credi che
sia nato con le API di Windows gia' codificate nel DNA ?
 Z> da quello che so ci sono alcuni metodi per superare l'ostacolo, tipo
 Z> usare driver appositi, disabilitare le protezioni di windows, ecc. ecc.
 Z> lascio a te presentarli.
Si certo come no, reinventiamo la ruota ogni volta,  guarda che basta la
normale funzione CreateFile e le funzioni collegate per leggere e scrivere
sulla seriale (guardacaso similmente a quanto accade in Linux in cui usare
la seriale e' come leggere e scrivere sequenzialmente su un file), senza
tante cavolate.
Naturalmente si trova tutto in rete con un motore di ricerca, ma sia mai che
qualcuno faccia troppa fatica, meglio dire castronerie.
Bye

 qualcuno faccia troppa fatica, meglio dire castronerie.
nella maggiora parte dei casi con una buona ricera sul caro vecchio Google
si trova tutto ciò che si cerca, ma se uno chiede, come è il caso di Vibo, è
buona norma rispondere.
Per tua norma e regola io non vedo castronerie nei miei post. Se dico una
cosa di solito è perchè sono sicuro al 95% di quello che dico.
Inoltre, non vedo il motivo di scaldarsi tanto, un minimo di netiquette si
osserva. Questa volta mi hai fatto un po' girare i suddetti. Che figura ci
stai facendo fare col NG?
Io direi che se la funzione di cui hai parlato può essere utile al nostro
amico, beh, allora spiegala e poi vediamo di chiudere questo squallido
thread.


Ciao, Zmaster!
Il giorno 01/08/2003 alle ore 20:35 hai scritto:
 Z> Si parlava di controllo diretto.
Dove ? Definisci controllo diretto.
 Z> Se tu avessi letto con un minimo di attenzione il primo post di Vibo,
 Z> avresti notato che lui stava provando ad usare la seriale in C.
Si per Linux, mentre per Windows ha detto che era un casino.
 Z> Allora, ormai ho capito che programmi in Visual Basic, non serve che lo
 Z> ribadisci in ogni riga.
E' solo uno dei linguaggi che uso, ma e' anche il piu' semplice per fare
certe cose.
 Z> So benissimo che con VB trovi quel controllo, l'ho già usato pure io.
 Z> Il fatto è che lui era partito con un altro linguaggio di
 Z> programmazione, non è detto che sia disposto a passare a VB, questo
 Z> dovrà dircelo lui.
Veramente non ha detto niente sul linguaggio, ha solo parlato di ambiente e
che non si poteva fare.
 Z> Mi pare che per quanto riguarda i driver appositi Il Razziatore ne abbia
 Z> già proposto uno, disabilitare le protezioni basta usare comodi
 Z> programmini già fatti, ... non vedo il tuo problema.
Il problema e' che per la seriale questa e' un'emerita castroneria perche'
non e' cosi' che si usano, ne sotto Windows 98, ne NT, ne XP e tantomeno
Linux.
 Z> Ah, finalmente dopo un sacco di post spazzatura vedo che forse abbiamo
 Z> trovato una soluzione per il nostro amico.
 Z> Ci voleva tanto a parlare di questa funzione? nooo, meglio prima spalare
 Z> merda a destra e a manca.
Ci vuole tanto ad ammettere la propria ignoranza e parlare solo di cose che
si conoscono ? Io ho risposto dando il suggerimento del Visual Basic, se non
gli andava bene poteva benissimo chiedere se conoscevo una soluzione per un
altro linguaggio, non e' che posso elencare le soluzioni per tutti i
linguaggi che esistono al mondo.
 Z> nella maggiora parte dei casi con una buona ricera sul caro vecchio
 Z> Google si trova tutto ciò che si cerca, ma se uno chiede, come è il caso
 Z> di Vibo, è buona norma rispondere.
E' quello che ho fatto, mi pare.
 Z> Per tua norma e regola io non vedo castronerie nei miei post. Se dico
 Z> una cosa di solito è perchè sono sicuro al 95% di quello che dico.
Il problema e' quel 5% che frega, ma non sei solo tu a scrivere castronerie,
ma piu' o meno tutti quelli che hanno risposto, parlando di permessi, di
autorizzazioni, di disabilitare le protezioni, driver scritti
appositamente... era dai tempi del DOS che non leggevo simili cose (si vede
che gli elettronici sono rimasti un po' indietro con la tecnologia
informatica).
 Z> Inoltre, non vedo il motivo di scaldarsi tanto, un minimo di netiquette
 Z> si osserva. Questa volta mi hai fatto un po' girare i suddetti. Che
 Z> figura ci stai facendo fare col NG?
Se uno dice cavolate mi scaldo eccome, soprattutto quando le presenta come
uniche soluzioni ad un problema banale. Quando si risponde ad una qualsiasi
domanda lo si dovrebbe sapere di cosa si sta parlando, io non mi azzardo mai
a dare una risposta se non sono sicuro al 100% che sia corretta.
 Z> Io direi che se la funzione di cui hai parlato può essere utile al
 Z> nostro amico, beh, allora spiegala e poi vediamo di chiudere questo
 Z> squallido thread.
Questo e' solo il primo link che ho trovato facendo una ricerca con Google,
tempo totale 10 secondi:
http://www.ontrak.net/mfc.htm
Bye

 di esempi.
Mi sembra che Vibo non abbia mai parlato di VB, la domanda è stata:
VIBO> C'è qualche anima pia che possiede un esempio scritto in C (per
VIBO> linux) di comunicazione seriale completo?
VIBO> In modo da poter confrontare quello che ho fatto e capire dove ho
VIBO> sbagliato.
dove richiede esplicitamente codice C per LINUX. Ora rispondergli in
quella maniera presupponendo che:
1 - Vibo abbia Visual Basic (che costa, a differenza di un compilatore c
    tipo Borland).
2 - Vibo sappia cmq programmare in VB.
3 - voglia tornare su piattaforma Window.
e tirare su tutto un thread con Zmaster presupponendo infine di aver
anche ragione... almeno mettete un OT davanti.
Ciao,
-- 
+--------+ ASCII ribbon campaign ( )
|  kral  |  - against HTML email  X 
+--------+              & vCards / \

Ciao, kral!
Il giorno 04/08/2003 alle ore 11:04 hai scritto:
 k> Mi sembra che Vibo non abbia mai parlato di VB, la domanda č stata:
Stai quotando la parte sbagliata del messaggio, infatti se tu avessi letto
la mia risposta, compreso il quoting, avresti notato che ho risposto alla
sua affermazione:
  V> Ho scoperto che su Windows (non considerando quelli al di sotto il 98)
č
  V> un casino, poichč accedendo alla porta seriale si crea un eccezione,
che
  V> č un bordello togliere.
Cosa che e' assolutamente falsa per la porta seriale.
 k> dove richiede esplicitamente codice C per LINUX.
Infatti, leggendo la mia risposta attentamente e non superficialmente come
hai fatto, ho detto:
  > Le seriali sotto Linux si gestiscono come normali file quindi dovrebbero
  > funzionare le normali istruzioni fread, fgetc, ecc.
e anche:
  > Hai provato ad inserire qualche parolina in un qualsiasi motore di
ricerca ?
Quest'ultima indica chiaramente che tutto quello che ha chiesto e'
disponibile su migliaia di siti facilmente rintracciabili con un motore di
ricerca, visto che l'uso delle porte seriale, specialmente su Linux, non e'
certo un segreto industriale.
 k> 1 - Vibo abbia Visual Basic (che costa, a differenza di un compilatore c
 k>     tipo Borland).
Non ho la sfera di cristallo e quindi non so che linguaggi ha a diposizione,
ho dato UNA possibile soluzione, che incidentalmente e' anche la piu'
semplice, nulla vietava di chiedere una soluzione per un altro linguaggio.
 k> 2 - Vibo sappia cmq programmare in VB.
Idem come sopra.
 k> 3 - voglia tornare su piattaforma Window.
Mi sembra che il problema non fosse la piattaforma ma il come usare le
seriali, infatti l'affermazione:
  > Allora mi sono avvicinato al mondo Linux, dove č tutto piů "semplice",
forse
  > ho usato impropriamente la parola, poichč ho trovato si meno ostacoli,
ma
  > dopo un tre giorni di bestemmie, mi sono arreso.
Indica che nemmeno sotto Linux c'e' riuscito nonostante la mole di
documentazione facilmente reperibile.
 k> e tirare su tutto un thread con Zmaster presupponendo infine di aver
 k> anche ragione... almeno mettete un OT davanti.
Fino a questo momento nessuno ha dimostrato che quello che ho detto e' falso
e altri hanno proposto soluzioni che presuppongono una scarsa, se non nulla,
conoscenza del problema, cosa che mi fa particolarmente imbestialire perche'
contribuiscono, con la loro ignoranza, a disinformare.
In futuro faresti meglio ad evitare le figure da cioccolataio, come quella
che hai appena fatto, quotando le parti corrette dei messaggi.
Bye

 dovrebbero funzionare le normali istruzioni fread, fgetc, ecc.
Qui si sbaglia, ci sono delle funzioni apposite per leggere e scrivere
sui device e sicuramente sono gestite in maniera + semplice che in
Windows:
http://www.easysw.com/~mike/serial/serial.html



Quando ti trovi in situazioni simili ci sono un numero di variabili che ti
possono creare problemi.
Se ti posso dare un consiglio io seguirei questa procedura:
Per prima cosa devi avere dei punti fermi ed escludere piu' variabili
possibili.
Anche se non vuoi usare l'hiperterminal nella tua applicazione finale, in
fase di debug h.t. e' un programma che ti *garantisce* di poter comunicare
con un dispositivo seriale. Io in genere in prima battuta uso h.t., che *so
funzionare*.
Se la comunicazione con h.t. funziona, ragionevolmente l'hardware e' ok ed a
questo punto ti puoi prendere i settaggi di h.t. ed usarli nel tuo progetto
software. Da qui in poi saprai che tutto quello che non funziona e' solo
dovuto al tuo software.
Se non funziona ci potrebbe essere un problema hardware (cavi/collegamenti)
o di protocollo (xon-xoff o che) o altro ancora (il PIC??), a te capire
perche'.
 
Per quanto riguara l'uso di seriali su Win > 98 e' corretto dire che
*servirebbe* di andare a basso livello con tools appositi per gestire
l'UART, il fatto e' che la comunicazione seriale non la usi solo tu e la
ruota (per nostra fortuna) l'hanno gia' inventata ;-).
Esistono certamente dei tools per il tuo linguaggio di programmazione che ti
permetteranno di gestire la seriale.
Questo vale praticamente per ogni linguaggio/sistema operativo.
Puoi eventualmente chiedere lumi su it.comp.lang oppure it.comp.programmare
su cosa usare e frammenti di codice.
Spero ti possa essere d'aiuto.
Ciao
Marasali
--------------------------------
Inviato via 
http://usenet.libero.it

Ciao, kral!
Il giorno 04/08/2003 alle ore 11:58 hai scritto:
 k> A me sebra che Vibo non parli di VB. In effetti non menziona nessun
 k> linguaggio. (Con il termine eccezione poteva intendere anche Java).
Ma quanto siete noiosi e' cosi' tanto difficile accettare che qualcuno abbia
dato una risposta corretta al vostro posto ? Ho detto e ripeto che quello
che ho scritto e' solo *uno* dei modi per accedere alla seriale ed e' il
modo *piu' semplice* che io conosca e l'ho scritto per contestare
un'affermazione errata. Non posso certo mettermi ad elencare tutti i metodi
per usare la seriale in tutti i linguaggi esistenti.
 k> Cmq io criticavo il tono della sua risposta e il conseguente inutile
 k> thread. Certamente non la soluzione, che può andar bene per chi ha VB.
L'inutile thread e' scaturito da chi i messaggi li legge superficialmente e
pensa di dare delle risposte senza sapere cio' di cui si sta parlando. Chi
non ha VB potrebbe semplicemente chiedere la soluzione per il linguaggio che
usa e ancora meglio potrebbe usare un newsgroup di programmazione e non di
elettronica digitale per fare questo tipo di domande.
 k> Qui si sbaglia, ci sono delle funzioni apposite per leggere e scrivere
 k> sui device e sicuramente sono gestite in maniera + semplice che in
 k> Windows:
Hai ragione, ho messo una f di troppo convinto che si potesse usare la fopen
per aprire il device seriale (cosa che comunque non escludo si possa fare)
infatti nella pagina che hai citato vengono usate:
    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    n = write(fd, "ATZ\r", 4);
    close(fd);
Che sono comunque le funzioni standard che si usano per accedere a qualsiasi
altro file, come avevo detto, quindi non sono tanto apposite come credi.In
Window si usano praticamente le stesse funzioni, solo che hanno la
denominazione delle librerie Microsoft (CreateFile anziche' open, WriteFile
anziche' write e CloseHandle anziche' close) e sono comunque le funzioni
standard per accedere ai file esattamente come con Linux.Quindi niente
eccezioni, niente driver appositi, niente disabilitazione delle protezioni,
niente di tutte le castronerie che sono state dette da altri.Bye

 come con Linux.
Quello che dice è tutto giusto quel che dice, (anche se parlavo di fcntl
e ioctl). Questa è la risposta che aspettava Vibo. Se lei avesse dato
subito questa risposta (con esempio, non solo guarda "fread, fgetc,
ecc.") si sarebbe risparmiato la fatica di rispondere ai vari messaggi
come il mio. Anche qui cmq, concordo che una ricerca su google avrebbe
risolto il problema di Vibo in un baleno.
Senza rancore, 
(non risponderò cmq ad altri post sull'oggetto)
