在python中同时打开2个串行端口(一个tx一个用于rx)

时间:2016-04-30 05:04:18

标签: python pyserial

我正在为蓝牙链接进行吞吐量测试,我需要通过串口将数据发送到一个蓝牙设备,然后蓝牙设备将该数据无线传输到另一个蓝牙设备。然后,另一个设备将通过不同的串行端口将数据发送回主机PC来完成电路。

问题似乎是当我尝试打开2个不同的PySerial实例时,程序只是挂起。当我注释掉两个串口实例中的一个时,我已将它隔离到运行与挂起。有人看到我这样做的问题吗?如果是这样,这样做的正确方法是什么?请参阅以下代码:

#/usr/bin/python

import serial
import time
import sys

DEFAULT_BAUD = 115200
SEND_SIZE = 100

def addPath(file):
    pth, fl = os.path.split(__file__)
    return os.path.join(pth, file)

def is_number(s):
    try:
        int(s, 16)
        return True
    except:
        return False

class SerialReader():
    def __init__(self, portRx, portTx):
        self.portTx = portTx
        self.portRx = portRx
        self.start_time__sec = time.time()
        self.interval__sec = 0
        self.buffer = []
        self.sendtext = ''.join([str(i) for i in range(SEND_SIZE)])

    # send first batch of data
    self.portTx.write(self.sendtext)

    def didDataArrive(self):

        # Read port
        self.buffer.extend(list(self.portRx.read(1024)))

        # Step through the buffer byte and byte and see if the tick text
        # is at the front.
        while len(self.buffer) >= len(self.sendtext):
            if self.buffer[:len(self.sendtext)] == self.sendtext:

                # Discard the tick text
                self.buffer = self.buffer[len(self.sendtext):]

                # Record time
                snapshot__sec = time.time()
                self.interval__sec = snapshot__sec - self.start_time__sec
                self.start_time__sec = snapshot__sec
                # send more data
                self.portTx.write(self.sendtext)
                return True

            else:
                self.buffer.pop(0)

        return False

def main(port1, port2, baudrate1 = DEFAULT_BAUD, baudrate2 = DEFAULT_BAUD):
    try:
        import serial
    except:
        traceback.print_exc()
        print "="*60
        print "You need to install PySerial"
        print "Windows: easy_install pyserial"
        print "Mac/Linux: sudo easy_install pyserial"

    try:
        s1 = serial.Serial(port1, baudrate1, timeout = 0.1)
        s2 = serial.Serial(port2, baudrate2, timeout = 0.1)
        print "Loading serial ports"
    except:
        print "Serial port error"
        exit()

    plot_stop = False

    dataread = SerialReader(s2, s1)

    try:
        while plot_stop == False:
            if dataread.didDataArrive():
                print dataread.interval__sec

    except KeyboardInterrupt:
        print "Keyboard Interrupt"
        plot_stop = True

    finally:
        print "Closing"
        s1.close()
        s2.close()

if __name__ == '__main__':
    if (len(sys.argv) < 3):
        print "Usage: python extract_data.py phonelink_serialport phonelinkclient_serialport [baudrate1] [baudrate2]"
    else:
        main(*sys.argv[1:])

如果我删除以下行之一(并不重要),python脚本会运行(虽然它最终会崩溃,因为在代码中它最终会尝试引用这两个端口)。如果我留下这些线,程序似乎只是挂起(它似乎只是坐在那里并无限期地运行):

s1 = serial.Serial(port1, baudrate1, timeout = 0.1)
s2 = serial.Serial(port2, baudrate2, timeout = 0.1)

0 个答案:

没有答案