[gl-como] Programmazione

francesco francesco@brisa.homelinux.net
Mer 15 Mar 2006 09:34:03 CET


Carlo Filippetto wrote:

>>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
>
>  
>
>------------------------------------------------------------------------
>
>
>  
>
volevo scrivere: porta e non posta, se ci sei ci vediamo stasera


Maggiori informazioni sulla lista gl-como