Kommunikation Python-Can mit Flow-Control-Frame

Gast #6135335
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!
Gast #6138486
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.