Ciao Gerald,
Windows 8.1 non supporta le porte seriali virtuali senza una certificazione Microsoft (l'ultima versione di Windows che lo supportava era Windows 7). Pertanto, la voce presente nel Gestione dispositivi può essere ignorata.
Per la funzionalità, ciò non ha alcuna influenza. L'hardware mette a disposizione due interfacce: una "porta seriale virtuale" e un'interfaccia che può essere utilizzata, ad esempio, con WinUSB o con la DLL del driver.
KCANMonitor e KOBD2Check utilizzano entrambi l'interfaccia WinUSB tramite una
DLL. L'interfaccia seriale virtuale è pensata esclusivamente per i sistemi operativi Linux o Apple.
In futuro, l'interfaccia seriale virtuale sarà un'opzione aggiuntiva configurabile e sarà disattivata per impostazione predefinita.
Con il driver WinUSB, puoi fare tutto ciò che desideri e persino meglio.
Per le proprie applicazioni, è sempre consigliabile utilizzare le librerie DLL fornite (vedere anche il programma di esempio "Esempio"), piuttosto che cercare di reinventare la ruota.
Nell'esempio di programma, puoi già leggere e inviare direttamente messaggi dal bus CAN, senza doverti preoccupare di eventuali porte COM, che possono essere diverse su ogni computer: consulta la funzione `void CExampleDlg::OnBnClickedButtonCan()` in `ExampleDlg.cpp`.
Codice: |
if(RKSInitialize())
{
RKSSetTimeouts(200, 1000);
if(RKSCANOpen(m_iBitRate))
{
int i, j;
CString strTmp, strData;
can_msg_t sRx;
can_msg_t sTx;
m_strOutput += "\r\nOpened CAN...\r\n";
UpdateData(FALSE);
for(i = 0; i < 20; i++)
{
if(RKSCANRx(&sRx))
{
// Build data byte string
strData.Empty();
for(j = 0; j < sRx.uFrm.sData.byDLC; j++)
{
strTmp.Format(" %02x", sRx.uFrm.sData.abyData[j]);
strData += strTmp;
}
// Build rest of can string
strTmp.Format("Reading ID: 0x%x, length: %d, data:%s\r\n", sRx.uFrm.sData.dwID, sRx.uFrm.sData.byDLC, strData);
m_strOutput += strTmp;
UpdateData(FALSE);
}
// else ... (Read queue was empty)
}
/* Example
DO NOT SEND NONSENSE TO CAN SYSTEMS OR YOU MAY GET UNEXPECTED RESULTS!
sTx.byType = FRAME_TYPE_NORMAL;
sTx.uFrm.sData.dwID = 0x333;
sTx.uFrm.sData.byDLC = 4;
memcpy(&sTx.uFrm.sData.abyData[0], "abcdefgh", 4);
if(RKSCANTx(&sTx)) */
if(1)
{
m_strOutput += "\r\nOne frame NOT sent (for safety reasons, check code)!\r\n";
UpdateData(FALSE);
}
RKSCANClose();
m_strOutput += "\r\nClosed CAN bus.\r\n";
UpdateData(FALSE);
}
}
RKSFree(); |
L'elemento fondamentale è il seguente processo:
Codice: |
RKSInitialize();
RKSCANOpen(gewünschte Bitrate);
solange etwas gemacht werden soll...
{
RKSCANRx(Pointer auf CAN-Frame Variable); bzw. RKSCANTx(Pointer auf CAN-Frame Variable);
... was auch immer empfangen/gesendet oder mit dem Nachrichteninhalt gemacht werden soll...
}
RKSCANClose();
|
Cordiali saluti, Rainer.