[C] DLL e interazione con dispositivo su RS232

di il
7 risposte

[C] DLL e interazione con dispositivo su RS232

Ciao a tutti e spero di ricevere da voi un aiuto in merito a questo problema:
Sto cercando di creare un codice in C che si collega ad una centrale di allarme, mandi dei comandi ad essa attraverso la porta rs232 e in base al comando inviato (sfruttando una DLL esterna) questa risponde con una serie di informazioni che devo alla fine mettere su un file di testo che devo poi importare su un DB.
Ma andiamoci per step:
1) il collegamento alla centrale, andata a buon fine
2) riconoscimento DLL, andata a buon fine
3) la centrale per adesso mi risponde con uno "0" e cioè che il collegamento è andato a buon fine.

Per mandare un altro comando non ci sono problemi ma non so come recepirli e prima guardare a video e poi successivamente scrivere in un file di testo.

#include <wtypes.h>
#include <stdio.h>
typedef unsigned char (__stdcall *myFunct)(unsigned long int,unsigned char,unsigned
char,unsigned char,unsigned char*,unsigned char,unsigned char*);
void main(void);
void main(void)
{
unsigned char *buffer;
buffer=malloc(32768 * sizeof(char));
unsigned char pin[7]={""};
unsigned char seriale,retry,pinlen,response,baudrate;
unsigned long comando;
unsigned char dummy;
HINSTANCE modulo;
myFunct ftrue;
seriale=3;
comando=0x0000201;
pinlen=0;
retry=1;
baudrate=3;

modulo=LoadLibrary("BisKyo300.dll");
ftrue=( myFunct)GetProcAddress(modulo,"PanelConnection");
response=(*ftrue)(comando,seriale,retry,baudrate,pin,pinlen,buffer);
printf ("result = %d\n",response);


FreeLibrary(modulo);

}
la risposta a fine esecuzione è:

result = 0
Process returned 1 (0x1)   execution time : 0.780 s
Press any key to continue.
le specifiche della DLL sono le seguenti:

Nome Funzione: PanelConnection
Index: 1
In ingresso:
Descrizione Parametro Tipo di Dato
Codice comando azione da intraprendere DOUBLE WORD
Numero porta seriale (1 - COM1 ... 4 - COM4)
tipo: Byte
Numero di ritentativi in caso di errore di comunicazione (result = 3)
Tipo: Byte
Velocità di Trasmissione
0 = 1200 baud
1 = 2400 baud
2 = 4800 baud
Tipo: Byte
Codice PIN : puntatore al 1° carattere della stringa contenente il codice pin
(Necessario solo se il comando corrisponde ad una scrittura:
nel caso di comando di lettura, può essere non inizializzato)
Tipo: PChar
Len Pin: lunghezza stringa contenente il codice PIN
(Necessario solo se il comando corrisponde ad una scrittura:
nel caso di comando di lettura, può essere lasciato a 0)
Tipo: Byte
Puntatore al primo elemento dell'array di byte necessario per raccogliere
le informazioni di ritorno o contenenti le informazioni da inviare alla centrale.
Tale Array deve essere allocato dalla procedura chiamante
e deve avere una capacità di 32 Kbytes
Tipo: PChar

Risultato (Tipo Byte):
0: Operazione andata a buon fine
1: Codice utente non valido
2: Errore apertura porta seriale
3: Errore di comunicazione
4: Comando sconosciuto
5: Tipo centrale non riconosciuto
6: Versione firmware non riconosciuta
7: Aree inserite, impossibile aprire sessione di programmazione
8: Sessione di programmazione già aperta
9: Dati forniti per la scrittura non validi
10: Errore chiusura sessione di programmazione
11: Codice utente non abilitato
12: Nessun dato disponibile per la lettura
13: Inclusione/Esclusione zone - Attivazione/Disattivazione uscite: operazione non autorizzata
(zona non escludibile, uscita non attivabile, codice utente non autorizzato)


