LCDデバイスのつながっているシリアルポートを調べる

環境が変わったらシリアルの設定を変更するのが面倒なので、この部分を先に処理することにした。
前に書いたように、シリアルを番号順に全部なめて、使えるシリアルポートを調べた上で、そのポートの先と通信してみて、想定する答えの返ってくるものを調べるだけ。
ほんとは、WindowsのUSBデバイスリストを参照して、当該デバイスであるCP2102が接続されているポートを調べるとかのほうが美しいのだろうど。
http://d.hatena.ne.jp/kinneko/20070524/p11
今の方法にも利点があって、このままLinuxでも使えそう。なのでWindowsではなさそうな0の場合を除外していない。
検索デバイスの上限は20にしているけど、これ以上があるのは見たことがないからという理由。PCATだったかWindowsだったかのシリアル数って上限があったような気もするけど調べてない。

# cording: "utf-8"

import serial

com = serial.Serial(baudrate=115200, bytesize=8, parity='N', stopbits=1,
	timeout=3, xonxoff=0, rtscts=0, writeTimeout=None,dsrdtr=None)

comlist = []

for i in range(20):
	com.port=i
	try:
		com.open()
		if com.isOpen() == True:
			print >>com, '@HELLO'
			lcdstatus=com.readline()
			ans = lcdstatus.strip()
			if ans == "@ACK":
				comlist.append(i)
		com.close()
	except:
		print "port " + str(i) + " couldn't open."

for j in comlist:
	print str(j)

複数つながっているのは検知できるけど、どのみち1つしか使えないので、デバイス番号の少ないほうに"ready"か何か表示させたほうがいいかな。

for j in comlist:
	if j == comlist[0]:
		com.port=j
		com.open()
		print >>com, '@TITLE'
		comport = j
		# com.close() # don't close for use.
	else:
		com.port=j
		com.open()
		blankmsg="%"+"FF"*61*8
		print >>com, blankmsg
		com.close()

print comport

jのループに追記して、動作するものにはメッセージを出し、動作しないものにはブランクを表示するようにした。