PDA

View Full Version : [C] comunicazione seriale rs232


sado93
10-03-2010, 18:01
Ciao a tutti. Sono nuovo del forum, quindi scusatemi se non posto nella sezione giusta.
allora mi spiego: io dovrei creare un programma in c o c++ che mi invii un carattere ascii o un numero binario da 8 bit tramite la porta seriale, senza bit di parità, senza handshake e se possibile anche senza bit di stop, quindi 8 bit puliti. La velocità di trasmissione mi servirebbe la più bassa possibile. Ho cercato su google se esiste qualche libreria o qualche guida ma senza successo. Uso windows 7, come compilatore invece Dev C++.

Marinelli
10-03-2010, 23:28
Benvenuto sul forum. :)

Ti sposto nella sezione dedicata alla programmazione.

Ciao!

fero86
11-03-2010, 00:29
butta Dev-C++ e usa Visual C++ 2008 Express, oppure la RC della versione 2010.

per comunicare con la seriale devi usare le Communications Resources: http://msdn.microsoft.com/en-us/library/aa363196(VS.85).aspx

C e C++ non forniscono librerie standard per comunicare con la seriale.

PS: grazie per aver specificato sistema operativo e compilatore, anche se il compilatore era farlocco :D
é una cosa piuttosto rara da queste parti.

fero86
11-03-2010, 00:30
altra cosa, sei obbligato ad usare C o C++? in Visual C# sarebbe molto piu semplice.

deviato
11-03-2010, 13:33
Mi ricordo che alle superiori mi fecero fare un programma del genere inglobando una parte di listato in assembler. Mi pare si dovesse iniziare con qualcosa del tipo _asm e poi una serie di interrupt.. eheh alla fine riuscivamo a fare il DIR su un'altra macchina della rete.. A quei tempi sembrava una cosa da fantascenza.. :sofico: Se lo trovo te lo posto però non so se Dev-C++ farà problemi.. a quei tempi girava il QC..

sado93
11-03-2010, 14:55
intanto grazie per le risposte!!!!!

butta Dev-C++ e usa Visual C++ 2008 Express, oppure la RC della versione 2010.

per comunicare con la seriale devi usare le Communications Resources: http://msdn.microsoft.com/en-us/library/aa363196(VS.85).aspx

C e C++ non forniscono librerie standard per comunicare con la seriale.

PS: grazie per aver specificato sistema operativo e compilatore, anche se il compilatore era farlocco :D
é una cosa piuttosto rara da queste parti.
.....ho specificato perchè mi sembrava importante...:D


altra cosa, sei obbligato ad usare C o C++? in Visual C# sarebbe molto piu semplice.

il problema è che Visual C# non lo so utilizzare....:D



Non è che qualcuno sarebbe cosi gentile da postare un pezzo di codice con una minima spiegazione???:p

fero86
11-03-2010, 17:33
ti avverto, in Visual C# sarebbe di un semplicitá imbarazzante!!
si tratta di usare la classe SerialPort nel namespace System.IO.Ports. to', c'é anche l'esempio giá pronto :asd:
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx


se sei assolutamente determinato col C++ tanto per cominciare auguri :asd:, poi dovresti aprire un HANDLE che identifica la porta passando certi parametri alla CreateFile, trovi tutti i dettagli al paragrafo "Communications Resources" della documentazione di CreateFile: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

poi per settare le impostazioni di comunicazione devi usare SetCommState e SetupComm: http://msdn.microsoft.com/en-us/library/aa363436(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa363439(VS.85).aspx

poi trasmetti i dati chiamando WriteFile, ed infine chiudi l'HANDLE con CloseHandle.

sado93
11-03-2010, 20:40
Grazie! Appena ho 2 minuti provo.

sado93
11-03-2010, 20:54
madonna ooooo:D ....hai ragione!!!!!.....figata sto visual C#!!!!
ancora una domanda....in rete ho trovato questo codice. Volevo chiedere il baud rate minimo che posso impostare qual'è????
void Button1Click(object sender, EventArgs e)
{
//configuring the serial port
serialPort1.PortName="COM1";
serialPort1.BaudRate=9600;
serialPort1.DataBits=8;
serialPort1.Parity=Parity.None;
serialPort1.StopBits= StopBits.One;

//opening the serial port
serialPort1.Open();

//write data to serial port
serialPort1.Write("ABC");

//close the port
serialPort1.Close();

}

banryu79
12-03-2010, 09:28
Volevo chiedere il baud rate minimo che posso impostare qual'è????

Il baud rate (bits per secondo) minimo che puoi impostare è il baud rate minimo supportato dalla porta seriale E dalla periferica/device dall'altra parte, che riceve i dati.

Per scoprire quali baud rate siano supportati dalla porta, basta che vai (in Windows) in Gestione Periferiche a vedere le proprietà della porta (vedi link (http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_external/f63744.html#f84557)). Immagino tu possa anche scoprirlo programmaticamente, ovvero ci sarà una qualche classe/metodo nella libreria di C# che ti permette di ottenere queste informazioni.

L'importante è che usi un baud rate che sia supportato da entrambi i "capi" della comunicazione.

sado93
12-03-2010, 17:32
un altra cosa, spero l'ultima:D , per la trasmissione con il codice sopra riportato si utilizza solo il pin 3(transmit data), oltre alla masa. Giusto o mi sbaglio?

banryu79
12-03-2010, 17:54
un altra cosa, spero l'ultima:D , per la trasmissione con il codice sopra riportato si utilizza solo il pin 3(transmit data), oltre alla masa. Giusto o mi sbaglio?
Il codice sopra riportato non c'entra assolutamente niente con i meccanismi fisici con cui è implementata la comunicazione...

Non conosco i dettagli di funzionamento e le funzioni dei singoli pin di una porta seriale, quindi io non ti so rispondere, ma se hai dei dubbi prova a cercare qualche info specifica con Google.

sado93
14-03-2010, 08:03
nessuno sa che pin vengono utilizzati?

s0nnyd3marco
14-03-2010, 11:08
nessuno sa che pin vengono utilizzati?

Qua hai tutte le info necessarie (più molte superflue):
http://it.wikipedia.org/wiki/EIA_RS-232
Nella mia esperienza ti posso dire che la maggior parte dei DCE (modem 56k esclusi) utilizzano solamente 3 pin, che sul connettore db-9 sono il 2(Rx) il 3(Tx) e il 5(Gnd).
PS: occhio a quando saldi il conettore: controlla che i pin lato DTE riportati sul manuale indichino se Rx e Tx siano riferiti al DTE o DCE.