Python挂起在next()函数

时间:2017-04-11 14:49:18

标签: python python-2.7 python-3.x

我正在尝试在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())

0 个答案:

没有答案