9

I am trying to do some serial input and output operations, and one of those is to send an 8x8 array to an external device (Arduino). The pySerial library requires that the information that I send be a byte. However, in my python code, the 8x8 matrix is made up of types <class 'str'>. Here's my sending function:

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()

Now, I have a class Matrix, which contains a field map, which is the array in question, and I will include that code here too, but the problem I'm having is that each element in the array is of type str, but I need to convert it to a byte. I can disregard possible loss of data, since in practice, I only use 0's and 1's.

My Matrix Class:

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
3
  • Why don't you just do bytes(matrix.toByteArray()) ? Commented Oct 25, 2016 at 9:18
  • matrix is an object, and it contains a width, height, and a 2 dimensional array inside of that. It's not simply an iterable structure. Commented Oct 25, 2016 at 9:19
  • 1
    Sure, but the code for your matrix.toByteArray method looks like it serializes the matrix data correctly into a bytearray, and the built-in bytes function will produce a bytes object from that bytearray. Commented Oct 25, 2016 at 9:21

2 Answers 2

18

To transform a unicode string to a byte string in Python do this:

>>> 'foo'.encode('utf_8')
b'foo'

To transform a byte string to a unicode string:

>>> b'foo'.decode('utf_8')
'foo'

See encode and decode in the Standard library.

The available encodings are documented in this table. Commonly used ones are utf_8, utf_8_sig, ascii, latin_1 and cp1252. See UTF-8, BOM, ASCII, Latin-1 and Windows-1252 at Wikipedia.

Helpful for debbugging can be raw_unicode_escape. See this table.

Sign up to request clarification or add additional context in comments.

Comments

6

in Python 3.x, You can use bytes and str like below.

>>> bytes('foo'.encode())
b'foo'

>>> a = bytes('foo'.encode())
>>> str(a.decode())
'foo'

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.