Necesita ayuda con Python Script - 'Programador de 4 dólares'

0

Estoy trabajando en un proyecto integrado y he hecho mi primera PCB con un procesador montado en la placa. ¡El problema parece ser realmente poner mi código en ese procesador! Era una especie de banca en poder usar el método descrito aquí: enlace
Pero como puede ver en esta publicación del foro, escribí:
enlace
Estoy teniendo algunos problemas. He trasladado la pregunta a este foro porque parece ser más un problema de programación general que un problema específico de PSOC.

Copiaré la secuencia de comandos al final de la publicación (sin mis cambios) ya que no se formatearía bien.

He intentado agregar paréntesis alrededor del valor de 'matriz de datos' en las declaraciones de impresión, y agregar puntos y coma pero el script aún da el error

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32

Type "copyright", "credits" or "license()" for more information.

>>>

RESTART: F:\GigaTech\PSOC\Workspace02DollarProgrammer\Python Programmer.py

Traceback (most recent call last):

  File "F:\GigaTech\PSOC\Workspace02DollarProgrammer\Python Programmer.py", line 204, in <module>

    SendAcquireCommand();

  File "F:\GigaTech\PSOC\Workspace02DollarProgrammer\Python Programmer.py", line 171, in SendAcquireCommand

    ser.write(data_array);

  File "C:\Users\Jamie\AppData\Local\Programs\Python\Python36-32\lib\site-packages\serial\serialwin32.py", line 308, in write

    data = to_bytes(data)

  File "C:\Users\Jamie\AppData\Local\Programs\Python\Python36-32\lib\site-packages\serial\serialutil.py", line 66, in to_bytes

    return bytes(bytearray(seq))

TypeError: an integer is required

>>>

No estoy muy familiarizado con python y sospecho que es un problema con las dependencias, pero realmente no sé cómo proceder con este. Cualquier ayuda sería enormemente apreciada.

Python Script

from serial import Serial
import time
ser = Serial("com40"); #replace with your COM port number
ser.baudrate = 115200

#Extract Protection Settings
def SendFlashProtectionData(hexFile, function):
    data_array = ["S"];
    hexFile.seek(0);
    current_pos = hexFile.tell();
    elementsPerHexFileRow = 141;
    hexFileRows = 521;
    deviceFlashRows = 256;
    hexFlashDataRows = 2*deviceFlashRows;
    metaDataLocation = hexFlashDataRows * elementsPerHexFileRow;
    dataBytesPerFlashRow = 128;
    rel_pos = 0;
    hexFile.seek(metaDataLocation);
    current_pos = hexFile.tell();
    hexFile.seek(current_pos);
    for positon_index in range(0,3):
        hexFile.seek(current_pos + len(hexFile.readline()));
        current_pos = hexFile.tell();

    #Extract Protection Data
    protectionDataLoc = current_pos + 9;
    hexFile.seek(protectionDataLoc);
    current_pos = hexFile.tell();
    for rowsize in range(0,32):
        hexFile.seek(current_pos + rel_pos);
        hexfilehigher = ord(hexFile.read(1))
        hexfilelower = ord(hexFile.read(1))
        tempflashvalhigher = hexfilehigher - 0x30;
        if(tempflashvalhigher > 9):
            tempflashvalhigher -= 7;
        tempflashvallower = hexfilelower - 0x30;
        if(tempflashvallower > 9):
            tempflashvallower -= 7;
        flashvalue = (((tempflashvalhigher << 4) & 0xF0)|(tempflashvallower & 0x0F));
        data_array.append(flashvalue)
        rel_pos = rel_pos + 2;
    for i in range(0,97):
        data_array.append(0);
    data_array.append("P");
    if(function == 0):
        data_array.insert(1, "R");
    if(function == 1):
        data_array.insert(1, "T");
    ser.write(data_array);
    print data_array

