PDA

View Full Version : Linguaggio C e RS232


pdepon
02-03-2003, 11:27
Vorrei costruirmi un piccolo oscilloscopio digitale, e vorrei passare degli stream di dati campionati da un dac e messi in una fifo in via RS232 (UART del PIC + tranciver). Qualcuno saprebbe dirmi come si possano leggere e scrivere dati sulla RS232? Altrimenti potrei utilizzare un interfaccia USB integrata in alcuni Pic16, ma penso che gestire la USB sia dannatamente più complicato.

Grazie e Ciao.

misterx
02-03-2003, 12:10
questo è un inizio usando una API per la sua apertura

HANDLE hCom = CreateFile("COM1",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING*/
0,
NULL
);


è meglio che lo scrivo offline che mi viene meglio

Ciao

pdepon
02-03-2003, 13:55
Grazie,
se per caso sai qualche link con un esempio, me lo potresti postare?

Ciao

pdepon
02-03-2003, 14:39
Trovato il link. Ho fatto molta fatica ma ci sono riuscito
[/url]http://www.beyondlogic.org/serial/serial.htm[url]

Ciao e grazie

cionci
03-03-2003, 11:41
Quello che hai trovato funzioan solo se hai un compilatore per DOS e potrebbe non funzionare in Windows 2000/XP...

pdepon
03-03-2003, 20:51
Grazie, e allora cosa potrei fare sotto Win2k?
ho cercato un po', ma non ho capito a che api si riferisce il primo post.
Ciao e grazie per avermi evitato di perdere tempo inutilmente...


PS: Alla peggio farò un dischetto DOS di boot con sopra l'eseguibile che mi serve.

misterx
04-03-2003, 07:05
Ti passo questo codice di trasmissione dati attraverso la RS232.
Prendilo come esempio da adattare al tuo caso in specifico.
Fa largamente uso delle API di Windows.
L'ho sviluppato circa 3 anni fa e lo utilizzo tutt'ora senza alcun problema.
Se hai qualche dubbio chiedi pure.

Pardon se non è digeribile all'istante ma se osservi bene non è poi
così complesso: è un pò lungo per via della gestione degli errori.

Attenzione ai file (#include "blablabla") che io per pigrizia non ho aggiunto.


Ciao

BOOL fSuccess; // gestione degli errori

//parametri per la funzione WriteFile
int lpBuffer;
DWORD NumeroDiBytesDaScrivere = 1;
DWORD NumeroDiBytesScritti = NULL;
BOOL bResult;

//apro la porta COM
HANDLE hCom = CreateFile("COM1", // ad esempio
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);

// verifico l'effettiva disponibilità (potrebbe non esistere)
if(!hCom) {
printf(msg,"Problemi alla porta di comunicazione e relativo errore!!!\nEI=%d",GetLastError());
return; }

// e verifico lo stato della stessa
DCB dcb;
BOOL fSuccess = GetCommState(hCom,&dcb);
if (!fSuccess) {
printf(msg,"La porta selezionata è già in uso!!!: EI=%d",GetLastError());
return; }

// Inizializzo la DCB con i parametri desiderati (non a piacere: vi sono delle regole) di ricezione/trasmissione
dcb.BaudRate = 9800; // velocità dei dati (bit) al secondo
dcb.ByteSize = 7; // numero di bit
dcb.Parity = 0; // parità
dcb.StopBits = 2; // numero di bits di stop


// e setto la porta COM con i valori sopra (9800/7/0/2)
// leggere con attenzione sul Win32 SDK gli ulteriori parametri di questa struttura

fSuccess = SetCommState(hCom, &dcb);
// verifica dell'effettivo settaggio
if(!fSuccess) {
printf(msg,"settaggio non riuscito!!!: EI=%d",portacom,GetLastError());
CloseHandle(hCom);
return; }

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//apro il file da trasferire

FILE *fp;

fp = fopen("miofile.txt","r");
if(!fp) {
printf(msg,"problemi nel file!!\nEI=%d",GetLastError());
CloseHandle(hCom);
return; }

printf("trasmissione in corso\n");

//invio i dati alla porta COM
while( ( lpBuffer = fgetc(fp)) != EOF)
{

bResult = WriteFile(hCom, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL) ;
if(!bResult) {
printf("errore in trasmissione dati"); // da studiare col valore di ritorno della GetLasError();
fclose(fp);
CloseHandle(hCom);
return; }
} //end while( ( lpBuffer = fgetc(fp)) != EOF)

// chiudo il file trasmesso
fclose(fp);

//chiudo la porta COM
bResult = CloseHandle(hCom);
if(!bResult) printf("errore sulla chiusura della porta COM\n");

printf("FILE TRANSFER END\n");

pdepon
04-03-2003, 11:54
Grazie, settimana prossima lo provo...
Ciao

pdepon
12-03-2003, 21:51
Si ma io non devo solo inviare dati, devo soprattutto riceverne.
non sono poi riuscito a capire quale sia la libreria da importare per la seriale (uso Gcc o il borland in linea di comando).
Ciao e grazie per l'esempio.

cionci
13-03-2003, 01:05
Per riceverne c'è la ReadFile che è praticamente identica alla WriteFile...
La libreria è Windows.h

pdepon
13-03-2003, 14:06
Si, ma non devo trasferire file da disco, ma stringhe di caratteri o singoli caratteri creati dinamicamente in maniera pseudo-intelligiente.
Grazie per l'interessamento; domani mattina vado a leggermi il Windows.h per capirne qualcosa di più...
Ciao

cionci
13-03-2003, 14:15
Usando la CreateFile come ti hanno fatto vedere sopra con la ReadFile leggi la seriale...con WriteFile ci scrivi...

misterx
13-03-2003, 19:11
se ti è ostico il C, puoi usare questa banalità in QBasic :)

apertura della RS232 con relativi parametri di ricezione
OPEN "COM1:4800,E,7,2,CD0,CS0,DS0,OP0,RS,TB2048,RB4096" FOR INPUT AS #1

file di destinazione
OPEN "miofile.txt" FOR OUTPUT AS #2
rem leggo tutti i byte letti sino ad EOF
rem anzichè EOF, puoi usare un carattere di controllo es: (%)
WHILE (a$ <> EOF)
INPUT #1, a$
PRINT a$
WRITE #2, a$
WEND
CLOSE #1, #2

pdepon
14-03-2003, 15:59
Non mi è ostico il C, anzi ho programmato tanto in C, quella che mi è ostica è la RS232...
Lunedì o martedì ci lavoro, adesso non riesco a trovare tempo, devo studiare...
Ciao e grazie

misterx
14-03-2003, 19:18
occhio ad impostare il timeout quando attendi i dati

altrimenti, non arrivando alcun carattere il programma attende all'infinito