Vai al contenuto
PLC Forum


Problemino C


pixter

Messaggi consigliati

Salve a tutti..

non so se questa è la sezione pù giusta per inserire questa domanda..però..

volevo sapere se è possibile gestire la porta usb con un programma scritto in c

oppure se è possibile gestire la porta seriale o la scheda di rete..perchè vorrei connettere dei dispositivi al pc e gestirli con un programmino..

grazie in anticipo..

Link al commento
Condividi su altri siti


Su internet ho gia fatto un sacco di ricerche ma con risultati molto scarsi..sono riuscito a trovare solo come gestire la parallela..che è la cosa che vorrei evitare..mi volevo concentrare più su usb o lan..

Link al commento
Condividi su altri siti

Se devi usare per forsa il C/C++ non lo so ma se ti "butti" su altri tipi di programma tipo il Lab View per gestire seriale o usb ci sono blocchi gi implementati.

Link al commento
Condividi su altri siti

  • 3 weeks later...

Ciao a tutti sono appena iscritto a questo forum e cosa c'e' di meglio che iniziare con un bel :offtopic: !!! :D:D:D

Siccome stavo cercando all'interno del forum se esistono cross-compilatori C gratuiti per i PIC (Sto iniziando adesso ad avventurarmi in queste cose, quindi ignoranza totale!!! P.S. Se ce ne sono mi indirizzate per favore)

Ho notato questo post e siccome ho una infarinatura di C e guardacaso di come utilizzare le porte seriali rispondo al volo!!!

Per quanto riguarda i sistemi Win 2000 e XP esistono delle API apposite per la gestione di questi dispositivi ti posto il codice per farti capire meglio quali API si utilizzano

#include "seriale.h"


#define RESETSIGNAL EV_RLSD

BOOL aperta;
HANDLE porta;



int apriporta(char com[],long baud,int parity,int bytesize,int stopbits){
DCB dcb;
COMMTIMEOUTS timeouts;


/*printf("%s,%ld,%d,%d,%d",com,baud,parity,bytesize,stopbits);*/

porta = CreateFile(com,
                       GENERIC_READ | GENERIC_WRITE,
                            0,
                            0,
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            0);

if(porta ==INVALID_HANDLE_VALUE){
  printf("Porta non aperta\n");
  chiudiporta();
  exit(1);
     }

SetupComm( porta, 1024, 1024);

timeouts.ReadIntervalTimeout  = 0;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant   = 50;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 500;


if(!SetCommTimeouts(porta,&timeouts)){
  printf("Errore di comunicazione\n");
  chiudiporta();
  exit(1);
}

SetCommMask(porta, RESETSIGNAL | EV_RXCHAR);

dcb.DCBlength = sizeof(dcb);

GetCommState(porta,&dcb);


dcb.BaudRate = baud;

switch (parity){
case 'E': dcb.Parity = EVENPARITY; break;
case 'O': dcb.Parity = ODDPARITY; break;
case 'N': dcb.Parity = NOPARITY;break;
case 'S': dcb.Parity = SPACEPARITY;break;
case 'M': dcb.Parity = MARKPARITY;break;
}

dcb.ByteSize = bytesize;

switch (stopbits){
case 1 : dcb.StopBits = ONESTOPBIT; break;
case 2 :*/ dcb.StopBits = TWOSTOPBITS;/*break;
}

dcb.fParity = TRUE;
dcb.EofChar = 0x1b;
dcb.fBinary = TRUE;
dcb.ErrorChar = 0x00;
dcb.XonLim = 0x2048;
dcb.XoffLim = 0x512;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x17;




aperta = SetCommState(porta,&dcb);
if(!aperta){
  puts("Porta non aperta!!!");
  chiudiporta();
  exit(1);
}

return 1;
}


void chiudiporta(){

  CloseHandle(porta);
}

int readbyte(unsigned char dims) {
        BYTE b;
        DWORD bytesread, evtMask = 0;

        do {
                ReadFile(porta, &b, 1, &bytesread, NULL); /* cerca di leggere il byte */
                if(bytesread == 1)/*Se lo trova esce dal ciclo altrimenti si mette in ascolto*/
                   break;
                WaitCommEvent(porta, &evtMask, NULL);
                if(evtMask | RESETSIGNAL) 
                {          
                        Sleep(700);
                        return -1;
                }
        } while(1);
        if (dims) printf(" %02x",b); 
        return (int)b;
}


