シリアルポートからデータを読む

計測制御系研究室なので、こういったことを扱う機会が多い。
研究室のパソコンにはPerlとCと、後Javaランタイムしか入って無いのだが、あえてPythonで書いてみる。今年はPythonもインストールしよう。
pySerial*1使用。

01: import wx
02: import serial
03: class SerPanel(wx.Panel) :
04:  def __init__(self,parent,id) :
05:   wx.Panel.__init__(self,parent,-1)
06:   sizer=wx.BoxSizer(wx.HORIZONTAL)
07:   txt=wx.StaticText(self,-1,"COM:")
08:   sizer.Add(txt,0,wx.CENTER|wx.ALL)
09:   self.comtext=wx.TextCtrl(self,-1,"1",size=wx.Size(20,20))
10:   sizer.Add(self.comtext)
11:   self.textbox=wx.TextCtrl(self,-1,"",size=wx.Size(280,20))
12:   sizer.Add(self.textbox)
13:   trigbtn=wx.Button(self,-1,"TRIG",style=wx.BU_EXACTFIT)
14:   self.Bind(wx.EVT_BUTTON,self.TrigButton,trigbtn)
15:   sizer.Add(trigbtn)
16:   self.SetSizer(sizer)
17:   self.SetAutoLayout(True)
18:  def TrigButton(self,event) :
19:   comt=self.comtext.GetValue()
20:   comnum=int(comt)-1
21:   ser=serial.Serial(comnum,9600,serial.EIGHTBITS,serial.PARITY_NONE,serial.STOPBITS_ONE)
22:   ser.timeout=30
23:   ser.rtscts=0
24:   ser.open()
25:   sstr=ser.read(15)
26:   self.textbox.SetValue(sstr)
27:   ser.close()
28: class SerApp(wx.App) :
29:  def OnInit(self) :
30:   frame=wx.Frame(None,1,"SerialPortReader",(-1,-1),(380,30))
31:   SerPanel(frame,-1)
32:   self.SetTopWindow(frame)
33:   frame.Show()
34:   frame.Fit()
35:   return True
36: if __name__=='__main__' :
37:  app=SerApp()
38:  app.MainLoop()

21行目はser=serial.Serial(comnum)でもいいし、23行目は省略可。あえて明示させた。ポート番号は0から始まるので、COM1を開く時には入力窓に「1」と入力させてから1引く(19-20行目)。22行目でタイムアウト30秒、24行目でポートをopenして、25行目で15バイト読み込み、27行目でclose。wxPython*2GUIについては省略。py2exe*3でexeにしてから使う。

ついでに他言語で。

うーん。やっぱりPythonが1番使いやすい。Javaはちょっと神経質な感じ。