PDA

View Full Version : [C] Leggere e scrivere su porta seriale


morrison81
01-06-2008, 18:10
Ciao a tutti,

dopo alcuni giorni di imprecazioni provo a chiedere aiuto a voi:D
Dovrei fare un programmino per leggere e scrivere su una porta seriale, nella fattispecie leggere da una porta (mettiamo COM1), manipolare i dati e stampare su un'altra (mettiamo COM2).
Vorrei arrivare ad avere un file .exe da poter eseguire da qualunque pc, con le relative porte ovviamente.
Premetto che l'unico linguaggio nel quale riesco a muovermi un pò è il C, ho già fatto questo programma usando matlab solo che sostanzialmente non è "trasportabile".
Ho girato e rigirato il web, ma piuttosto che chiarirmi mi sono venuti solo dubbi, quindi comincio con un pò di domande :D:

- si può fare in C?
- riesco a fare il programma e farlo girare da una finestra del prompt di windows?
- avrei problemi se usassi un adattatore seriale su porta usb?

Ho trovato qualche esempio, ma mi sono ritrovato imbrigliato tra C e C++, e non conoscendo bene la differenza sono ancora più confuso :muro:
Volendo potrei usare anche C++, però non avendolo mai usato non vorrei complicarmi ancora di più la vita.
Spero possiate darmi qualche delucidazione, poi casomai se ho altri dubbi aggiungo in seguito.
Grazie a tutti!
Ciao

morrison81
03-06-2008, 18:37
In attesa di qualche pio aiuto :rolleyes: aggiungo che sono riuscito a rifare quasi tutto il programma con python,
mi è sembrato molto semplice e simile al matlab.
Però il dubbio è lo stesso: sono riuscito anche a creare una cartella con l'exe e le
librerie, ma quanto è effettivamente "trasportabile"?
Qualcuno ha qualche esperienza in merito?
Grazie ancora.
Ciao

teox13
09-06-2008, 15:57
Si, si può anche con il C.
Se utilizzi linux il dispositivo collegato alla seriale lo vede come un file.
Per windows è diverso. Esistono varie librerie che ti aiutano, potresti richiamare qualche comando assembler oppure provare a vedere la libreria libusb(utilizando un adattatore..io una volta l'ho provato e funzionava!)

Ciao!

71104
09-06-2008, 23:00
potresti richiamare qualche comando assembler bummm...

morrison81
11-06-2008, 22:15
Grazie a tutti e scusate per il ritardo... troppo lavoro :rolleyes:

In realtà ho passato un altro paio di giorni a smanettare ma poi mi sono rotto le scatole e sono passato a python: mai usato ma mi sono trovato
benissimo ed ha gli stessi principi del matlab. Tra l'altro ho fatto anche un po di prove di "portabilità" e pare che su tre pc differenti funzioni senza
problemi a differenza del matlab.
Anzi, chiederei ai moderatori se possibile, di cambiare il linguaggio nel titolo, grazie.
Vi posto il codice


import serial
import msvcrt
ser = serial.Serial(4) #open first serial port
ser.timeout=None
ser1 = serial.Serial(0)
ckk="v"
ckk1="v"


print ser.portstr #check which port was realy used
print ser1.portstr #check which port was realy used
print "Premi un tasto per iniziare la simulazione"
a=msvcrt.getch()

while ckk1!="q":

while ckk!="t":
ser.flushInput()
print "LEGGI DA PORTA SERIALE"
code=ser.read(13)
.
.
.altre operazioni in mezzo
.
.
ser1.write(code)
print "Premi un tasto per continuare o T per uscire"
ckk=msvcrt.getch()

ckk="v"
print "ciao"
print "premi un tasto per ricominciare la simulazione o Q per uscire"
ckk1=msvcrt.getch()

ser.close() #close port
ser1.close() #close port



Adesso avrei un ultimo problema, vorrei fare il ciclo while in modo che si interrompa quando premo t o un tasto qualsiasi, il classico repeat until keypressed
senza dover ogni volta premere un tasto al termine del while.

Per ora sono riuscito solo a fare un while così


while not (msvcrt.kbhit() and msvcrt.getch() == "t"):


e settando un timeout sulla lettura in modo da non far bloccare il ciclo nel caso non legga da porta seriale. Il problema è che quando supero
il timeout perdo dal monitor tutte le informazioni perchè il cursore comincia a scorrere.
Grazie a tutti.
Ciao!