View Full Version : Linguaggio C e RS232
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.
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
Grazie,
se per caso sai qualche link con un esempio, me lo potresti postare?
Ciao
Trovato il link. Ho fatto molta fatica ma ci sono riuscito
[/url]http://www.beyondlogic.org/serial/serial.htm[url]
Ciao e grazie
Quello che hai trovato funzioan solo se hai un compilatore per DOS e potrebbe non funzionare in Windows 2000/XP...
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.
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");
Grazie, settimana prossima lo provo...
Ciao
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.
Per riceverne c'è la ReadFile che è praticamente identica alla WriteFile...
La libreria è Windows.h
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
Usando la CreateFile come ti hanno fatto vedere sopra con la ReadFile leggi la seriale...con WriteFile ci scrivi...
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
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
occhio ad impostare il timeout quando attendi i dati
altrimenti, non arrivando alcun carattere il programma attende all'infinito
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.