in data 05-14-2014 04:51 AM
Salve a tutti,
Sto utilizzando CVI per interfacciarmi con MiniProg3 della Cypress.
Per visualizzare i dispositivi collegati utilizzo la funzione PSoC_IPSoCProgrammerCOM_ObjectGetPorts che mi restituisce un variant contenente il/i nome dispositivo/i.
DA questo devo estrarre il nome del dispositivo ma non riesco a farlo.
Con la funzione CA_VariantGet1DArraySize mi restituisce correttamente il numero dei dispositivi, e la funzione CA_VariantGetType mi restituisce 4211.
Le funzioni PSoc funzionano correttamente perche in debug se cerco nella memoria sono presenti i noni dei dispositivi.
Grazie per la collaborazione.
Risolto Andare alla soluzione.
in data 05-14-2014 06:38 AM
Ciao,
il tipo dati 4211 significa un array di stringhe (CAVT_ARRAY | CAVT_CSTRING) che corrisponde a quello che ti aspetti.
Per leggerlo devi passare il variant a un safeArray dal quale estrarre le stringhe; puoi prendere spunto dall'esempio excel2000dem nella cartella activex\excel della cartella esempi.
In passato ho verificato che le funzioni di trattamento array 1D non funzionano: ho dovuto usare le funzioni per array 2D con una dimensione pari a 1 (vale a dire una matrice con una sola colonna); non so se la cosa sia stata corretta, ma se usando le funzioni 1D non riesci a ottenere i dati corretti prova con le 2D.
in data 05-14-2014 07:10 AM
Grazie per la risposta.
Sono 2 giorni che provo ed ho un pò di confusione.
Ho il mio VARIANT Ports.
//Con questo ho il mio safeArray:
LPSAFEARRAY safe;
CA_VariantGetSafeArray (&Ports, CAVT_BSTR, &safe);
A questo punto utilizzo:
CA_SafeArrayTo2DArray()
CA_SafeArrayTo2DArrayEx()
CA_SafeArrayTo2DArrayBuf()
CA_SafeArrayTo2DArrayBufEx()
Provate tutte ma non riesco ad estrarre nulla.
Di seguito un esempio in C_Sharp compreso nella documentazione.
static private int OpenPort()
{
int hr;
//Open Port - get last (connected) port in the ports list
object portArray;
hr = pp.GetPorts(out portArray, out m_sLastError);
if (!SUCCEEDED(hr)) return hr;
string[] ports = portArray as string[];
if (ports.Length <= 0)
{
m_sLastError = "Connect any Programmer to PC";
return -1;
}
bool bFound = true;
string portName = "";
for (int i = 0; i < ports.Length; i++) {
if (ports[i].StartsWith("MiniProg3")) {
portName = ports[i];
bFound = true;
break;
}
}
if (!bFound) {
m_sLastError = "Connect any MiniProg3 device to PC";
return -1;
}
Se puoi cortesemente dirmi dove sbaglio.
Grazie ancora per l'aiuto.
in data 05-16-2014 03:46 AM
Ciao, scusa ma ieri sono stato un po' incasinato.
Ti allego un piccolo esempio in cui leggo un po' di righe da una listbox, le salvo in un variant e le rileggo dal variant in un array di stringhe che poi passo ad un'altra listbox. Vedi se ci capisci qualcosa; il trucco è stato usare CA_VariantGet1DArrayBuf per memorizzare in un buffer allocato dalla funzione.
in data 05-16-2014 04:23 AM
Perfetto funziona correttamente !!!!
Grazie mille per l'aiuto
in data 05-16-2014 04:40 AM
Non c'è problema: se posso lo faccio volentieri