def SendFlashData(hexFile, flashrow, function):
    data_array = ["S"];
    elementsPerHexFileRow = 141;
    hexFile.seek((2*(flashrow - 1)) * elementsPerHexFileRow);
    current_pos = fo.tell();
    for flashRowToggle in range(0,2):
        hexFile.seek(current_pos);
        rel_pos = 9;
        for rowsize in range(0,64):
            hexFile.seek(current_pos + rel_pos);
            hexfilehigher = ord(hexFile.read(1))
            hexfilelower = ord(hexFile.read(1))
            tempflashvalhigher = hexfilehigher - 0x30;
            if(tempflashvalhigher > 9):
                tempflashvalhigher -= 7;
            tempflashvallower = hexfilelower - 0x30;
            if(tempflashvallower > 9):
                tempflashvallower -= 7;
            flashvalue = (((tempflashvalhigher << 4) & 0xF0)|(tempflashvallower & 0x0F));
            data_array.append(flashvalue)
            rel_pos = rel_pos + 2;
        hexFile.seek(current_pos);
        current_pos = current_pos + len(fo.readline());
    data_array.append("P");
    if(function == 0):
        data_array.insert(1, "P");
    if(function == 1):
        data_array.insert(1, "V");
    data_array.insert(2, flashrow-1)
    ser.write(data_array);
    print data_array

#Send the Silicon ID
def SendSiliconID(hexFile):
    data_array = ["S"];
    hexFile.seek(0);
    current_pos = fo.tell();
    elementsPerHexFileRow = 141;
    hexFileRows = 521;
    deviceFlashRows = 256;
    hexFlashDataRows = 2*deviceFlashRows;
    metaDataLocation = hexFlashDataRows * elementsPerHexFileRow;
    dataBytesPerFlashRow = 128;
    hexFile.seek(metaDataLocation);
    current_pos = fo.tell();
    hexFile.seek(current_pos);
    for positon_index in range(0,5):
        hexFile.seek(current_pos + len(hexFile.readline()));
        current_pos = hexFile.tell();

    #Extract Silicon ID from hex file
    silicon_ID_pos = hexFile.tell() + 13;
    rel_pos = 0;
    for rowsize in range(0,4):
        hexFile.seek(silicon_ID_pos + rel_pos);
        hexfilehigher = ord(hexFile.read(1))
        hexfilelower = ord(hexFile.read(1))
        tempflashvalhigher = hexfilehigher - 0x30;
        if(tempflashvalhigher > 9):
            tempflashvalhigher -= 7;
        tempflashvallower = hexfilelower - 0x30;
        if(tempflashvallower > 9):
            tempflashvallower -= 7;
        flashvalue = (((tempflashvalhigher << 4) & 0xF0)|(tempflashvallower & 0x0F));
        data_array.append(flashvalue)
        rel_pos = rel_pos + 2;
    for i in range(0, 125):
        data_array.append(0);    
    data_array.append("P");
    data_array.insert(1, "I");
    ser.write(data_array);
    print data_array;

#Send Checksum values
def SendCheckSumData(hexFile):
    hexFile.seek(0);
    current_pos = hexFile.tell();
    elementsPerHexFileRow = 141;
    hexFileRows = 521;
    deviceFlashRows = 256;
    hexFlashDataRows = 2*deviceFlashRows;
    metaDataLocation = hexFlashDataRows * elementsPerHexFileRow;
    dataBytesPerFlashRow = 128;
    hexFile.seek(metaDataLocation);
    current_pos = fo.tell();
    hexFile.seek(current_pos + len(hexFile.readline()));
    current_pos = fo.tell();

    #Extract Checksum from hex file
    checkSumDataPos = current_pos + 9;
    rel_pos = 0;
    data_array = ["S"];
    for rowsize in range(0,4):
        hexFile.seek(checkSumDataPos + rel_pos);
        hexfilehigher = ord(hexFile.read(1))
        hexfilelower = ord(hexFile.read(1))
        tempflashvalhigher = hexfilehigher - 0x30;
        if(tempflashvalhigher > 9):
            tempflashvalhigher -= 7;
        tempflashvallower = hexfilelower - 0x30;
        if(tempflashvallower > 9):
            tempflashvallower -= 7;
        flashvalue = (((tempflashvalhigher << 4) & 0xF0)|(tempflashvallower & 0x0F));
        data_array.append(flashvalue)
        rel_pos = rel_pos + 2;
    for i in range(0, 125):
        data_array.append(0); 
    data_array.append("P");
    data_array.insert(1, "S");
    ser.write(data_array);
    print data_array;

