シリアルポートからデータを読む
計測制御系研究室なので、こういったことを扱う機会が多い。
研究室のパソコンには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*2のGUIについては省略。py2exe*3でexeにしてから使う。
ついでに他言語で。
今日は暖かいですね。
道路の凍ってた雪も溶けちまいました。
何度滑ってコケかけたことか知れませんが、無くなるとちょっと寂しい。