Data-Empfangen über UART

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Samuel5222
User
Beiträge: 6
Registriert: Dienstag 26. Juni 2018, 14:07

Hallo zusammen,

ich versuche über UART mit Python Data von STM32 und zu empfangen. Das Senden kalppt aber das Lesen ist immer noch fehlerhaft. Könnte Jemand bitte helfen ?

Code: Alles auswählen


import time, os, re, urllib
import msvcrt
import sys     
import serial
import struct

port="COM38"
def getAndSend1(test,type):
        global port
        if type=='int' :
                value=int(test)                    ##casting string to int
                ba=bytearray(struct.pack("i",value))
        elif type=='float' :
                value=float(test)                    ##casting string to float
                ba=bytearray(struct.pack("f",value))
        else:
                print("undefined type")
                return 0
                
        ba= b'\x7E\x7E'+ba+b'\x01\x01'                  ##adding header and tail to the byte array
        
        print("sent: "+str([ "0x%02x" % b for b in ba]))              ##print the packet before sending it

        ser = serial.Serial(port, 115200)            ##open serial port
        while ser.isOpen()==0:                          ##waiting till port get open
                1==1
        time.sleep(2)

        ser.write(ba)                                   ##sending the packet
        result = ser.read(8)                    ##reading the serial port
        print("recieved: "+str([ "0x%02x" % r for r in result]))
        resVal=struct.unpack("f",result[2:6]);
        print(str(resVal[0])+"\n")

getAndSend1(1,'int')

und mein error ist

Code: Alles auswählen

sent: ['0x7e', '0x7e', '0x01', '0x00', '0x00', '0x00', '0x01', '0x01']

Traceback (most recent call last):
  File "C:\Users\User\Desktop\V4(1).py", line 35, in <module>
    getAndSend1(1,'int')
  File "C:\Users\User\Desktop\V4(1).py", line 31, in getAndSend1
    print("recieved: "+str([ "0x%02x" % r for r in result]))
TypeError: %x format: a number is required, not str
>>>
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

In Python schreibt man Funktionsnamen klein_mit_unterstrich, genauso wie Variablennamen. Und was soll die 1 bei get_and_send1?
`global´ sollte in einem normalen Programm nicht vorkommen. `port` sollte also entweder Argument von get_and_send sein oder eine Konstante.

Bei falschen Argumenten sollte ein ValueError geworfen werden und nicht eine 0 zurückgegeben werden.

struct.pack liefert bytes, ein umwandeln in bytearray ist unnötig.
Woher weiß die Gegenseite ob ein Int oder ein Float gesendet wurde?
Statt ein `1==1` kennt Python `pass` für solche Fälle. Obwohl die while-Schleife ist unnötig, da `Serial` garantiert, dass die Schnittstelle offen ist.

Code: Alles auswählen

import time
import serial
import struct

def get_and_set(port, test, type):
    if type not in ('int', 'float'):
        raise ValueError("unknown type")
    data_to_send = struct.pack(
        "bbibb" if type=='int' else "bbfbb",
        0x7E, 0x7E, test, 0x01, 0x01
    )
    print("sent:", ["0x%02x" % b for b in data_to_send])

    with serial.Serial(port, 115200) as ser:
        time.sleep(2)
        ser.write(data_to_send)
        result = ser.read(8)
    print("recieved:", ["0x%02x" % r for r in result])
    result_value = struct.unpack_from("f", result, 2)
    return result_value[0]

port="COM38"
print(get_and_send(port, 1, 'int'))
Woher weißt Du, dass das Senden klappt, aber das Lesen fehlerhaft ist?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samuel5222: Bitte in Zukunft deine Beitraege vor dem absenden pruefen. Ich habe den jetzt repariert, aber das kann und will ich nicht jedes mal machen.
Antworten