Gestione porta usb con c

di il
13 risposte

Gestione porta usb con c

Salve, sto cercando di scrivere un programmino che mi permetta di leggere dati con il seguente schema : da pc leggo il file e invio i dati sulla porta usb che è collegata ad arduino. Sto in ambiente kali linux e sto utilizzando code blocks ide. In rete ci sono diversi esempi http://www.lucadentella.it/2011/10/25/comunicazione-seriale-in-c-prima-parte/, questo mi sembra quello più completo ma quando vado a scrivere la prima istruzione mi dice che non è sconosciuta. Qualcuno potrebbe spiegarmi passo passo la realizzazione ? grazie

13 Risposte

  • Re: Gestione porta usb con c

    Parli di C# ma sei nella sezione C/C++ e usi Linux con CodeBlocls ... forse fai un po' di confusione ...
  • Re: Gestione porta usb con c

    oregon ha scritto:


    Parli di C# ma sei nella sezione C/C++ e usi Linux con CodeBlocls ... forse fai un po' di confusione ...
    ho corretto
  • Re: Gestione porta usb con c

    Come ti ha detto oregon, quell'esempio è in C#, che in ambiente Linux non è nativamente disponibile se non tramite "mono", che è una specie di porting di .NET 3.0 in ambiente Linux.
    Quindi guarda nella tua distro e se non hai installati i pacchetti mono-complete e mono-mcs (più altri che dipendono da cosa ti serve), devi installarli.
  • Re: Gestione porta usb con c

    Andrea Quaglia ha scritto:


    Come ti ha detto oregon, quell'esempio è in C#, che in ambiente Linux non è nativamente disponibile se non tramite "mono", che è una specie di porting di .NET 3.0 in ambiente Linux.
    Quindi guarda nella tua distro e se non hai installati i pacchetti mono-complete e mono-mcs (più altri che dipendono da cosa ti serve), devi installarli.
    ok, quale ide mi suggerite
  • Re: Gestione porta usb con c

    C'è l'IDE nativo di "mono", MonoDevelop.
  • Re: Gestione porta usb con c

    Controlla di avere in mono tutte le librerie che ti servono,se no passi ad un windows installi visual studio community oppure visual studio code e procedi,anche se fà meno figo di usare kali linux,
  • Re: Gestione porta usb con c

    Sto utilizzando c che mi sembra di capire che è quello più consono insieme a c++. Mi dareste dei suggerimenti ? ho trovato in rete dei tutorial che non sono completi. Purtroppo questa è la mia prima esperienza per quanto riguarda questo tipo di programmazione.Non sto usando nessun ide in quanto mi va in conflitto con l'ide di arduino e quindi uso il semplice editor di testo.
  • Re: Gestione porta usb con c

    Credo di aver trovato la soluzione ma credo solo in parte, il programma è questo
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    #include <sys/file.h> 
    
    
    int main(){
    	
    	int serial_port = open("/dev/ttyACM0",O_RDWR);
    
    	if (serial_port < 0) {
     	   printf("Errore %i all'apertura: %s\n", errno, strerror(errno));
    	}
    
    	struct termios tty;
    	memset(&tty, 0, sizeof tty);
    
    	if(tcgetattr(serial_port, &tty) != 0) {
        		printf("Error %i from tcgetattr: %s\n", errno, strerror(errno));
    	}
    	
    	FILE *fd;
    	char buf[21];
    	char *res;
    
    	//Apertura del file
    	fd = fopen("lettura","r");
    	if( fd==NULL){
    		perror ("Errore apertura del file \n");
    		exit(1);
    	}
    
    	tty.c_cflag &= ~PARENB; // disabilità bit di parità
    	//tty.c_cflag |= PARENB; //imposta bit di parità 
    
    	tty.c_cflag &= ~CSTOPB; //cancella campo di stop, solo un bit di stop
    	//tty.c_cflag |= CSTOPB;  //imposta campo d'arresto, due bit di arresto
    
    	tty.c_cflag |= CS8; //8 bits per byte.Quanti bit di dati per byte vengono trasmessi
    	
    	tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control 
    	//tty.c_cflag |= CRTSCTS;  //abilita
    
    	tty.c_cflag |= CREAD | CLOCAL; //Attiva LEGGI e ignora le righe ctrl
    
    	tty.c_lflag &= ~ICANON; //modalità canonica disabilitata
    
    	tty.c_lflag &= ~ECHO; // Disable echo
    
    	tty.c_lflag &= ~ECHOE; // Disable erasure
    	tty.c_lflag &= ~ECHONL;
    
    	tty.c_lflag &= ~ISIG;
    	
    	tty.c_iflag &= ~(IXON | IXOFF | IXANY);
    
    	tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
    
    	tty.c_oflag &= ~OPOST; 
    	tty.c_oflag &= ~ONLCR; 
    	//tty.c_oflag &= ~OXTABS; // Non presente in linux
    	//tty.c_oflag &= ~ONOEOT; // NOn presente in linux
    
    	tty.c_cc[VTIME] = 10; //Attendi fino a 1 secondo,ritorna non appena vengono ricevo i dati.
    	tty.c_cc[VMIN] = 0;
    	
    	cfsetispeed(&tty, B115200);
    	cfsetospeed(&tty, B115200);
    
    	if (tcsetattr(serial_port, TCSANOW, &tty) != 0) { //salva le impostazioni di tty
       		 printf("Error %i from tcsetattr: %s\n", errno, strerror(errno));
    	}
    	
    	//Leggere e stampa ogni riga
    	while(!feof(fd)){
    	 // res = fgets(buf, 21, fd);
    	  fscanf(fd,"%s",buf);
    	  write(serial_port, buf, sizeof(buf));
    	}
    	close(serial_port);
    	//chiusura del file
    	fclose(fd);	
    }
    
    e il file contiene:
    136#000200000000001B
    244#000000013C
    188#02000000
    136#000200000000001B
    136#000200000000001B
    136#000200000000001B
    136#000200000000001B
    136#000200000000001B
    136#000200000000001B
    136#000200000000001B
    244#00000001DF
    
    che si tratta di essere stringhe. Come risultato vedo la prima riga, ma le altre sono incomplete
  • Re: Gestione porta usb con c

    Ciao
    io ti sto seguendo da un po', ma non ho ben capito come sei messo e cosa stai facendo
    siccome non ho capito bene le tue intenzioni e non ho capito bene il tuo problema ti posso solo dare indicazioni di massima, ma vediamo se possono essere utili
    1) concentrati su un solo device alla volta, se hai due programmi che non vanno e li modifichi tutti e due non ne esci più
    lato PC:
    sei sicuro che la write() si usi realmente così?
    sei sicuro che la write() termini correttamente la tringa/riga di trasmissione?
  • Re: Gestione porta usb con c

    StandardOil ha scritto:


    1) concentrati su un solo device alla volta, se hai due programmi che non vanno e li modifichi tutti e due non ne esci più
    esatto, cosi sto facendo. Sto lavorando solo sul programma che invia
    sei sicuro che la write() si usi realmente così?
    sei sicuro che la write() termini correttamente la tringa/riga di trasmissione?
    Ho messo una sleep all'interno del ciclo while che mi legge il file e poi invia la stringa alla porta usb a cui è collegato arduino. Il problema è che i dati ricevuti non sono gli stessi mandati, è come se avessi una sovrapposizione
  • Re: Gestione porta usb con c

    Ma la seconda domanda?
  • Re: Gestione porta usb con c

    StandardOil ha scritto:


    Ma la seconda domanda?
    credo che la write funzioni e credo di esserne sicuro perché il led Rx di arduino lampeggia e sia perché riesco a vedere anche se in modo errato ciò che invio.
  • Re: Gestione porta usb con c

    Bene, non ho altro da dirti
Devi accedere o registrarti per scrivere nel forum
13 risposte