PDA

View Full Version : [VC++] Come iniziare una console application nella mia situazione


register
01-04-2008, 13:18
Salve ragazzi,

vi chiedo aiuto!

Devo creare lavorare in ambiente Visual Studio C++ vers. 6!
linguaggio: C++!

Devo fare un lavoro che consiste nel creare un programma ke legga e scriva su tag rfid ( tecnologia che usa le onde radio e permette l'identificazione di oggetti salvando le loro informazioni su, appunto, dei tag). Questi tag sono letti da un lettore (il reader) e quindi io dovrei richiamarmi anche delle funzioni interne a delle DLL. Ma non è questo il mio problema.

Il fatto è che in un SDK ho un exe chiamato SampleHostDlg.exe, che non è altro che una finestra tramite cui posso leggere e scrivere su questi tag RFId, inoltre nell'SDK ho anche i sorgenti (file .h e .cpp) che servono per creare l'exe! Ma anzichè fare tutto ciò con le finestre, io vorrei farlo semplicemente con la schermata Dos, così da togliere tanto codice che a me non serve.

Si può fare partendo dai file che già ho nell'sdk? e se sì, in che modo?

Grazie.
Spero di avervi dato tutte le info necessarie per aiutarmi, sennò fatemelo sapere che ve le do tranquillamente!


Ragazzi scusate io ho fatto così:

Nuovo progetto-> win32 console application -> An empty project.

poi ho caricato due header file che ci sono nell'sdk. ho compilato...nessun errore!ovviamente.
a questo punto ho creato un file .cpp scegliendo Nuovo dal menu File e poi scegliendo C++ source file.
Ho compilato così com'è...vuoto..e mi esce quest'errore:
--------------------Configuration: RFID_NEW - Win32 Debug--------------------
Compiling...
main.cpp
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/RFID_NEW.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

RFID_NEW.exe - 2 error(s), 0 warning(s)

Mi sapete dire perchè?
Grazie.

tomminno
01-04-2008, 13:23
Salve ragazzi,

vi chiedo aiuto!

Devo creare lavorare in ambiente Visual Studio C++ vers. 6!
linguaggio: C++!


Ma non puoi usare un IDE/compilatore più recente?
Visual Studio Express 2005 o 2008 dovrebbero andarti più che bene.


Devo fare un lavoro che consiste nel creare un programma ke legga e scriva su tag rfid ( tecnologia che usa le onde radio e permette l'identificazione di oggetti salvando le loro informazioni su, appunto, dei tag). Questi tag sono letti da un lettore (il reader) e quindi io dovrei richiamarmi anche delle funzioni interne a delle DLL. Ma non è questo il mio problema.

Il fatto è che in un SDK ho un exe chiamato SampleHostDlg.exe, che non è altro che una finestra tramite cui posso leggere e scrivere su questi tag RFId, inoltre nell'SDK ho anche i sorgenti (file .h e .cpp) che servono per creare l'exe! Ma anzichè fare tutto ciò con le finestre, io vorrei farlo semplicemente con la schermata Dos, così da togliere tanto codice che a me non serve.

Si può fare partendo dai file che già ho nell'sdk? e se sì, in che modo?

Grazie.
Spero di avervi dato tutte le info necessarie per aiutarmi, sennò fatemelo sapere che ve le do tranquillamente!

Se hai un software da interfaccia grafica assai probabilmente sarà realizzato con le MFC per cui è praticamente impossibile portarlo a riga di comando, conviene riscriverlo da 0

Generalmente i lettori RFID sono connessi al computer tramite seriale, ma hai letto almeno la documentazione su come funziona l'hardware e i comandi da inviare?

register
01-04-2008, 13:51
sì l'ho letta.
anche se non tutta perchè è molto dipersiva.

Non posso usarne uno più recente.
E per il fatto che da errore di link anche solo con un .cpp vuoto che mi dici?

tomminno
01-04-2008, 14:06
sì l'ho letta.
anche se non tutta perchè è molto dipersiva.


Usa la seriale per comunicare?
Che comandi utilizza?
Usa il CRC alla fine del comando?


Non posso usarne uno più recente.
E per il fatto che da errore di link anche solo con un .cpp vuoto che mi dici?

Che errore ti dà? Sei troppo sul vago.

register
01-04-2008, 14:29
sì, per comunicare usa la seriale.

in che senso che comandi utilizza?
se intendi quelli per leggere e scrivere, dato che quello che sto cercando di fare ora è la lettura, allora il primo comando è la rilevazione del tag nel campo dell'antenna e il prototipo è:

int FEISC_0xB0_ISOCmd( int iReaderHnd, UCHAR cBusAdr, UCHAR* cReqData, int iReqLen, UCHAR* cRspData, int* iRspLen, int iDataType );

L'errore di link l'ho riportato come modifica in un secondo momento nel mio primo messaggio, solo che la mia modifica ho visto ke è successiva alla tua risposta, però quando io l'ho fatta ancora non si visualizzava la tua risposta.

cmq grazie

tomminno
01-04-2008, 14:54
sì, per comunicare usa la seriale.

in che senso che comandi utilizza?


Nel senso dei comandi RFID, i pricipali comandi sono definiti in standard ISO.


se intendi quelli per leggere e scrivere, dato che quello che sto cercando di fare ora è la lettura, allora il primo comando è la rilevazione del tag nel campo dell'antenna e il prototipo è:

int FEISC_0xB0_ISOCmd( int iReaderHnd, UCHAR cBusAdr, UCHAR* cReqData, int iReqLen, UCHAR* cRspData, int* iRspLen, int iDataType );


Questo è un metodo, suppongo dell'SDK, per comandi io intendevo proprio i dati da inviare via seriale.
Comunque visto che hai questo prototipo puoi usarlo per inviare e ricevere dati senza preoccuparti della comunicazione via seriale.

register
02-04-2008, 09:10
I comandi che si possono dare al reader per agire sull'rfid (in particolare quelli che mi interessano) sono:

- inventory, per rilevare la sua presenza nel campo dell'antenna.
- lettura (del suo identificativo e dei dati scritti su di esso).
- scrittura.

spero che sia questo che mi chiedevi.
grazie

tomminno
02-04-2008, 09:45
I comandi che si possono dare al reader per agire sull'rfid (in particolare quelli che mi interessano) sono:

- inventory, per rilevare la sua presenza nel campo dell'antenna.
- lettura (del suo identificativo e dei dati scritti su di esso).
- scrittura.

spero che sia questo che mi chiedevi.
grazie

In realtà devi sapere i codici binari corrispondenti a questi comandi.

I campi iReaderHnd, cBusAdr, iDataType li dovresti trovare da qualche parte sulla documentazione.
cReqData non so se rappresenta l'intera stringa binaria da inviare o solo i dati del comando, dovrebbe essere specificato nella documentazione.
Gli altri 2 parametri contengono la risposta, che dovrebbe essere comando, numero tag, sequenza di tagid da 64 bit, crc, salvo diverse specifiche nella documentazione del tuo SDK.

Quando ho lavorato con gli RFID mandavo direttamente i comandi via seriale, il mio "SDK" era l'elenco dei comandi supportati dal dispositivo.

register
02-04-2008, 10:15
Ah, ho capito.
a dire il vero ci sono i codici in esadecimale:
- 0xB0 per l'isocmd;
- 0x01 per l'inventory;
- 0x23 per la lettura;
- 0x24 per la scrittura.

Quello che c'è scritto nel manuale riguardo alla funzione te lo riporto sotto, ovviamente non ti chiedo di leggerlo per me, ma giusto per avere altre info che forse ti permetteranno di aiutarmi.
Ti posso chiedere tu come hai fatto a fare il tuo lavoro?
Io mi son creato un progetto Win32 Console Application;
ho messo la fecom.dll in c\windows (come dice nel manuale);
poi ho aggiunto il file fecom.h al progetto (l'ho messo anche nella directory proprio del progetto) e ho creato un main in cui c'è:

#include "fecom.h"


void main () {

char* cPortNr = "1";

int handle = FECOM_OpenPort( cPortNr);

}

Questo l'ho fatto per creare ed aprire l'oggetto porta.
Però mi da questo tipo di errore:

--------------------Configuration: RFID - Win32 Debug--------------------
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol __imp__FECOM_OpenPort@4
Debug/RFID.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

RFID.exe - 2 error(s), 0 warning(s)


Mi potresti aiutare? Io ci sto sbattendo la testa e mi sto deprimendo perkè non so come proseguire.

Grazie.


Descrizione della funzione FEISC_0xB0_ISOCmd sul manuale:

"The function initiates a data transfer for multiple ISO15693 or ISO14443 transponders located in the active zone of the ISC Reader.

The data necessary for the data transfer are to be stored in cReqData.
The number of characters contained in cReqData must be indicated in iReqLen.

The data read from the ISO15693 oder ISO14443 transponder are contained in
cRspData.

iRspLen indicates the number of characters in cRspData.
The parameter iDataType specifies whether cReqData and cRspData are to be
interpreted as a hex array or as a string.

Note the following: The buffer for the receive data cRspData must be dimensioned such that all the receive data can be stored.
This means in the case of iDataType=1 that the size of the buffer cRspData is twice as large as in the case of iDataType=0.
The length of the send data (number of characters in cReqData) must be indicated in iReqLen.
If iDataType=1, then iReqLen is twice as large as in the case of iDataType=0. The length indication for the receive buffer (cRspData) is to be handled analogously.
iReaderHnd is the handle for the Reader object.
cBusAdr is the bus address set in the Reader."

register
02-04-2008, 10:31
wow...grande...è andato ora...non mi da errori.

Grazie =")

ora proseguo, a piccoli passi, ma spero di raggiungere presto la meta.

Ma sapete come si definisce un a variabile di tipo puntatore a UCHAR?

cioè, la variabile: UCHAR* cReqData, come va inizializzata?

Comunque grazie ancora.

Un'altra cosa, io sul main riportato su ho fatto poi un if sulla "handle",
in particolare:
if ( handle < 0 ) {.. vorrei qui visualizzare a video un errore ..};

per fare la visualizzazione dell'errore, mi sono comportato come se stessi lavorando col dev c++, e cioè:
ho incluso iostream.h e ho fatto nell'if **cout<< "Errore!";
solo che mi da errore sia sul cout che su << dicendomi che è un comando illegale.

Come potrei fare?
grazie

tomminno
02-04-2008, 12:36
per fare la visualizzazione dell'errore, mi sono comportato come se stessi lavorando col dev c++, e cioè:
ho incluso iostream.h e ho fatto nell'if **cout<< "Errore!";
solo che mi da errore sia sul cout che su << dicendomi che è un comando illegale.

Come potrei fare?
grazie

intanto devi includere <iostream> senza .h poi hai usato il namespace std?

register
02-04-2008, 13:13
nel senso il valore in che modo glielo devo passare.

UCHAR è un tipo predefinito che sta per Unsigned Char;
cioè dovrei quindi definire un'altra variabile ( es. uchar temp = "Ciao") e poi fare

cReqData = &temp; ?

ma una variabile uchar si inizializza proprio come una char o in qualche altro modo?


Per tommino,
no non ho usato "namespace std" anche perchè non so in quali occasione dovrei utilizzarlo.

Grazie

tomminno
03-04-2008, 08:04
nel senso il valore in che modo glielo devo passare.

UCHAR è un tipo predefinito che sta per Unsigned Char;
cioè dovrei quindi definire un'altra variabile ( es. uchar temp = "Ciao") e poi fare

cReqData = &temp; ?

ma una variabile uchar si inizializza proprio come una char o in qualche altro modo?


UCHAR di per sè è un carattere senza segno (equivalente ad un BYTE) ovvero un numero tra 0 e 255, non è una stringa.
UCHAR* è usato per array di dati binari, esattamente quello che serve a te per comunicare con il lettore di tag.


Per tommino,
no non ho usato "namespace std" anche perchè non so in quali occasione dovrei utilizzarlo.

Grazie

Difficile programmare in C++ senza nemmeno sapere cos'è il namespace standard.
Tutta la libreria standard del C++ è racchiusa nel namespace std, senza specificare

using namespace std;

all'inizio dei file cpp (o nell header, ma è una cosa da non fare), opppure davanti ad ogni classe o funzione in esso contenuta (esmpio std::cout), il compilatore dovrebbe segnalarti errori come il tuo.

register
03-04-2008, 11:43
Ciao tommino,

io ho ripreso in mano il c++ dopo 7 anni, perciò molte cose non me le ricordo.

Aggiungi poi che non è che impazzisco proprio per la programmazione...

Comunque grazie.

ora lo utilizzo.


ti volevo chiedere però un'altra cosa:

per quanto riguarda la lunghezza del buffer di ricezione ( int* iRspLen ) come devo inizializzarla?
nel senso, io a priori non posso sapere quanta informazione andrà ad essere immagazzinata nel buffer, quindi come inizializzo questa variabile?

Ti ringrazio tantissimo.

register
08-04-2008, 09:26
Ragazzi scusate,
ho un altro problema.

quando vado ad includere degli header file (nel caso particolare FEDM.h) nel mio main, all'atto della compilazione ho il seguente errore:

c:\programmi\microsoft visual studio\vc98\include\windef.h(47) : error C2632: 'char' followed by 'char' is illegal
c:\programmi\microsoft visual studio\vc98\include\windef.h(47) : warning C4091: 'typedef ' : ignored on left of 'unsigned char' when no variable is declared

dove l'errore C2632 si riferisce a questa istruzione:

typedef unsigned char UCHAR

è possibile che capiti questo errore? perchè un progetto win32console application dà questo errore mentre il progetto dell'SDK (a cui appartengono tutti gli header file che sto utilizzando) non dà problemi? Il progetto dell'SDK però non è sicuramente win32console application perchè il risultate del Build è una finestra visuale.

Grazie,
attendo vostre risposte.

cionci
08-04-2008, 10:07
Secondo me o fai doppie inclusioni o ti manca un punto e virgola da qualche parte.

register
08-04-2008, 11:52
Ciai cionci,
grazie per aver risposto.

Alla fine ho risolto così, mettendo quest'istruzione prima dell'using namespace std:

#ifndef WIN32
typedef unsigned char UCHAR ;
#endif

ed ora non dà più problemi.

Invece vorrei sapere una cosa, in un progetto win32console application non è possibile dichiarare variabili CString?
te lo chiedo perchè quando ne dichiaro una ottengo :
error C2065: 'CString' : undeclared identifier

nonostante abbia fatto:
#include <string>
#include <cstring>

Se non fosse possibile utilizzare cstring, in quale altro modo potrei dichiarare la variabile? forse char*?

grazie.

cionci
08-04-2008, 11:56
CString è una classe delle MFC. A quale scopo ti servirebbe ? Non ti bastano le string del C++ ?
Inoltre l'include <cstring> include la stirng.h di C ;)

register
09-04-2008, 12:05
Ciao cionci,

vorrei usare CString per il solo fatto che una delle funzioni dell'SDK che devo utilizzare ha tra i parametri di ingresso uno di tipo CString appunto.

Ma poi ho anche un altro problema (ancoooora!!! dirai tu! :cry: purtroppo sì)

Il problema è questo:
non ricordo se l'ho già detto, comunque di tutto questo progetto io finora ho creato solo il file main.cpp, il resto proviene dall'SDK. Ora ho questa situazione:

cerco di aggiungere al progetto anche i file .cpp dove sono implementate alcune classi che devo usare. L'aggiunta di per sè non mi dà problema. Ma se, mettiamo, io voglio utilizzare la funzione setdata membro della classe FEDM_ISCReader implementata in FEDM_ISCReader.cpp, quiando aggiungo il .cpp non ho problemi, se poi nel mio main vado a fare FEDM_ISCReader* m_reader = NULL; mi escono una sfilza di errori (anche 55).

Se vi state chiedendo perchè ho dichiarato un puntatore alla classe anzichè dichiarare proprio m_reader semplicemente come un oggetto, il motivo è che ottengo questi tre errori di link che ancora non sono riuscito a risolvere:

main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall FEDM_ISCReader::~FEDM_ISCReader(void)" (??1FEDM_ISCReader@@UAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall FEDM_ISCReader::FEDM_ISCReader(void)" (??0FEDM_ISCReader@@QAE@XZ)
Debug/RFID.exe : fatal error LNK1120: 2 unresolved externals


Questi 3 errori li ottengo però se non aggiuno i cpp al progetto, altrimenti avrei anche gli oltre 50 errori di prima.

Potete aiutarmi?
Grazie