none
USB to CAN Schnittstelle- wie ansprechen RRS feed

  • Frage

  • Hallo,

    ich möcht per Visual C# eine Motorsteuerung visuallisieren. Vom Hertstell des Controllers gibt es eine USB to CAN Schnitttstelle, aber ich habe keine Ahnung wie ich mit C# den USB nach einer Geräte Adresser abfragen kann, also das ganze kommunikations Vokabeln in C# fehlen mir. Gibt es da eine gute Seite wo ich das nachlesen kann??

    Danke

     

    Samstag, 19. November 2011 23:52

Antworten

Alle Antworten

  • Hallo B

    für CAN gibt es generell in Windows  (und somit .NET) keine generische Software-Schnittstellen/APIs.

    Daher braucht man IMMER zuerst vom Hersteller des [USB] Adapters [neben dessen Windows-Treiber .SYS!]  auch noch ein 'SDK', um eine Programmier-Bibliothek einbinden zu können.
    Dies gibt es garantiert mindestens für Visual C++, aber immer häufiger auch direkt für .NET (meist C#, zT auch VB.NET), womit man einfach eine Assembly-DLL im C# Projekt referenzieren kann.
    Das API dieser CAN-Bibliotheken ist IMMER  Hersteller/HW-spezifisch, aber auf unterster Ebene meist sehr ähnlich: Methoden für Initialisierung & Konfiguration, CAN-Read & CAN-Write.

    Also suche auf der Website des Herstellers nach dem zu deinem USB-Adapter passenden Programmier-Paket. Aber nicht jeder Hersteller bietet dieses kostenlos an, bzw nur eine Minimal-Version.

    Danach brauchst du jedoch zusätzlich noch die Protokoll-Doku zu jener 'Motorsteuerung', wo die spezifischen CAN-Objekte/Meldungen beschrieben sein müssen. (Ohne Doku wird es schwierig, reverse engineering, hack).
    Hier kommt meist der 'CANopen' Standard zum Zuge, zu welchem im Web genug Gundlagen zu finden sind;
    und ab hier ist es längst kein C# .NET Thema mehr ist  (anderes Forum).

    Minimale Grundlagen:
    http://de.wikipedia.org/wiki/Controller_Area_Network
    http://de.wikipedia.org/wiki/CANopen


    Sonntag, 20. November 2011 07:22
  • Danke erstmal..

    hast du zufällig eine art syntax damit ich mir vorstellan kann wie das in etwa aussieht, welche using muss ich einbinden, von ms seite her, IO zum bsp.

    gibts vielleicht ein beispiel mit einer anderen sdk,damit ich die "grammatik" verstehen..

     

    gruß

    Sonntag, 20. November 2011 17:09
  • B,

    Beispiele für Bibliotheken anderer Hersteller (es gibt über 20!) werden dir nicht helfen!
    Und Microsoft hat hier keinerlei Einfluss (zB auf 'using' 'IO' usw; ist eh irrelevant).
    Nochmals, frage den Hersteller deines USB-CAN Adapters. Oder nenne hier die genaue Bezeichnung dieses Adapters.

     

    Sonntag, 20. November 2011 22:16
  • hallo, habe gerade mit dem hersteller telfoniert, der sagte ich brauch keine sdk, ich soll das ganze als einfach virtuelle serielle schnittstelle sehen. wie programmier ich das, mit der "seriellenschnittstelle" und usb, ich kan ja da keinen fixen port vorgeben, wie sprech ich so eine schnittstelle an..? Gruß und Danle
    Montag, 21. November 2011 10:49
  • B,

    CAN via Serial Port wäre dann mal halt die 'minimalistische' Lösung.
    Es bleibt jedoch immer noch die Frage nach den eigentlichen CAN-Datenformaten und zB  IDs (Adressierung), wozu der Hersteller trotzdem Infos/Bsp liefern sollte.

    Zu .NET SerialPort
    http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.aspx

    gibt es genug Infos.
    Aber hier geht es natürlich ausschliesslich um blosse 'Rohdaten' (Byte-Array oder Strings), hat also mit CAN keinen direkten Zusammenhang  (dagegen kann nur der Hersteller helfen).

    Das herausfinden  des Mapping USB/CAN-Adapter auf eine bestimmte COM1/COM2/COMn....  Nummer ist  AFAIK nicht mit C#/.NET alleine möglich.
    Da braucht es entweder Registry, komplexe PnP/Setup APIs, oder evtl WMI usw.
    Ich würde ggf vorerst mal den Benutzer eine Auswahl vornehmen lassen, also eine aus
    SerialPort.GetPortNames
    http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.getportnames.aspx

     

    Montag, 21. November 2011 19:12
  • Hallo, mit dem CAN kläre ich gerade mit dem Hersteller.

    Wenn ich so programmier

     

      private  void Send()
            {
               
            port = new SerialPort("COM11", 9600, Parity.None, 8, StopBits.One);
         
            port.Open();
            port.Write("init 125");
            port.Write("info version");
    

    bekomme ich einen Fehler das er auf COM11 nicht zu greifen kann, also ein rechte Problem. Was muss ich dagegen tun? COM11 durch die Firewall kommunizieren lassen??

    DANKE

    Dienstag, 22. November 2011 08:05
  • bekomme ich einen Fehler das er auf COM11 nicht zu greifen kann, also ein rechte Problem.

    Hallo Bergfeuer,

    Und wie lautet die ganze Fehlermeldung die Du bekommst und auf welche Zeile im Code findet sie statt?

    Lies folgendes einmal durch. Vielleicht kann es Dir weiterhelfen.

    Exception der seriellen Schnittstelle wird zu "NullReferenceException"

    Schau mal auch im DeviceMonitor auf die COM Ports, vielleicht ist COM11 schon „in use“. (Idee kam von hier: http://forums.reprap.org/read.php?218,103992,104142)

    Grüße,

    Robert



    Dienstag, 22. November 2011 12:02
    Moderator
  • hallo, der fehler lautet genau.

     

    System.UnauthorizedAccessException wurde nicht behandelt.
      Message=Der Zugriff auf den Anschluss COM12 wurde verweigert.
      Source=System
      StackTrace:
           bei System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
           bei System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
           bei System.IO.Ports.SerialPort.Open()
           bei USB.Form1.SendSample() in C:\Users\\documents\visual studio 2010\Projects\USB\USB\Form1.cs:Zeile 78.
           bei USB.Form1.button2_Click(Object sender, EventArgs e) in C:\Users\\documents\visual studio 2010\Projects\USB\USB\Form1.cs:Zeile 64.
           bei System.Windows.Forms.Control.OnClick(EventArgs e)
           bei System.Windows.Forms.Button.OnClick(EventArgs e)
           bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           bei System.Windows.Forms.Control.WndProc(Message& m)
           bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
           bei System.Windows.Forms.Button.WndProc(Message& m)
           bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           bei System.Windows.Forms.Application.Run(Form mainForm)
           bei USB.Program.Main() in C:\Users\\documents\visual studio 2010\Projects\USB\USB\Program.cs:Zeile 18.
           bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           bei System.Threading.ThreadHelper.ThreadStart()
      InnerException:

    Dienstag, 22. November 2011 15:22
  • Hallo Bergfeuer,

    Zu diesem Thema habe ich noch etwas gefunden:

    Kein Zugriff auf Anschluss COM1

    Zugriff auf die COM-Schnittstelle löst UnauthorizedAccessException aus 

    Die generelle Frage was kommt ist:

    „Ist vielleicht ein anderes Gerät darauf zugelassen?“ „Ist der COM Port von einem anderen Programm schon geöffnet?“

    Grüße,

    Robert

    Dienstag, 22. November 2011 15:55
    Moderator
  • Also wenn ich über den HyperTerminal kommuniziere geht es ohne Problem, aber nicht im durch das C# immer unautorisiert, die tips sind schön und gut, aber er kommt ja nichtmal zum fehler abfangen. auf com12 ist der can-usb stick eingesteckt, denn ich ja auch erfogreich mit dem hyperterminal anspreche..

    Dienstag, 22. November 2011 17:46
  • Naja, wenn Du mit Hyperterminal den Port aufmachst, solltest den Port dann auch wieder freigeben, damit Dein Programm auch drauf zugreifen kann.

    Grüße

     

    Mittwoch, 23. November 2011 08:51
  • @cathrin_

    wenn ich das programm ausführe ist der hyperteminal natürlich geschlossen!

    Mittwoch, 23. November 2011 15:29
  • also ich arbeite auch viel mit seriellen schnittstellen und wenn ich mit hyperterminal eine schnittstelle belege und dann mein programm starte kommt genau die gleiche fehlermeldung wie bei dir.

    viel erfolg noch bei der suche.

    grüße

     

     

    Donnerstag, 24. November 2011 06:50
  • hallo, das nagelneue kabel war defekt!

     

    danke für eure hilfe, jetzt klappt es ;DDDD

    Montag, 28. November 2011 18:19