Hey Cagluns,
I need help with a python script. I had it running on another machine and now I need it running on my current machine but I have run into issues.
That or I need to convert it to C.
I get the following error:
Here is the script:
Thanks for looking.
I need help with a python script. I had it running on another machine and now I need it running on my current machine but I have run into issues.
That or I need to convert it to C.
I get the following error:
Traceback (most recent call last):
File "\\[...]\fake_sonar_packet.py", line 156, in <module>
sonar_port = FakeSonarPacket(0, 115200, 4)
File "\\[...]\fake_sonar_packet.py", line 11, in __init__
self.ser.port = port
File "C:\[...]\AppData\Local\Continuum\anaconda3\lib\site-packages\serial\serialutil.py", line 264, in port
raise ValueError('"port" must be None or a string, not {}'.format(type(port)))
ValueError: "port" must be None or a string, not <class 'int'>
File "\\[...]\fake_sonar_packet.py", line 156, in <module>
sonar_port = FakeSonarPacket(0, 115200, 4)
File "\\[...]\fake_sonar_packet.py", line 11, in __init__
self.ser.port = port
File "C:\[...]\AppData\Local\Continuum\anaconda3\lib\site-packages\serial\serialutil.py", line 264, in port
raise ValueError('"port" must be None or a string, not {}'.format(type(port)))
ValueError: "port" must be None or a string, not <class 'int'>
Here is the script:
Thanks for looking.
Code:
import serial
import os
import sys
from time import sleep
class FakeSonarPacket():
# basic serial protocol class
def __init__(self, port, baud, number):
self.ser = serial.Serial()
self.ser.baudrate = baud
self.ser.port = port
self.ser.timeout = 1
self.alive = False
self._receive_state = 'START1'
self._read_array = bytearray()
self._read_length = 0
self.connected = False
self.num_sonar = number
def open(self):
if (not self.ser.isOpen()):
print("opening serial connection")
self.ser.open()
self.alive = True
def close(self):
if self.alive:
self.alive = False
self.ser.close()
def mara_init(self):
'''Sends appropriate responses to MARA so that it thinks
a sonar board is connected'''
while not self.connected:
data = self.packet_reader(sonar_port)
if data['cmd'] == 'CHK_ERROR':
print("bad checksum")
continue
if data['cmd'] == 0x00:
self.send(0)
print("alive")
if data['cmd'] == 0x10:
self.send(0x10, [0x07]) #version 7 works with MARA. Other numbers might work.
print("version")
if data['cmd'] == 0x11:
self.send(0x11, [self.num_sonar])
print("number")
if data['cmd'] == 0x13:
self.send(0x13, [0x02])
print("delay")
if data['cmd'] == 0x17:
if data['args'][0] < self.num_sonar:
addr = data['args'][0]
self.send(0x17, [addr, 10])
print("gain %d" % addr)
if data['cmd'] == 0x19:
if data['args'][0] < self.num_sonar:
addr = data['args'][0]
self.send(0x19, [addr, 0xff])
print("threshold %d" % addr)
if data['cmd'] == 0x14:
if data['args'][0] < self.num_sonar:
addr = data['args'][0]
self.send(0x14, [addr, 0x17])
print("max range")
if data['cmd'] == 0x22:
mask = data['args']
print("setmask")
print(mask)
if data['cmd'] == 0x12:
self.send(0x12, [0x01, 0x00])
print("mask")
if data['cmd'] == 0x01:
self.connected = True
print("connected")
def _checksum(self, array):
chk = 0
for i in range(0, len(array)-1, 2):
chk += (array[i]<<8) | array[i+1] # simple sum of pairs
chk &= 0xFFFF
if (len(array) & 0x01): # if there are an odd number of bytes
chk = chk ^ array[-1] # xor the last byte
return chk & 0xFFFF
def send(self, cmd, args=[]):
# build packet
packet = bytearray([0xfa, 0xf5])
packet.append(3 + len(args))
packet.append(cmd)
packet.extend(args)
chk = _checksum(packet[3:])
print(chk)
packet.append(chk >> 8)
packet.append(chk & 0xFF)
# send it out
print(packet)
sonar_port.write(packet)
def packet_reader(self):
self._read_array = bytearray()
dat = self.ser.read(1)
print(dat)
self._receive_state = "START1"
reading = True
while reading:
if self._receive_state == "START1":
if ord(dat) == 0xfa:
self.receive_state = "START2"
self._read_array = bytearray()
dat = self.ser.read(1)
else:
pass
if self._receive_state == "START2":
if ord(dat) == 0xf5:
self._receive_state = "LENGTH"
dat = self.ser.read(1)
else:
self._receive_state = 'START1'
if self._receive_state == "LENGTH":
rx_length = ord(dat)
dat = self.ser.read(rx_length)
self._receive_state = "BODY"
if self._receive_state == "BODY":
self._read_array.extend(bytearray(dat))
if len(self._read_array) == rx_length:
got = (self._read_array[-2] << 8) | self._read_array[-1]
exp = _checksum(self._read_array[:-2])
if got == exp: # good checksum, parse packet
packet = {'cmd': self._read_array[0]}
if len(self._read_array) > 1:
packet['args'] = self._read_array[1:-2]
reading = False
else:
# bad checksum
packet = {'cmd': 'CHK_ERROR',
'got': got,
'exp': exp,
'raw': self._read_array[:]}
self._receive_state = 'START1'
else:
self._receive_state = "START1"
return packet
def send_dist(self, sensor_num, distance):
#send distance in mm for one sensor to mara
sensor_data = bytearray([sensor_num, 0x00, distance % 0x100, distance >> 8])
self.send(0x01, sensor_data)
if __name__ == '__main__':
sonar_port = FakeSonarPacket(0, 115200, 4)
sonar_port.open()
sonar_port.mara_init()
# data = sonar_port.packet_reader()
# print(data)
while True:
dist = 500 #distance in mm
if sonar_port.connected:
for i in range(sonar_port.num_sonar):
sonar_port.send_dist(i, dist)
sleep(0.05)

Comment