2016-10-25 3 views
0

Ich versuche, einige serielle Eingabe- und Ausgabevorgänge durchzuführen, und eine davon ist, ein 8x8-Array an ein externes Gerät (Arduino) zu senden. Die pySerial-Bibliothek erfordert, dass die Informationen, die ich sende, ein Byte sind. In meinem Python-Code besteht die 8x8-Matrix jedoch aus den Typen <class 'str'>. Hier ist meine Sendefunktion:Python Konvertieren String in Byte

import serial 
import Matrix 

width = 8 
height = 8 
portName = 'COM3' 

def sendMatrix(matrix): 
    try: 
     port = serial.Serial(portName, 9600, timeout = 1000000) 
     port.setDTR(0) 
     print("Opened port: \"%s\"." % (portName)) 
     receivedByte = port.read() 
     print(int(receivedByte)) 
     if (receivedByte == '1'): 
      port.write('1') 
     bytesWritten = 0 
     for row in range(8): 
      for col in range(8): 
       value = matrix.getPoint(col, row) 
       bytesWritten += port.write(value)//ERROR HERE! 
     print(int(port.read())); 
     port.close() 
     print("Data (%d) sent to port: \"%s\"." % (bytesWritten, portName)) 
    except: 
     print("Unable to open the port \"%s\"." % (portName)) 


def main(): 
    matrix = Matrix.Matrix.readFromFile('framefile', 8, 8) 
    matrix.print() 
    print(type(matrix.getPoint(0, 0))) 
    print(matrix.getPoint(1, 1)) 
    sendMatrix(matrix) 

main() 

Nun, ich habe eine Klasse Matrix, die ein Feld enthält map, die das Array in Frage, und ich werde diesen Code auch hier ist, aber das Problem, das ich habe ist, dass jedes Element im Array vom Typ str ist, aber ich muss es in ein Byte konvertieren. Ich kann mögliche Datenverluste ignorieren, da ich in der Praxis nur Nullen und Einsen benutze.

My Matrix Klasse:

class Matrix(object): 

    def __init__(self, width, height): 
     self.width = width 
     self.height = height 
     self.map = [[0 for x in range(width)] for y in range(height)] 

    def setPoint(self, x, y, value): 
     if ((x >= 0) and (x < self.width) and (y >= 0) and (y < self.height)): 
      self.map[y][x] = value 

    def getPoint(self, x, y): 
     if ((x >= 0) and (x < self.width) and (y >= 0) and (y < self.height)): 
      return self.map[y][x] 

    def print(self): 
     for row in range(self.height): 
      for col in range(self.width): 
       print(str(self.map[row][col])+" ", end="") 
      print() 

    def save(self, filename): 
     f = open(filename, 'w') 
     for row in range(self.height): 
      for col in range(self.width): 
       f.write(str(self.map[row][col])) 
      f.write('\n') 
     f.close() 

    def toByteArray(self): 
     matrixBytes = bytearray(self.width * self.height) 
     for row in range(self.height): 
      for col in range(self.width): 
       matrixBytes.append(int(self.map[row][col])) 
     return matrixBytes 

    def getMap(self): 
     return self.map 

    def readFromFile(filename, width, height): 
     f = open(filename, 'r') 
     lines = list(f) 
     matrix = Matrix(width, height) 
     f.close() 
     for row in range(len(lines)): 
      matrix.map[row] = lines[row].strip('\n') 
     return matrix 
+0

Warum machst du nicht einfach 'bytes (matrix.toByteArray())'? –

+0

Matrix ist ein Objekt und enthält eine Breite, eine Höhe und ein zweidimensionales Array. Es ist nicht einfach eine iterierbare Struktur. –

+1

Sicher, aber der Code für Ihre 'matrix.toByteArray'-Methode sieht so aus, als würde sie die Matrixdaten korrekt in ein Bytearray serialisieren, und die eingebaute' bytes'-Funktion wird ein Byte-Objekt aus diesem Bytearray erzeugen. –

Antwort

2

Um einen Unicode-String in ein Byte-String in Python zu verwandeln dies zu tun:

>>> 'foo'.encode('utf-8') 
b'foo' 

Um ein Byte-String in einen Unicode-String zu umwandeln:

>>> b'foo'.decode('utf-8') 
'foo' 
+0

Würde dies für ascii-Werte anstelle von utf-8 funktionieren? –

+0

ja, benutze '' ascii'' anstatt '' utf-8''. Eine Liste der möglichen Kodierungen finden Sie [hier] (https://docs.python.org/3/library/codecs.html#standard-encodings). – Nils