我正在尝试在python中创建一个从TCP套接字读取数据的程序。代码在Raspberry Pi模型3B上运行。所有数据来自的设备是一台病态的激光雷达扫描仪。
现在的问题是程序挂起是下一行:
datagram = next(datagrams_generator)
该计划永远不会出来,我不知道为什么。我对python没有多少经验,所以可能有人可以帮忙吗?
import sys
from socket import *
import select
import serial
import time
import os
from datetime import datetime
import binascii
import numpy
import collections
Sick561Datagram = collections.namedtuple("sick561_datagram", ["TypeOfCommand",
"Command",
"VersionNumber",
"DeviceNumber",
"SerialNumber",
"DeviceSatus1",
"DeviceSatus2",
"TelegramCounter",
"ScanCounter",
"TimeSinceStartup",
"TimeOfTransmission",
"InputStatus1",
"InputStatus2",
"OutputStatus1",
"OutputStatus2",
"ScanningFrequency",
"MeasurementFrequency",
"NumberOfEncoders",
"NumberOf16bitChannels",
"MeasuredDataContents",
"ScalingFactor",
"ScalingOffset",
"StartingAngle",
"AngularStepWidth",
"NumberOfData",
"Data"])
# "NumberOf8BitChannels",
# "Position",
# "Name",
# "Comment",
# "TimeInformation",
# "EventInformation"])
#-----------------Needed for receiving UART commands
ser = serial.Serial(
port='/dev/ttyS0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
serial=0
#---------------------------------------------------
#-----------------Needed for TCP init---------------
data = None
timeout = 3
port = 2111
host = "10.131.8.52"
print ("connecting to: " + host)
s = socket(AF_INET, SOCK_STREAM)
print "Socket made"
ready = select.select([s],[],[],timeout)
s.connect((host,port))
print("Connection made")
#---------------------------------------------------
#----------------variables for main----------------
TIM561_START_ANGLE = 2.3561944902 # -135° in rad
TIM561_STOP_ANGLE = -2.3561944902 # 135° in rad
#----------------Create new file------------------
def createLogFile():
print "Create new log file to write at it"
fileName = datetime.now().strftime("%Y%m%d-%H%M%S")
print "The new file.log that is creates is called: " + fileName
directory = "/media/pi/SCANROBOT/" + fileName + ".log"
print "It is created in directory: " + directory
newLogFile = open(directory, "w")
return newLogFile
#-------------------------------------------------
#-----------------Datagram generator functions----
def bytes_from_socket(socket):
while True:
data = socket.recv(256)
for byte in data:
yield bytes([byte])
def datagrams_from_socket(socket):
STX = b'\x02'
ETX = b'\x03'
byte_generator = bytes_from_socket(socket)
while True:
datagram = b''
for byte in byte_generator:
if byte == STX:
break
for bytce in byte_generator:
if byte == ETX:
break
datagram += byte
yield datagram
def parse_number(nbr_str):
""" decimal numbers are encoded with leading +/- """
if b'+' in nbr_str or b'-' in nbr_str:
return int(nbr_str)
else:
return int(nbr_str, 16)
def decode_datagram(datagram):
items = datagram.split(b' ')
header = {}
header['TypeOfCommand'] = items[0].decode('ascii')
if header['TypeOfCommand'] != 'sSN':
return None
header['Command'] = items[1].decode('ascii')
if header['Command'] != 'LMDscandata':
return None
header['VersionNumber'] = parse_number(items[2])
header['DeviceNumber'] = parse_number(items[3])
header['SerialNumber'] = items[4].decode('ascii')
header['DeviceStatus1'] = parse_number(items[5])
header['DeviceStatus2'] = parse_number(items[6])
if header['DeviceStatus1'] != 0 or header['DeviceStatus2'] != 0:
return None
header['TelegramCounter'] = parse_number(items[7])
header['TimeSinceStartup'] = parse_number(items[9])
header['TimeOfTransmission'] = parse_number(items[10])
header['AngularStepWidth'] = parse_number(items[24])
header['NumberOfData'] = parse_number(items[25])
header['Data'] = [parse_number(x) / 1000 for x in items[26:26+header['NumberOfData']]]
return header
#-------------------------------------------------
#----------------Starting the main----------------
if __name__ == '__main__':
x = ser.readline()
print x
x = "startscan"
if (x == "startscan"): #"startscan"):
logFile = createLogFile()
print "Sending start massage to Lidar scan...."
s.send(b'\x02sEN LMDscandata 1\x03\0')
data = None
print "Send"
print "Datagram generator"
datagrams_generator = datagrams_from_socket(s)
print "Generated datagram"
while 1:
print "next datagram"
datagram = next(datagrams_generator)
print "next datagram done"
print "decoding datagram"
decoded = decode_datagram(datagram)
print "done decoding datagram"
if decoded is not None:
s.send(b'\x02sEN LMDscandata 0\x03\0')
var = 1
print decoded['Data']
print linspace((TIM561_START_ANGLE, TIM561_STOP_ANGLE, len(decoded['Data'])).tolist())