[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