秋月オシロ波形を自作ソフトで受信してみる | 遥かなるひよこ道
タイトルのとおりである。秋月オシロはjeytechだか中国メーカ製で、英語の説明書に通信に付いても数行くらい書いてある。
だいたい訳すと「画面をビットマップでPCに送る方法」の項にあり、
XMODEMによる通信でボーレート38400bps、データビット8、ストップビット1、ノンパリ、ノンフロー
とのこと。
XMODEMについては右の通りである→ 右の通り <やりたいやつはよくよめ
僕も探したが他にめぼしい資料もなく、リンク資料がいちばんわかりやすい。

ソフトはVBで製作、シリアルポートコンポーネントでやる。
ポイントをメモ的にあげていく
○プロトコル仕様では受信側(VBソフト)がNAKなりCなりを送るということになっているが、秋月オシロはSendを押した瞬間から送信される
受信側は待つ一方でいいというわけだ

○チェックサムではなくCRCによる誤りチェックを使用している。プロトコルとしてはXMODEM1Kに相当するっぽい。1Kはヘッダによってデータバイトを128byteか1024byteかを見分ける。秋月オシロが出すヘッダはSOH(start of head)=データ長128byte。
→データ長128byteで末尾にCRC2バイト

○EOT受信時採草要求を出しても無視される。というより秋月オシロはEOTを出した瞬間に[Send Successful]となり通信が終わる。
→EOT確認による通信信頼性向上はできない

上記さえ押さえておけばあとは通常のシリアル通信である。おちちついてやってほしい。

とりあえず自分でやった場合の簡単な受信フローをのせる。正しいかどうかはわからんがな。ふぁっ
//ヘッダのチェック
rb=readbyte()
if rb <> SOH 
//EOTなら終わる
  if rb = EOT
    all_reciev = 1
    writebyte(ACK)
    return
  endif
  writebyte(NAK)
  return
end if
//シーケンス番号
rb=readbyte()
if rb <> BlockNumber
 writebyte(NAK)
 return
end if
//シーケンス番号の補数
rb = readbyte()
if rb <> 255 - BlockNumber
 writebyte(NAK)
 return
end if
BlockNumber++
//データ受信
read(data, 0 128)
//CRC符号
crc1 = readbyte()
crc2 = readbyte()
if checkCRC(crc1, crc2)
  writebyte(NAK)
  return
end if
//ACK応答
writebyte(ACK)

とりあえず適当ザ言語で書いてみた。
簡単な処理の流れで実際はシーケンス番号が飛んでたらCANを送るとか信頼性向上を図る仕組みがあるがここにはのせない。多くは語らないのである。

そふと


あとは波形画像を比較できたりクイック保存があれば便利かなあと。
カラーにするのもいいかも

◆補足 ビットマップの形式
先頭2バイトがファイル形式を表す B と M のバイナリ
次の4バイトがファイルサイズ 
次の4バイトが予約域
次の4バイトがオフセットバイト