2008年4月16日水曜日

Com ポートの制御、その1

pySerial 使って Serial port を制御する。

Win32 + Python で RS-232C ポートを制御するには、(くどいですが) 標準の Python 2.5(win32) に加えてPywin32 と pySerial ライブラリモジュールの追加インストールが必要です。
作業は、これでほとんどの終わりで、あとは書いて試すだけです。

他のターミナルソフト や 確認用ドングル で、実験する COM port のCOM番号を確認します。
port = 0, の値は、確認したCOMの値 -1 、 COM1 なら (-1して)、0 にします。
タイムアウトの値は秒。駄目そうなことが自分で分かる程度、むっとする程度で、きれない程度の秒。

  1. COMポートの設定。
  2. Tx-Rxループの確認、文字を \n 付きで送信する。 readline() で \n まで受信する。
  3. オープンの端子(CD、RI)を読んだ値が、どうなるのか確認しておく。
  4. RTS-CTS ループを確認する。
  5. DTR-DSR ループを確認する。
  6. 4と5 を反転して、もう一度。

確認用折り返しドングルを外し、同じ事をする。

USB serial などで、折り返し確認がうまく行かないときは、
 setXX() と getXX()の間に、time モジュール(標準)の sleep(0.1)
程度入れてみるのも手です。

これで PonyProg みたいなのを自分で作ってみたり。。。とか。。。まだ無理?

あぁ、Tab使ったインデントが壊れてます。これからやばいですねー、なにか対策を考えないと。
まぁ、まだしばらくは、大丈夫なのですが(笑

-----------------

## Win32 (WinXP)
## Python2.5 (for win32)
## Pywin32 210 (for win32 Python2.5)
## pySerial 2.2 (for win32 Python2.5)

import serial

ser = serial.Serial(
port = 0, ## COM1 = 0, COM2 = 1, ...
baudrate = 9600,
parity = serial.PARITY_NONE,
bytesize = serial.EIGHTBITS,
stopbits = serial.STOPBITS_ONE,
timeout = 1, ## Sec
)

ser.open()

## Tx - Rx loop
ser.write('Hi!\n')
LineData = ser.readline()
print 'Rx : ', LineData

## Open pins
RI = ser.getRI()
CD = ser.getCD()

print 'Open RI : ',RI
print 'Open CD : ',CD

## RTS CTS loop
ser.setRTS(1) # Plus
CTS = ser.getCTS()
print 'Set RTS(1) then CTS : ',CTS

## DTR DSR loop
ser.setDTR(0) # Minus
DSR = ser.getDSR()
print 'Set DTR(0) then DSR : ',DSR

## RTS CTS loop
ser.setRTS(0) # Minus
CTS = ser.getCTS()
print 'Set RTS(0) then CTS : ',CTS

## DTR DSR loop
ser.setDTR(1) # Plus
DSR = ser.getDSR()
print 'Set DTR(1) then DSR : ',DSR

ser.close()
##raw_input()

---------------
確認用ドングル が付いているとき。

Rx : Hi!

Open RI : False
Open CD : False
Set RTS(1) then CTS : True
Set DTR(0) then DSR : False
Set RTS(0) then CTS : False
Set DTR(1) then DSR : True
>>>

---------------
確認用ドングル なし、受信タイムアウト (に設定した秒) 後に表示されます。

Rx :
Open RI : False
Open CD : False
Set RTS(1) then CTS : False
Set DTR(0) then DSR : False
Set RTS(0) then CTS : False
Set DTR(1) then DSR : False
>>>

0 件のコメント: