mikrocontroller.net

Forum: PC-Programmierung Kommunikation Python-Can mit Flow-Control-Frame


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Python Neuling (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe gerade ein neues Projekt in Angriff genommen und komme 
nicht so recht voran, vieleicht mache ich ja nur triviale Fehler.

Das Ziel des Projektes ist es eine Kommunikation zwischen einen 
Windows-PC(Win10) und einem CAN-Bus System aufzubauen.

Als Software für den PC soll Python dienen und für die Schnittstelle 
nach außen verwende ich den PCAN-USB Adapter von Peak.
https://www.peak-system.com/PCAN-USB.199.0.html

Für das Python-Programm fange ich auch nicht von Null an.
https://python-can.readthedocs.io/en/master/

Ich habe auch eine Kommunikation aufbauen können und konnte mit meinem 
Bus-Teilnehmer erfolgreich sprechen. Nur leider bin ich nur in der Lage 
Single-Frames zu empfangen.

Für eine längere Kommunikation benötige ich Flow-Control-Frames und 
diese versteh ich wie es scheint nicht ganz.

Ich zeig euch mal kurz ein paar Code-Ausschnitte:

msg = can.Message(arbitration_id=0x001,
    data=[0x08, 0x03, 0x22, 0x11, 0x22, 0xAA, 0xAA, 0xAA],
    is_extended_id=False)
    bus.send(msg)

Daraufhin antwortet mir mein Teilnehmer auch und zeigt mir mit seinem 
Frame das er noch mehr senden will(Firstframe).
Damit er weiter Senden darf, schicke ich Ihn nun einen so wie ich dachte 
Flow-Control-Frame:

msg = can.Message(arbitration_id=0x001,
    data=[0x30, 0x00 , 0x00],
    is_extended_id=False)
    bus.send(msg)

Danach ist jedoch Feierabend, er sendet mir nicht den Rest, also die 
Folgeframes, sondern einfach nur noch seinen Heartbeat.

Wenn mir einer Helfen könnte wäre ich diesesm sehr verbunden, auch 
Verweise auf große Quellen würden mir schon helfen. Danke!

von Python Neuling (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Hallo, habe das Problem gelöst. Es war ein ziemlich trivialer Fehler 
beim Senden des Flow-Control-Frames. Für die Interessierten unter euch 
hier die Auflösung:

Ein Flow Control Frame hat eine Länge von 3 Byte Pflicht als Signal, 
jedoch darf man nicht den Kommunikationsknoten vergessen, d.h.:

msg = can.Message(arbitration_id=target_arbitration,
    data=[target_node, 0x30 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
    is_extended_id=False)
    bus.send(msg)

Falls es noch jemand genau erklärt haben will hier meine Beschreibung 
des Frames:

byte1= node, byte2= 0x30 | flow status, byte3= Blocksize, byte4= 
separation time minimum

Ich lasse den Status sowie Blocksize und Seperation auf 0, damit mein 
Sender einfach alles raushaut.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.