DESCRIZIONE DEI COMANDI IN LETTURA
Comando $0000 0201
Descrizione Comando Lettura Configurazione dei dispositivi sul bus BPI/Stato Periferiche.
Numero di bytes in Lettura
66 (Kyo 300 - 1.10)
74 (Kyo 300 - 1.20)
48 (Kyo 100 - 1.20)
Tempo approx. esecuzione comando 0.4 sec.
In ritorno lo stream di bits relativo al tempo reale dello stato delle periferiche. Le periferiche sono:
Byte
Descrizione
1 1 Lettori dall'indirizzo 0 all'indirizzo 7, 8 bits bit = 1 presente bit = 0 assente
2 2 Lettori dall'indirizzo 8 all'indirizzo 15, 8 bits bit = 1 presente bit = 0 assente
3 Lettori dall'indirizzo 16 all'indirizzo 23, 8 bits bit = 1 presente bit = 0 assente
4 Lettori dall'indirizzo 24 all'indirizzo 31, 8 bits bit = 1 presente bit = 0 assente
5 3 Lettori dall'indirizzo 0 all'indirizzo 7, 8 bits bit = 1 vivo bit = 0 morto
6 4 Lettori dall'indirizzo 8 all'indirizzo 15, 8 bits bit = 1 vivo bit = 0 morto
7 Lettori dall'indirizzo 16 all'indirizzo 23, 8 bits bit = 1 vivo bit = 0 morto
8 Lettori dall'indirizzo 24 all'indirizzo 31, 8 bits bit = 1 vivo bit = 0 morto
9 5 Lettori dall'indirizzo 0 all'indirizzo 7, 8 bits bit = 1 periferica in sabotaggio bit = 0 periferica ok
10 6 Lettori dall'indirizzo 8 all'indirizzo 15, 8 bits bit = 1 periferica in sabotaggio bit = 0 periferica ok
11 Lettori dall'indirizzo 16 all'indirizzo 23, 8 bits bit = 1 periferica in sabotaggio bit = 0 periferica ok
12 Lettori dall'indirizzo 24 all'ind...

e cosi via


grazie a tutti anticipatamente

7 Risposte

  • Re: [C] DLL e interazione con dispositivo su RS232

    Se non ho capito male è l'array buffer che viene utilizzato per inserire dati da inviare e contiene i dati ricevuti.
  • Re: [C] DLL e interazione con dispositivo su RS232

    oregon ha scritto:


    Se non ho capito male è l'array buffer che viene utilizzato per inserire dati da inviare e contiene i dati ricevuti.
    grazie mille per la risposta,

    hai perfettamente ragione, infatti se volessi mandare dei valori dovrei inserirli dentro il buffer e passarglieli, ma in lettura non so come fare.
  • Re: [C] DLL e interazione con dispositivo su RS232

    E' uguale ... Trovi il risultato in buffer quando termina di eseguire la funzione
  • Re: [C] DLL e interazione con dispositivo su RS232

    oregon ha scritto:


    E' uguale ... Trovi il risultato in buffer quando termina di eseguire la funzione
    ok, siccome dal comando che do la risposta della centrale deve essere fatta di una miriade di "uno" e di "zero" come faccio a vederli?

    Grazie sempre
  • Re: [C] DLL e interazione con dispositivo su RS232

    Hai controllato il contenuto di buffer con ti ho già detto?
  • Re: [C] DLL e interazione con dispositivo su RS232

    oregon ha scritto:


    Hai controllato il contenuto di buffer con ti ho già detto?
    Si ho provato con questo
    
    printf ("result = %d\n",buffer);
    
    ma mi restituisce un numero di 7 cifre che cambia ogni volta che eseguo il codice, invece dovrebbe tirarmi uno 0 o un 1 in base al Byte.
    Byte nr. 1: Lettori dall'indirizzo 0 all'indirizzo 7, 8 bits bit = 1 presente bit = 0 assente
    Byte nr. 2: Lettori dall'indirizzo 8 all'indirizzo 15, 8 bits bit = 1 presente bit = 0 assente
    e così per tutti gli altri Byte.
  • Re: [C] DLL e interazione con dispositivo su RS232

    Ma non devi fare in quel modo ... se sono dei byte dovresti usare un ciclo con una variabile i di controllo e

    printf("%02X ", buffer);

    per visualizzare il dato in esadecimale.

    Ovviamente, essendoci in ogni byte le informazioni di 8 canali, otterrai un valore che dovrai interpretare bit a bit. Ad esempio, se otterrai

    8C

    in binario sarà

    10001100

    e di conseguenza avrai i risultati di ogni canale.
Devi accedere o registrarti per scrivere nel forum
7 risposte