int sendbyte(BYTE byte) {
        static DWORD byteswritten, bytesread;
        static BYTE b2transmit, b2read;

        b2transmit =byte;
        WriteFile(porta, &b2transmit, 1, &byteswritten, NULL);
        if(byteswritten == 0) {
                printf("Errore di scrittura\n");
                return -1;
        }

        ReadFile(porta, &b2read, 1, &bytesread, NULL);
        if(bytesread == 0) {
            printf("Nessun byte disponibile\n");
                return -1;
        }

        if(b2read != b2transmit) {
            printf("Bytes non allineati %02x - %02x\n", b2transmit, b2read);
                return -1;
        }
        printf(" %02x",b2transmit);
        return 0;
}

int sendbyte_n(BYTE *bytes, int n) {

  int  i;
  BYTE *p=bytes;
  for(i=0; i<n; i++) 
    if (sendbyte(*(p++))) return i; 
  return n;
}


void GetReset() {
        DWORD resetmask;

        printf("\n\rAttendo il  reset\n");
        PurgeComm(porta, PURGE_TXCLEAR | PURGE_RXCLEAR);
    do {
        WaitCommEvent(porta, &resetmask, NULL);
    } while(!(resetmask & RESETSIGNAL));

    readbyte(0);

}

Un elenco completo delle API di win lo trovi oltre che sul sito di MSDN anche qui

ftp://ftp.cs.virginia.edu/pub/lcc-win32/win32hlp.exe

Spero di aver fatto cosa gradita e di non aver abusato troppo della vostra gentilezza con il proseguimento di questo :offtopic:

Saluti

Link al commento
Condividi su altri siti

  • 2 months later...

io ho lo stesso problemino...comunicare attraverso c con una periferica collegata via USB...

ahimè anch'io ho ricercato invano in rete con penosi risultati...

...AIUTOOOOOOOOOOOOOO :(

Link al commento
Condividi su altri siti

beh...ho provato anche con quelli!!!

Ho sentito parlare anche di "direct drivers" senza i quali non è possibile in alcun modo risolvere

il problema su citato...confermate la cosa o è possibile senza l'ausilio di questi ultimi?!?

Link al commento
Condividi su altri siti

Ciao,

io penso che tu debba prima di tutto selezionare un hardware per controllare i tuoi circuiti elettronici. Una volta scelto il controller USB (per esempio un PIC o un controller FTDI o un prodotto Cypress) allora potrai cercare direttamente sul sito dei produttori i drivers che fanno al caso tuo (di solito distribuiti gratuitamente). Io ho provato sia gli FTDI (www.ftdichip.com) sia i PIC (www.microchip.com) e funzionano entrambi benissimo: se vuoi fare alla svelta ti consiglio i controllori FTDI, praticamante sono pronti all'uso e vengono forniti sia drivers che DLL per C, Delphi e VB.

Spero di esserti stato d'aiuto,

Ciao

Link al commento
Condividi su altri siti

  • 2 weeks later...

Per RANDOM> ciao! Interessante il codice che hai postato, io sono un profano e dovrei gestire la seriale da c++ quindi mi sarebbe molto utile; sorge pero un problema: dove trovo seriale.h ? è una libreria? un pezzetto di codice che hai scritto tu?...

Grazie ciao.

Modificato: da mirchetto
Link al commento
Condividi su altri siti

Per RANDOM> ciao! Interessante il codice che hai postato, io sono un profano e dovrei gestire la seriale da c++ quindi mi sarebbe molto utile; sorge pero un problema: dove trovo seriale.h ? è una libreria? un pezzetto di codice che hai scritto tu?...

Grazie ciao.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...