2014-12-23 2 views
2

Я пишу интерфейс для старого электронного оборудования, которое использует серийный номер RS232. Я столкнулся с проблемой, которую я не могу решить. Вот исходный кодПочему print() влияет на чтение com1?

def readMyPort(): 
    global readPort 
    while True: #always loop 
     if readPort: # only do something of the port is active 
      dataString = b'' 
      while (mySerialPort.inWaiting()>0): 
       data = mySerialPort.read(1) 
       if (data == b'') or (data == b'\r') or (data == b'\n'): 
        if (dataString != b''): 
         myOutput.insert('1.0', (dataString + b'\n').decode()) 
         dataString = b'' 
       else: 
        dataString += data 

Проблема я сталкиваюсь не в том, что прибор посылает строку из 12 символов в ответ на команду, и я, кажется, только чтобы успеть на последний 4, и нет, не существует «» , '\ r' или '\ n' в строке. Чтобы устранить неполадки, я добавил print(), как показано ниже. Волшебно я начал получать все данные.

def readMyPort(): 
    global readPort 
    while True: #always loop 
     if readPort: # only do something of the port is active 
      dataString = b'' 
      while (mySerialPort.inWaiting()>0): 
       data = mySerialPort.read(1) 
       print(data) #<-------- the added line 
       if (data == b'') or (data == b'\r') or (data == b'\n'): 
        if (dataString != b''): 
         myOutput.insert('1.0', (dataString + b'\n').decode()) 
         dataString = b'' 
       else: 
        dataString += data 

Теперь я не хочу, чтобы вся эта печать продолжалась нормально. Я попробовал просто добавить print(''), и это тоже работает, но у меня все еще есть все, что печатается. Я пробовал print('', end = '\r'), но это не сработало. У кого-нибудь есть идея, почему? Я не думаю, что это проблема скорости. Я всего лишь 9600 бод. FYI: python 3.2 на машине Win32. Эта процедура запускается в ее собственной теме.

ответ

0

Операция print(data) требует некоторого времени (относительно большого), чтобы напечатать что-то на консоли. Поэтому, добавив строку print(data), вы просто добавляете задержку в свой цикл. Вы можете проверить эту теорию, заменив print(data) на time.sleep(0.1 or whatever small value) и проверяя, что проблема, надеюсь, ушла.

Я думаю, что задержка помогает, потому что без него mySerialPort.inWaiting() может, становится 0 иногда (приемный буфер пуст) перед тем сделка фактически завершена. Ваш инструмент не может просто быстро выводить данные. В вашей окончательной версии кода вы можете добавить time.sleep() вместо print(data).

+0

Спасибо за предложение. Раньше я пытался добавить задержку, но, возможно, мне не хватило времени. –

0

Следуя ответам Константина, кажется, что для последовательного порта требуется некоторое время для настройки буфера и счетчиков, поэтому добавление небольшой задержки в цикл решает мою проблему. 1 мс недостаточно, но 10 мс. Конечный код:

def readMyPort(): 
    global readPort 
    while True: #always loop 
     if readPort: # only do something if the port is active 
      dataString = b'' 
      while (mySerialPort.inWaiting()>0): #if something is in the buffer 
       data = mySerialPort.read(1) 
       if (data == b'') or (data == b'\r') or (data == b'\n'): 
        if (dataString != b''): #don't output empty strings 
         myOutput.insert('1.0', (dataString + b'\n').decode()) 
         dataString = b'' 
       else: 
        dataString += data 
        time.sleep(0.01) #slow the loop down a bit 

Я продолжаю удивляться, есть ли более элегантное решение.