[gl-como] Programmazione
Carlo Filippetto
carlo.target@tiscali.it
Mer 15 Mar 2006 10:10:56 CET
> >
> posta quello che hai che ti spiego come fare.
>
ECCO
----
#include <stdio.h>
//#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int open_serial_port(); // apre la porta seriale
void close_serial_port(); // chiude la porta
char receive_char(); // riceve un carattere
int serial_read (char *buffer, int len); // riceve un array
int serial_get_rx_count(); // chiede la quantità di caratteri sulla seriale
void sleep(unsigned int mseconds); // sleep
void init(); // inizializza il buffer
char *pcCommPort = "COM1";
char buffer[20];
char fSuccess;
HANDLE hCom;
DCB dcb;
int time_out, var;
int main(int argc, char *argv[])
{
open_serial_port(); // apertura dellaporta di comunicazione
init();
sleep(100);
if (serial_get_rx_count()>=1) // se ci sono caratteri
{
sleep(200); // attendo che arrivino tutti
while (serial_get_rx_count()>=1)
{
//var = receive_char(); // ricevo 1 carattere alla volta
int i;
serial_read(buffer, 20); // leggo i caratteri e li metto nel buffer
for (i=0; i<20 ; i++)
{
int var;
var = buffer[i];
printf("%d", var);
}
}
}
close_serial_port();
// system("pause");
return 0;
}
// funzione di attessa
void sleep(unsigned int mseconds)
{
clock_t goal = mseconds + clock();
while (goal > clock());
}
//----------------------------------------------------------------------------------
// Apre la porta seriale
//----------------------------------------------------------------------------------
int open_serial_port()
{
hCom = CreateFile( pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
0, // not overlapped I/O
NULL); // hTemplate must be NULL for comm devices
if (hCom == INVALID_HANDLE_VALUE) return (1); //errore apertura dispositivo
SetupComm(hCom,64,64);
fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess) return (2); //errore apertura dispositivo
// Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.
dcb.BaudRate = CBR_9600; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) return (3);//errore apertura dispositivo
return (0);
}
//----------------------------------------------------------------------------------
// chiude la porta seriale
//----------------------------------------------------------------------------------
void close_serial_port()
{
if (hCom!=INVALID_HANDLE_VALUE)
CloseHandle(hCom);
hCom = INVALID_HANDLE_VALUE;
}
//----------------------------------------------------------------------------------
// Conta quanti caratteeri ci sono davanti alla seriale
//----------------------------------------------------------------------------------
int serial_get_rx_count()
{
struct _COMSTAT status;
int n;
unsigned long etat;
n = 0;
if (hCom!=INVALID_HANDLE_VALUE)
{
ClearCommError(hCom, &etat, &status);
n = status.cbInQue;
}
return(n);
}
//----------------------------------------------------------------------------------
// Legge un singolo carattere
//----------------------------------------------------------------------------------
char receive_char()
{
char c;
serial_read(&c, 1);
return(c);
}
//----------------------------------------------------------------------------------
// Legge tutto quello che trova sulla porta
//----------------------------------------------------------------------------------
int serial_read (char *buffer, int len)
{
unsigned long read_nbr;
read_nbr = 0;
if (hCom!=INVALID_HANDLE_VALUE)
{
ReadFile(hCom, buffer, len, &read_nbr, NULL);
}
return((int) read_nbr);
}
//----------------------------------------------------------------------------------
// Inizializza tutto il buffer di lettura
//----------------------------------------------------------------------------------
void init()
{
int i;
for (i=0; i<20 ; i++)
{
buffer[i]=0;
}
}
---------------------------------------------------------------------------------
Problemi:
- la funzione serial_read rimane attiva fino al completamento del buffer,
cosa che mi complica la vita.. leggendo dei bar-code a caso, tutti hanno delle dimensioni
loro (9, 10, 16 caratteri), quindi non ricevo i caratteri in maniera corretta..
- mi occupa troppe risorse:
ho altre 4 periferiche da comandare oltre a questa, se ognuna mi occupa il sistema
sono fritto!!
- mi domando e dico, ma i mouse che vanno in seriale (e funzionano bene) come fanno ad
essere sensibili e non intasare? mi piacerebbe raggiungere una soluzione simile
- con la funzione receive_char() va meglio come lettura, ma come per la serial_read() se non
riesco ad essere sensibile ai dati sulla seriale rischio di perdermi dei valori
CIAO
Maggiori informazioni sulla lista
gl-como