[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