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


von Python Neuling (Gast)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.