最初は、PYthon 2.7.5、Python 2.7.x、Windows 7 (64)、および FTDIFT232RL (実際の RS232 シリアル ポートではない) の最後のバージョンで pySerial を使用しています。テストのために、このコードを作成しました:
class cProduction:
g_comPort_name = "COM1"
g_comPort = 0
# Instance of object -------------------------------------------------------
def __init__(self, portName):
self.data = []
self.g_comPort_name = portName
# Main functions -----------------------------------------------------------
def start(self):
""" Open port, configure port, set pins of serial line to default state
DTR true, RTS false """
try:
self.g_comPort = serial.Serial(
port = self.g_comPort_name,
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 10,
dsrdtr = False,
xonxoff = False,
rtscts = False)
if self.g_comPort.isOpen():
return True
else:
return False
except:
return False
return False
主要:
prod = cProduction("COM33")
if prod.start():
print Style.BRIGHT + Fore.YELLOW + "Open" + Style.RESET_ALL
while True:
key = raw_input('key: ')
if key == "R":
prod.g_comPort.setRTS(True)
if key == "r":
prod.g_comPort.setRTS(False)
if key == "D":
prod.g_comPort.setDTR(True)
if key == "d":
prod.g_comPort.setDTR(False)
else:
print Style.BRIGHT + Fore.RED + "Error while starting production module" + Style.RESET_ALL
RTS はうまく機能していますが、DTR に問題があります。DTR を False に設定すると、DTR が実際には低レベルに設定されていることをオシロスコープで確認できますが、700 ミリ秒後に高レベルに戻ります (私の側からの割り込みはありません)。この時点で setDTR(False) は機能しなくなりました。最初に setDTR(True) を呼び出す必要があり、その後 setDTR(False) が再び機能します (ただし、700 ミリ秒後に再び高レベルに戻ります)。700msという時間はすべて同じでした。「dsrdtr」または「rtscts」の構成を変更しようとしましたが、役に立ちませんでした。
私のデバイスで正しく動作する C++ ベースの Qt アプリケーションがあり、今はそれを Python に書き直そうとしているので、デバイスが正しいことを 100% 確信しています。
編集:ラップトップの実際の RS232 COM ポートで試してみましたが、正しく動作しています。そのため、pySerial には FTDI チップを搭載した仮想 COM ポートに問題があるようです...