#Acquire target
def SendAcquireCommand():
    data_array = ["S", "A"];
    for i in range(0, 129):
        data_array.append(0);
    data_array.append("P");
    ser.write(data_array);
    print data_array;

#Erase All Flash
def SendEraseAllCommand():
    data_array = ["S", "E"];
    for i in range(0, 129):
        data_array.append(0);
    data_array.append("P");
    ser.write(data_array);
    print data_array;

def SendChecksumPrivilegedCommand():
    data_array = ["S", "C"];
    for i in range(0, 129):
        data_array.append(0);
    data_array.append("P");
    ser.write(data_array);
    print data_array;

#Reset the target
def ExitProgramming():
    data_array = ["E"];
    for i in range(0, 130):
        data_array.append(0);
    data_array.append("P");
    ser.write(data_array);
    print data_array;

#main code
#provide path to your .hex file
fo = open("C:\Users\rnjt\Desktop\Analog\blinker\blinker_red.cydsn\CortexM0\ARM_GCC_473\Debug\blinker_red.hex", "rb");
SendAcquireCommand();
time.sleep(3);
SendSiliconID(fo);
time.sleep(3);
SendEraseAllCommand();
time.sleep(3);
SendChecksumPrivilegedCommand();
time.sleep(3);
for index in range(1, 257):
    SendFlashData(fo, index, 0);
    time.sleep(0.05);
for index in range(1, 257):
    SendFlashData(fo, index, 1);
    time.sleep(0.05);
SendFlashProtectionData(fo, 0);
time.sleep(2);
SendFlashProtectionData(fo, 1);
time.sleep(2);
SendCheckSumData(fo);
time.sleep(2);
ExitProgramming();
    
pregunta GigaJoules

3 respuestas

0

Lo que puedo ver aquí es que el primer intento de intentar enviar algunos datos a través de la línea serie (SendAquireCommand) falla porque los datos que tiene que enviar tienen un formato no válido. ¿Está correctamente formateado su archivo .hex? Creo que tendrá que depurar el código un poco e imprimir los datos que este comando está intentando enviar a través de la línea serie.

    
respondido por el Stefan Wyss
0

Comprobando el código fuente en serialutil.py, esto es to_bytes:

def to_bytes(seq):
    """convert a sequence to a bytes type"""
    if isinstance(seq, bytes):
        return seq
    elif isinstance(seq, bytearray):
        return bytes(seq)
    elif isinstance(seq, memoryview):
        return seq.tobytes()
    elif isinstance(seq, unicode):
        raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
    else:
        # handle list of integers and bytes (one or more items) for Python 2 and 3
        return bytes(bytearray(seq))

Como se puede ver, la instancia de 'seq' se comprueba antes de que se produzca la conversión. Si seq ya es 'bytes' no se necesita conversión. Si es 'bytearray' o 'memoryview', el método de conversión que se llama es muy sencillo. Si seq no es ninguno de los anteriores, primero intenta crear un bytearray a partir de seq. Esta conversión es lo que desencadena el error que está viendo.

En el contexto de su código, el argumento seq es:

data_array = ["S", "A"];

Creo que el error está en esta línea (y en todas las demás que son iguales a esta). Debe intentar crear una matriz de datos que se pueda convertir en un bytearray o directamente en un bytearray. Experimenta esto (gracias, Ignacio Vázquez-Abrams):

data_array = b"SA";

Y díganos si esto funciona.

    
respondido por el Vicente Cunha
0

ser.write (arg) espera que arg sea una lista de enteros. 'X' es un objeto de cadena, no el valor del número ascii del mismo como si estuviera en lenguaje C. Simplemente conviértelo mediante la función ord ().

Por ejemplo;

 data_array.append(ord("P"))
    
respondido por el Ayhan

Lea otras preguntas en las etiquetas