CAN - BUS über CancardX ansprechen
-
Hallo!
Ich habe folgendes Problem:
Ich möchte mit der "CanCardX" von "Vector" auf einen CanBus zugreifen. Dafür muss ich aber die VCan32.dll in mein Projekt einbinden.
Um dies zu tun, soll man die "loadlib.cpp" in sein Projekt einfügen.Ich bekomme aber beim Übersetzen des Programms folgende Fehlermeldung:
.... loadlib.cpp(23):E2141 Fehler in der Deklarationssyntax
.... loadlib.cpp(24):E2141 Fehler in der Deklarationssyntax
(25)...Hat jemand schon mal mit so einer PCMCIA - Karte von der Firma "Vector" gearbeitet?
Gruss,
lautiba.
-
äh ja, leider wissen wir alle nicht was für Zeilen dennd ie Zeilen 23-25 sind, ne?
-
Sorry!
Im Grunde nur Deklarationen:
(Datei: "loadlib.cpp")
//Glaobale Variablen
NCDGETCHANNELMASK ncdGetChannelMask; //(Zeile 23)
NCDOPENPORT ncdOpenPort; //(Zeile 24)
...Diese Datei sollte ich in mein Projekt einbinden, um die dll nutzen zu können.
Wenn ich jetzt übersetze, dann erhalte ich diese Fehler in der eingebundenen Datei.Gruss,
lautiba!
-
ich arbeite im Geschäft ständig mit der Karte und hatte noch keine grösseren
Probleme. Ich hab für die Karte eine Klasse geschrieben, die darf ich aber
leider nicht weiter geben (war für's Geschäft) Daher mal die ganz einfache
Variante hier:- Füg mal zum testen die Datei "vcand32.lib" zu einem neuen Projekt hinzu
- include VCanD.hstatic Vstatus InitDriver(void) { VportHandle gPortHandle = INVALID_PORTHANDLE; Vaccess gChannelMask = 0; Vaccess gPermissionMask = 0; unsigned long gBitRate = 500000; // Baudrate unsigned int gHwType = HWTYPE_CANCARDX; // CAN Karte int gHwChannel = 0; // CAN Kanal, der verwendet wird int gHwIndex = 0; // Hardwareindex der CAN Karte Vstatus vErr; VsetAcceptance acc; enableCANCard = true; // Open the driver vErr = ncdOpenDriver (); if (vErr) return vErr; // Select the channel gChannelMask = ncdGetChannelMask(gHwType,gHwIndex,gHwChannel); if (!gChannelMask) { ShowMessage("ERROR: Channel not found !"); return VERROR; } // Open a port vErr = ncdOpenPort(&gPortHandle,"CANSoftware",gChannelMask,gChannelMask,&gPermissionMask,128); if (vErr) goto error; // If permission to initialize // Open the acceptance filter for standard ids acc.mask = 0; // relevant=1 acc.code = 0; vErr = ncdSetChannelAcceptance(gPortHandle,gChannelMask,&acc); if (vErr) goto error; // Reset the clock vErr = ncdResetClock(gPortHandle); if (vErr) goto error; return VSUCCESS; error: ShowMessage(ncdGetErrorString(vErr)); if (gPortHandle!=INVALID_PORTHANDLE) { ncdClosePort(gPortHandle); gPortHandle = INVALID_PORTHANDLE; } return vErr; } // end InitDriver () // Close the CAN driver interface static Vstatus CleanUp(void) { if (gPortHandle!=INVALID_PORTHANDLE) { ncdClosePort(gPortHandle); gPortHandle = INVALID_PORTHANDLE; } ncdCloseDriver(); return VSUCCESS; // No error handling }wenn ich nichts vergessen habe dann kannst du nun mit:
// Initialize the CAN driver vErr = InitDriver(); if (vErr) return; // Go on bus vErr = ncdActivateChannel(gPortHandle,gChannelMask); if (vErr) return;die Karte starten und mit:
Vevent event; Vstatus vErr; event.tagData.msg.dlc = 5; event.tagData.msg.data[0] = 'h'; event.tagData.msg.data[1] = 'a'; event.tagData.msg.data[2] = 'l'; event.tagData.msg.data[3] = 'l'; event.tagData.msg.data[4] = 'o'; event.tagData.msg.flags = 0; // damit nie die Wakeup Messages kommen vErr=ncdTransmit(gPortHandle, gChannelMask, &pEvent); if (vErr==VERR_WRONG_PARAMETER) { // wenn dieser Fehler auftritt, ist die Karte falsch konfiguriert // ... } else if (vErr == VERR_QUEUE_IS_FULL) { // ... } else if (vErr == VERR_PORT_IS_OFFLINE) { // ... }eine Botschaft versenden.
Ich würde dir aber raten, dass ganze nochmal zu überarbeiten. Das ist aus einer
ganz alten Testsoftware von mir rauskopiert und soll dir nur die ersten
Schritte zeigen. Um eine robuste Anwendung zu schreiben ist noch mehr
notwendig.
-
Was steht auf Zeile 22?
-
Hallo!
Habe noch mal von Anfang an nach der Struktur von "Acidmrp angefangen.
Bekomme jetzt ab dem Aufruf "vErr = ncdOpenDriver()" einen neuen Fehler:[Linker Fehler] Unresolved external 'ncdOpenDriver' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJEKTS\Anwendung\UNIT1.OBJ
Dieser Fehler tritt bei allen Funktionsaufrufen auf, welche mit dem CAN - Bus zu tun haben.
???
(#include "VCanD.h" hat funktioniert)
Kann mir da jemand weiterhelfen?Gruss,
lautiba
-
Da gehört doch noch ne LIbrary dazu? (*.lib)
-junix
-
Hallo!
Hab das Problem gelöst!
Die Lib - Datei war wohl beschädigt, habe diese neu kopiert.
Nun geht es!Schönen Dank für eure Mühe!!!
(Gut zu wissen, dass hier Leute Ahnung von CAN - Bus in Verbindung mit Vector - Karten haben!!!)
-
Hallo Ihr!
Ein Problem habe ich allerdings noch.
Ich möchte eine Information auslesen, welche von einem Gerät geschickt wird.
Nachrichtenname: ACC->Fusion(Header)
ID(HEX): 300
Länge: 8Byte
Zykluszeit: 60ms
Sender: IDIS-SensorWie kann man denn genau diese Nachricht auslesen?
Gruss,
lautiba
-
die Nachricht wird ja alle 60ms vom Sensor gesendet. Am besten machst du einen
Timer der alle 30ms aufgerufen wird und pollst die Nachrichten vom Bus.
Dann vergleichst du in einer auswerte Routine ob die Nachricht auf CAN ID 0x300
geschickt wurde.Zum Aufbau des Timers:
void __fastcall TForm1::Timer1Timer(TObject *Sender) { Timer1->Enabled = false; // nun die Nachrichten vom Bus lesen // ... Timer1->Enabled = true; }wenn du wirklich nur diese eine Nachricht empfangen willst, dann kannst
du mit ncdSetChannelAcceptance auch einen Filter auf diese Nachricht setzen.
-
Hallo!
Ich meinte eigendlich, wie ich eine Nachricht nur von der Adresse 0x300 einlesen kann, da an dem CAN - BUS noch sehr viele weitere Sensoren angeschlossen sind.
Habe es aber schon herausgefunden:
vErr = ncdAddAcceptanceRange(gPortHandle, gPermissionMask, 768, 778);
Mit diesem Befehl sage ich, dass nur von den Adressen 768 - 778 (in HEX: 300 - 30A) die Nachrichten in meinen Lesepuffer epuffert werden sollen.
Gruss,
lautiba