具有串行端口的Python线程等待其他线程完成

时间:2018-10-17 00:27:18

标签: python multithreading queue pyserial

队列和线程的新手,但是当我使我的程序开始工作并运行两个彼此独立的电机线程时,ive注意到仍然有一个时间点,一个将等待另一个线程完成。

我在直线导轨上有2个电机。为了验证其一致性,可重复性和准确性,它进行了家庭测试。只需给电动机进行固定数量的测试并确定要去的位置,然后来回运行,记录数据,并告诉我步距和距离都接近多远。奇怪的行为是,一个电动机在开始下一个循环之前正在等待另一个电动机完成其循环。

我的猜测是这是串行读取的问题,在这种情况下,我的电机被抬起,等待一台电机上的串行读取,而另一台电机无法执行。谁能确认或解决这个问题?

测试代码,包装在类中

def home(self):
    DIConf = None
    debugStart = time.time()
    while DIConf != -1:
        self.anyCMD('DI-1')
        while DIConf == None:
            DIConf = self.checkReturn('DI')
        if time.time() - debugStart >= 5:
            print 'DIConf = ' + str(DIConf)
            return 'Homing Timeout'
    self.s.write('SH1H\r')

def homeTest(self, numTests = 30, testPos = 100000):
    if numTests == None:
        numTests = 30
    if testPos == None:
        testPos = 100000
    self.tests = numTests
    self.testingPos = testPos
    self.B = np.zeros((tests, 4))
    for i in range(0, self.tests):
    #    print i
        self.setPos(0)
        self.start = time.time()
        self.gotoPos(self.testingPos)
        self.s.write('WM\r')
        time.sleep(2)
        while self.getPos() < self.testingPos:
            pass
        self.testPosConfirm = self.getPos()
        self.home()#(setHomePos = 1)
        self.s.write('WM\r')
        time.sleep(2)
        self.end = time.time()
        self.backHome = self.getPos()
        self.B[i][0] = self.testPosConfirm
        self.B[i][1] = self.backHome
        self.B[i][2] = (float(self.backHome)/20000) * 3.175
        self.B[i][3] = self.end-self.start
    return self.B

和队列/线程的代码

import Queue
import threading
a = Queue.Queue()
b = Queue.Queue()
y = motor(DA = 1)
z = motor(DA = 2)

def yQueue(tempY, tempA, cycles = None, defPos = None):
    tempVar = tempY.homeTest(cycles, defPos)
    tempA.put(tempVar)

if 1 == 1:
    thread = threading.Thread(target = yQueue, args = [y, a, 5, 50000])
    thread2 = threading.Thread(target = yQueue, args = [z, b, 5, 600000])
    thread.start()
    thread2.start()

如下所示。在“多处理”中尝试相同的操作并获得了相似的结果。

代码:

import multiprocessing as mp
p = mp.Process(target = yQueue, args = [y, a, 3, 40000])
p.start()
p.join
p2 = Process(target = yQueue, args = [z, b, 3, 500000])
p2.start()
p2.join

0 个答案:

没有答案