Hallo Gerald,
Windows 8.1 unterstützt keine virtuellen seriellen Ports ohne Microsoft Zertifikat (letzte Windows Version wo dies ging war Windows 7). Der Eintrag im Gerätemanager kann daher ignoriert werden.
Für die Funktion hat dies keinerlei Einfluss. Die Hardware stellt 2 Schnittstellen zur Verfügung, ein "virtueller serieller Port" und eine z.B. mit WinUSB bzw. der Teiber-DLL nutzbare Schnittstelle.
KCANMonitor oder KOBD2Check nutzen alle das WinUSB Interface per
DLL. Die virtuelle serielle Schnittstelle ist lediglich für Linux bzw. die Apple Betriebssysteme angedacht.
Zukünftig wird die virtuelle serielle Schnittstelle daher eine konfigurierbare Zusatzoption werden und standardmässig ausgeschaltet sein.
Mit dem WinUSB Treiber kannst Du alles machen was Du willst und das sogar viel besser.
Für eigene Applikationen ist sowieso die Nutzung der bereitgestellten DLL (siehe auch "Example" Beispielprogramm) zu empfehlen, als zu versuchen das Rad neu zu erfinden.
Im Beispielprogramm kannst Du ja schon direkt Nachrichten vom CAN Bus lesen bzw. senden, ohne Dir über irgendwelche COM-Ports die auf jedem Rechner anders sein können Gedanken machen zu müssen: Siehe Funktion void CExampleDlg::OnBnClickedButtonCan() in ExampleDlg.cpp
Code: |
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(); |
Das Wesentliche daran ist folgender Ablauf:
Code: |
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();
|
Viele Grüsse, Rainer