風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

python+pySerial+XMODEM

python + pySerial + XMODEM でシリアル通信を使ってXMODEMでデータを送信する方法です。

■pySerial, XMODEMをインストールする

pyserial
http://pyserial.sourceforge.net/
XMODEM
http://pypi.python.org/pypi/xmodem

標準のpythonにはシリアル通信モジュール、XMODEMモジュールどちらもついていないので、 ダウンロードしてインストール。

■使い方


import serial
from xmodem import XMODEM
from time import sleep

def getc(size, timeout=1):
	return comPort.read(size);

def putc(data, timeout=1):
	comPort.write(data)
	# sleep(0.001)
	
comPort = serial.Serial(port='COM1', parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE, timeout=0, baudrate=115200)

# ...

send_buf = open('sendfile', 'rb')
print XMODEM(getc, putc).send(send_buf)
send_buf.close()

こんな感じで。

  • シリアルポートをオープンします
  • 通信相手をXMODEM受信待ちにします(NAKを定期的に送ってくる状態)
    • ここは相手によって異なるので、適切に。何かのコマンドを送るとか
  • データ送受信のためのputc, getc 関数を定義して、XMODEMのコンストラクタで渡します
    • 今回の場合、シリアル通信なので、Serial.write(), Serial.read() をラップしてあげればOK
  • XMODEM.send() で送信したいストリームを送ります
    • 上の例はバイナリファイルを送ってます
  • 送信に成功すると true、失敗すると false が返ってきます
  • 通信相手に応じてsleep()を入れてあげると安定したりすることがあるようです
広告を非表示にする
(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) ol.className = "preLine" ol.setAttribute("role", "presentation") for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)