Проблема открытия последовательного порта с помощью Pyserial - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь прочитать числовые значения, отправленные через модем Bluetooth через последовательный порт, используя Pyserial. Я новичок в Python, и нашел хороший пример, который я пытаюсь использовать.

from threading import Thread
import time
import serial

last_received = ''
def receiving(ser):
    global last_received
    buffer = ''
    while True:
        buffer = buffer + ser.read(ser.inWaiting())
        if '\n' in buffer:
            lines = buffer.split('\n') # Guaranteed to have at least 2 entries
            last_received = lines[-2]
            #If the modem sends lots of empty lines, you'll lose the
            #last filled line, so you could make the above statement conditional
            #like so: if lines[-2]: last_received = lines[-2]
            buffer = lines[-1]


class SerialData(object):
    def __init__(self, init=50):
        try:
            self.ser = ser = serial.Serial(
            port='/dev/tty.FireFly-16CB-SPP',
            baudrate=115200,
            stopbits=serial.STOPBITS_ONE,
            bytesize=serial.EIGHTBITS
            )
        except serial.serialutil.SerialException:
            #no serial connection
            self.ser = None
        else:
            Thread(target=receiving, args=(self.ser,)).start()

    def next(self):
        if not self.ser:
            return 140 #return anything so we can test when Arduino isn't connected
        #return a float value or try a few times until we get one
        for i in range(40):
            raw_line = last_received
            try:
                return float(raw_line.strip())
            except ValueError:
                print 'bogus data',raw_line
                time.sleep(.005)
        return 0.
    def __del__(self):
        if self.ser:
            self.ser.close()

if __name__=='__main__':
    s = SerialData()
    for i in range(500):
        time.sleep(.015)
        print s.next()

Я могу открыть порт в другой программе и отправлять / получать данные из него. Однако приведенный выше код, по-видимому, не открывает порт, а просто повторяет «100» в окне терминала 500 раз, но я не знаю, откуда он или почему порт не открывается правильно. Открытие порта не задерживается, как в другой программе, поэтому я даже не знаю, пытается ли он открыть.

Я не знаю, что еще попробовать или где ошибка, поэтому я прошу помощи. Что я делаю неправильно?

1 Ответ

3 голосов
/ 30 марта 2011
except serial.serialutil.SerialException:

Вы ловите и заглушаете ошибки при подключении. Закомментируйте этот блок и посмотрите, не выдаст ли он сообщение об ошибке.

...