↔️

SeristerのOSSクローンを作った

2023/08/05に公開

みなさん、シリアル通信使っていますか?
過去の技術のようで、まだまだ活躍の場が多い仕組みだと思います。
シリアル通信のちょっとした動作確認をする際、便利なツールとしてSeristerがあります。
今回、このSristerのクローンを作成したので、その動機等をここに書かせていただきます。

作ったものは↓になります。

https://github.com/mathter7/Seristerll

そもそもシリアル通信とは?

広義には一本の伝送路を用いて1bitづつデータを転送する通信方式とされています。
狭義には主にD-sub端子で接続されるRS-232C通信を指す場合があります。
本稿ではこちらの意味で使用します。

Serister とは

Seristerはオオシマアキヒロ氏が開発し、Vectorで公開されているフリーソフトです。
OSSではないのでソースコードは公開されていません。
バグが放置されたまま開発が停止していますが、その使い勝手の良さから今でも人気のあるシリアル通信テストアプリケーションです。

Serister のバグ

null(0x00)が正しく処理できない

送受信データ内にnull(0x00)があると、それ以降のデータが消失するという不具合があります。
おそらく、送受信データをchar配列として扱った際にnullを終端コードと判定して処理してしまっているのだと推測します。

9番ポートまでしか使えない

これはバグではなく仕様といえるかもしれませんが、シリアル通信のポートとして9番までしか指定できません。Win32APIの仕様によるものだと推測します。Win32APIでは一応10番以降のポートも使用することが可能ですが、ちょっと特殊な追加処理が必要になります。

Arduinoや Raspberry pi pico等で電子工作をする際、ボードとは仮想シリアルポート(USB CDCクラス)で接続することが多いと思います。色々なボードで遊んでいると、シリアルポート番号はあっというまに10、20となってしまうので、Seristerの9番までしか使えない制限は非常に不便です。デバイス設定からポート番号を振り直すことも可能ですが、かなり面倒です。

クローンするにあたって

今回、OSSクローンを作るにあたって以下の技術を用いました。

  • C#言語
  • WPF
  • .NET Framework 4.7.2
  • ReactiveProperty.Core

基本的には自分が使い慣れた言語、フレームワークを選びましたが、
それ以外にも考慮した点があります。それは生成物の取り回しの良さです。
本家Seristerの良さはその使い勝手の良さです。
1バイナリで約1MBと軽量であり、ランタイムインストールなども不要であることも
使い勝手の良さにつながっていると考えました。
今回クローンするにあたって、この取り回しの良さもなるべく維持したいと考えました。

GUIを作成するにあたり、Electron等をもちいてクロスプラットフォーム化することも考えたのですが、生成物が肥大化するため不採用となりました。

C#/WPF

オリジナルのSerister はWin32APIとC/C++言語で作られていると思われます。
自分が使い慣れた言語が一番効率が良いとは思いますが、さすがにWin32APIを直に扱うよりも開発効率は高いはずです。
C#は.NET Frameworkベースの言語なので、本当はランタイムのインストールが必要です。
しかし、2012年に発売されたWindows8移行、.NET Framework4.x がOSにプリインストールされています。
つまり、世の中で稼働しているほとんどのWindowsPCのには.NET Framework4.x がプリインストールされいるといえます。Windows11でも現状、.NET Framework 4.8がプリインストールされており、その状況はまだしばらく続くと予測しています。なので取り回しはそこまで悪くならないのではないかと考えました。

.NET Framework

2023年8月現在、.NET Framework はメジャーアップデートを終了しており、
OSS化された後継の.NET (Core) が主流となっています。
それにもかかわらず、今回 .NET Framework を仕様したのには理由があります。
.NET(Core) の場合、どうしてもランタイムのインストールが必要ですし、単体起動可能なビルド設定にするとファイルサイズが巨大になってしまいます。
先述の通り、現在世の中で稼働しているWindowsPCには.NET Framework4.x がプリインストールされています。.NET Frameworkで開発することで、オリジナルに近い取り回しの良さを維持しています。

まとめ、今後の展望

今回、開発効率と本家Seristerの良さの維持という2つの目的を達成するため、.NET Framework とC#/WPF での開発を行いました。
しかし、.NET Framework もいつかはプリインストールされなくなるでしょうし、やがてはサポートすら打ち切られるでしょう。
長期的な視点では別の言語、フレームワークで作り直したいと考えています。
目下検討しているのはRust+Win32API です。
もし、開発効率と生成物の取り回しの良さを両立できる良いアイディアをお持ちの方がいれば、アドバイスを頂けると幸いです。

Discussion