Windows用シリアル通信コントロール新旧の留意点

電子コントローラとシリアル通信で通信するWindowsアプリを作成する場合、弊方では動作が軽く、細かくコントロールしたいため大体Win32APIを直接使います。

Windows用製シリアル通信コントロールは、自主トライや既存コードが使っていた場合に使用しています。その際に気づいた事項の覚書です。


.NET の標準コントロール SerialPort は以下の特徴があるようです。

  • 当然ですがMFC や VB6 では使用できない。
  • Windowsレジストリ登録は不要。
  • 受信イベントは画面と別スレッドで動作する。
  • 特に多機能ではない。

以下留意点です。

受信イベントは別スレッドで動作するためデリゲート( Swiftのデリゲートとは異なる物です )が必要になります。 そのままだとbuildエラーか実行時にエラーが出ます。デリケートは .NET の特有のややとっつきにくい部分、理解してもたまに使う程度なのでよく忘れてしまいます。以下コード例です。

private:
delegate void formatReceiveData_Delegate(void);	    // デリゲートの型宣言
formatReceiveData_Delegate^ formatReceiveData_Obj;  // デリゲートのインスタンス宣言	
    :
    :

private: System::Void Form1_Load(
   System::Object^  sender, 
   System::EventArgs^  e
) {
    :
    :
   // UI操作を行うmethodのデリゲートを生成、生成は一度でOK
   formatReceiveData_Obj	= gcnew formatReceiveData_Delegate(this, &Form1::formatReceiveData);
    :
    :
}

private: System::Void serialPort1_DataReceived(
   System::Object^ sender, 
   System::IO::Ports::SerialDataReceivedEventArgs^ e
) {
	if ( dgrdReceive->InvokeRequired ) {		// thread排他が必要か、対象UIで判別。

		// デリゲートを排他無しで呼び出す
		this->BeginInvoke( this->formatReceiveData_Obj );
	}
	else {
		formatReceiveData();			// 受信値表示
	}

	procReceivedAfter( serialPort1 );  // 受信後処理
}

private: System::Void formatReceiveData(void) {
    :
    :
    UI処理 ....
    :
    :

ASCIIコード通信など不定長フレーム通信にて、msecオーダーで受信イベントが発生すると、忙しすぎて画面操作イベントが受付けられずフリーズ状態に至ってしまいます。 .NETでもこんなもんなんですね。PC は core i7 です。

対策するには、受信専用Thread立てます。以下コード例です。

private:
		Thread^	recvTheard = nullptr;
		static	System::IO::Ports::SerialPort^  _serialPort1;

private: System::Void btnOpen_Click(
   System::Object^ sender, 
   System::EventArgs^ e
) {
  	_serialPort1	= serialPort1;  // Thread内で参照用にstaticにインスタンス退避
		serialPort1->Open();
		recvTheard = gcnew Thread( gcnew ThreadStart( this->RecvThreadMain ) );
		recvTheard->Start( );
}

public: static System::Void RecvThreadMain( 
	void
) {
	char rcvBytes[8192];

	while( 1 ) {
			Byte	rcvByte;
			Int32	rcvLen;
			try {
			  // 不定長の場合はその時々で受信した分を読む
 				 rcvByte		= _serialPort1->ReadByte();
				 _serialPort1->Read( rcvBytes, rcvByte );  
			}
			catch (System::TimeoutException^ exp) {
				// タイムアウトはスルー
			}
	}

受信の都度、UIに表示するとマトモに見えないので、表示内容は変数にキャッシュしておいて、Timerコントロールで0.5秒周期程度で、キャッシュした表示内容をまとめて反映させるようにします。これで下図くらい改善されます。

秒オーダーの応答性でよい場合以外は、受信インベントは使わない方が無難なようです。


2000年以前から存在しているVB6標準のコントロール、まだ使用されている場合かあるようです。弊方では最近まで使ったことはありませんでした。以下の特徴があるようです。

  • たぶん MFC か VB6 でないと使用できない。
  • 実行するPCにて、Windowsレジストリ登録が必要。
  • 通信用スレッドは立てないので、通信周期によっては画面処理の応答性が落ちる。
  • 使い方がシンプル。
  • ナゾが多い。

以下留意点です。

普通に受信させると下図のようになってしまいます。

これによる具体的弊害は、

  • 60byte超えるパケットを読む場合、ロジックでバッファリングする必要がある。
  • シリアルポートOPEN直後、60byte受信バッファに溜まるのでアプリが応答しなくなってしまう。

その半面メリットも考えられます。

  • 受信イベントが多発しないため、.NETの様に大量受信時にフリーズ状態になりにくい。


ActiveCommはかつて販売されていたサードパーティのコントロールです。これもかなり古いものです。以下の特徴があるようです。

  • たぶんMFC か VB6 でないと使用できない。
  • 実行するPCにて、Windowsレジストリ登録が必要。
  • 通信用スレッドは立てないので、通信周期によっては画面処理の応答性が落ちる。
  • MS Comm よりは普通に使える。

昔々使った印象ですと、購入して使うほどメリットはないと感じていましたが、MS Comm の奇妙さを目のあたりにすると有用性はあったのかと思います。


java には、jSerialComm というものがあるようですね。今度また。


あまり知られた情報ではないかもしれませんが、リアルRS232C、USBシリアル変換器の種類によって、単位時間あたりの ReadFile API で読めるサイズが変わります。1フレームを受信長で十分なタイムアウト時間で受信ストリームバッファを活用してRead待ちしている場合は関係ないですが、1~数byteづづ受信都度読みをしている場合はこの影響をうけます。アプリ側に作りによっては、RS232Cの種類によって動作がかわってしまいます。この影響か、上記コントロールにどこまで影響を与えているかは分っていません。このことが「USBシリアル変換器の相性問題」の要因かもしれません。


以上、Windows用シリアル通信コントロール新旧の留意点です。何にしても用途に応じてWin32APIを直接使い 内部Thread動作する.dllコントロールを作成するのがベストです。組込み機器との通信となると、どうしても応答性が求められてしまいます。 この主のWindowsアプリケーションで、不安定、遅い、応答性悪いが、対策時間ない/対策する自信がないなどお困りの場合は、こちらまでご相談してみてださい。アプリは本体は作るが、.dll 側だけ頼みたい場合でも製作したします。

SGP311:Xperia Tablet Z Wi-Fi 16GB版をAndroid 13相当にSetupする

以前 Xperia Tablet Z Wi-Fi 32bit版:SGP312 を Android13 相当にsetupしました。本モデルには、16GB版の SGP311 があります。今回はこちらの方をセットアップしました。32GB版SGP312との違いを報告します。


海外ではこちらの方がポピュラーに模様です。日本では J:COM モデルが存在するようです。今回実施したのは、そのモデルでした。FlashTool のログでは以下の様に日本向けWifi 16GBモデルとなっているようです。


受領した J:COM モデル は Android 4.2.2 でした。

アップデートサービスが無かったのかは定かではありませんが、ROMレイアウトを純正の最終版に変更しておかないと、カスタムROMとマッチしない場合が多いため、5.1.1 にアップデートします。

XperaiのROMダウンロードソフト: XperiFirm では Tablet Z は古くて未対応のようです。Android File Host より、SGP311_10.7.A.0.228_R4E_SGP311_VMo+EU1_1272-7819.ftf をダウンロードし、FlashTool で書込みます。特に問題なくアップデートできました。


J:COMモデルということで制限がかかっていないか気になりましたが、以下のように大丈夫でした。

これまでどおり unlock して再起動し、Unlocked: Yes を確認します。


SGP312 ではリカバリ領域への書込みができませんでした。SGP311 でも同様でした。しかたなくboot領域にカスタムリカバリを書きます。SGP312 twrp-3.7.0_9-0-pollux_windy.img 同じでOK。

改めてSGP311で海外情報をしらべると 「no recovery partition on the TabZ」 という文言あり。詳細はこちら。

尚、当機種に関わらずこの状態では bootloaderが無い 非常に高リスクな状態です。bootloader無し状態でハードウェアのみで充電できるのか??? 100%充電してから実施するのが無難です。


SGP312 と同様に、lineage-20.0-20231125-UNOFFICIAL-pollux_windy.zip、MindTheGapps-13.0.0-arm-20231025_200806_Z-Tab.zip(弊方の修正版) を、TWRPでまとめてInstallします。結果としては特に問題なしです。

実は弊方、OS初回起動前にバッテリを空にしてしまい、充電してもい充電中表示も表示さなず、文鎮状態に至りました。たしか電源ボタンかUPボタンを長押しして、サイドのLEDがからに変わり復活したように記憶しています。当機種に関わらずOS の Install 後はなるべく早くOS初回起動を行った方が無難なようです。


以上、SGP311: Z Tablet Wi-Fi 16GB版を Andoroid13 相当にUpdateする手順です。しかしながら自分でやるのはメンドクサイ、忙しい、自身が無い方は、弊方でセットアップをお受けいたします。約1.5時間の個人様向け工数+事務費で税込4,000円 。Android 4.2.2 → 5.1.1のUPDATEが必要な場合は、+1,000円。 ご相談、依頼はこちらから。

eTaxで累積赤字が黒字に変わる場合の追加手順(間違いがあるかも)

弊方もおかげ様で設立当初の累積赤字が償却でき、黒字決算に至ることとなりました。黒字に転じると決算方法が変わってきます。その覚書です。ただ未だ一回目であるため間違いがあるかもしれません。

まず支払いが必要な税金を把握します。WEB記事は多数ありますが断片的でよくわかりませんし、eTax帳票と紐づけができていません。

支払先税名赤字に必要黒字に必要計算するeTaxの帳票
法人税別表1_次葉
地方法人税別表1
都道府県都道府県民税第6号様式
事業税第6号様式
市町村市町村民税[資本割]第20号様式
市町村民税[法人税割]第20号様式

「xxx割」とは「xxx比例」と解釈すると理解しやすいです。

弊方では 弥生オンライン を使用しています。 弥生で決算書を作成する前に、未払い法人税等 の計上が必要です。後述の 事業税 は費用計上できるそうなので、この金額によって 経常利益 がかわり法人税額も変わります。フローで書くと以下のようになります。(他解説WEB記事をみてもこのような具体的手順はないかなとおもいます)

株式や社債国際投資でなくとも、銀行利息は法人税控除対象になるようです。弊方は2,000円弱ですが計算上は控除対象になるみたいです。 別表6(1) 所得税額の控除に関する明細書 を記入します。

どこからひっぱってきたかわすれましたが計算式は以下のようです。端数切りすては1円未満でいいようです、

項目1が該当する箇所のようです。計算はシート上で自動ではなく、手計算です。

計算結果(1)③を、別表1 各事業年度の所得に係る申告書 の 16 に転記します。

試験研究費は一部を法人税額から控除できるようです。消耗品費 にするか悩むところではありが新しいサービスを開始するにあたり必要な物品は試験研究費にしていいようです。一般アプリに比べ組込ソフトを扱っていると、色々なハードウェアツール、計測ツール、電子部品が必要になります。

試験研究費は 弥生 でデフォルトで有効になっていないので追加が必要です。追加するカテゴリは 販売費及び一般管理費 (売上に直接結び付く費用) にします。一般会計上では、試験研究費 営業外費用 (売上に直接結び付かない費用) に分類されるらしいですが、eTax では 販売費及び一般管理費 にしかカテゴライズされていません。

まず別表6(11) 試験研究を行った場合の法人税額の特別控除における比較試験研究費の額及び平均売上金額の計算に関する明細書試験研究費の前年度と本年度の平均計算します。平均値は自動計算です。

次に売上の前年度と本年度の平均を同じように入力します。最低二年分が必要かと解釈しましたが、前年0でいれましたが、一年分でもよかったのかも、、、

その結果を元に、別表6(9) 一般試験研究費の額に係る法人税額の特別控除に関する明細書 を記入します。以下要点です。

  • 試験研究費の増加率、売上に対する比率は自動計算だった思います。
  • 項目11~14は該当する計算区分を各自で判断して、記載されている計算式で計算。上限を超える場合は、上限以内にリミットします。
  • 項目15は自動計算だったか忘れましたが、記載されている計算式で計算。
  • 項目17~19は項目11~14に同じ。
  • 項目20も各記載されている計算式で計算、別表六(十三) は欠損時の法人税控除らしいですが今回は対象外なので 0 扱いとします。項目15別表1次葉て計算した法人税額を入力。
  • 項目21は、項目15項目20どちらを適用するか、記載されている判断条件に従い記入。

別表1次葉項目45に、別表1 各事業年度の所得に係る申告書項目1(所得金額又は欠損金額)の値を入力。当面、800万円を超えることはないので税率15%にチェックを入れて、その税率で計算し項目48に入力します。意外とシンプルです。

別表1 各事業年度の所得に係る申告書 へは自動転記だった気がします。項目2 に記入します。利息と試験研究費の控除を項目3 に記入。項目13/15 に計を出すと、法人税額が求まります。

税額が決まったら、弥生側で未払法人税の仕訳を行います。

都道府県、市町村に収めるのではなく、国が都道府県/市町村を管理するため税だとのこと。勘違いして重複としてると見落としがち。法人税額の 10.3% の100円未満切捨てです。

別表1次葉項目51に法人税額を入力、帳票に記載されている税率で机上計算し項目53に入力します。100円未満は入力できないようになっています。

別表1 各事業年度の所得に係る申告書 へは自動転記だった気がします。項目31/34/38/40 に記入します。

弥生側で未払法人税の仕訳を行い決算書仮生成します。弊方では分かりやすくするため、利益に対する法人税とは別仕訳にしています。納税時は、利益に対する法人税と合算になります。

事業税は、控除前法人税額 × 税率 です。 税率表には7つの数値が登場しますが以下の解釈でよいようです。県によって違うのかはよく分かりません。毎年変わるのかによくわかりません。毎年、登記県のホームページをチェックします。

eLTAX六号様式 にて記入します。以下要点です。

  1. 項目29 を(a)所得(自動で1000未満切捨てされたと思います)、(b)上記表に従った税率、(a)×(b)の100円未満切捨て入力します。
  2. 項目40、43、46、47、53も合わせて入力します。
  3. 事業税は損金算入していいそうなので、借方:租税公課、貸方:未払金 で仕分けを追加します。
  4. 上記3の結果、所得か減るため弥生で決算の再集計し、収益を訂正します。
  5. 上記4の結果、事業税が減る場合があれば、事業税を訂正します。
  6. 上記3~4は、所得の1000未満切捨て、事業税の100円未満切捨てが効いて、2~3回実施すれば帳尻が合うようになるようです。
  7. 都道府県民税も漏れなく記入します。

市町村民税[資本割] は、控除前法人税額 × 税率 です。税率表には以下の解釈でよいようです。市によって違うのかはよく分かりません。毎年変わるのかによくわかりません。毎年、登記市町村のホームページをチェックします。

二十号様式に記載していきます。以下要点です。

  1. 項目(1)に、別表1項目14の法人税の支払い額から1000未満を切捨て(たぶん自動だった)入力します。
  2. 項目(2)に、法人税控除額を入力します。
  3. 項目(5)の列3に、逆算した控除前法人税額を計算します。(たぶん自動)
  4. 項目(5)の列4に、資本金から上記表に従った税率を判断して入力します。
  5. 項目(5)の列5に、税額を自主計算して入力します。100未満を切捨て(たぶん自動だった)。
  6. いつもの固定の50,000円(均等割)を入力します。
  7. 弥生で未払法人税の仕訳をします。弊方では後から分かりやすくするため、均等割法人税割を別仕訳にしています。
  8. 弥生で決算を再集計します。

どう見ても数値はあっているのですが、100円や1000未満切捨ての関係で合わないのかもしれません。帳票6(2)付表6「税額控除過不足」 7 を書いてみたが解消せず。警告が出ても申請は進められるので、今回は警告ありのままで送信しました。約一か月後の時点では、国税局からの指摘はありません。

2) 端数カットについて

eTax の別表1で端数カットしようとすると「集計フィールドです。上書きしますか」と問われます。これは別表1 項目15で切りすられる模様。

別表6-6 法人税の額から控除される特別控除額 は、試験研究費の控除の関係で登場しますが、「沖縄の特...」などかなり特殊な項目が多いので作成しませんでした。

4) eTaxで日を空けて帳票作成をする場合

これだけの入力と計算ボリュームですと、数日かかってしまいます。eTax も国と県と市を同時帳票編集も効率よいです。そのあたりの留意点です。

  • eLax PCdeskは複数インスタンス立上げできません。市と県を同時に編集できません。別々のPCから行えばできると思います。
  • 国のeTax Desktop版は、サーバにデータが保存されるようです。途中でアプリを終了しても問題なし。土日もサーバは稼働しています。メンテナンスでサーバ休止はあるので、事前に確認しておくこと。
  • eLax PCdeskのサーバは土日停止してます。なんでやねん。しかしアプリは起動でき帳票作成は可能。送信するまではローカルPCに保存されている模様です。


以上です。しかし、税額が本当に合っているのが正直よくわかりません。何年か経って「脱税です」とか指摘されませんように...eTaxで計算例とかが掲載されると判断しやすいかなと思います。

Microsift純正Windows Exploer 代替え品お試し【継続調査中】

win10になっても、win11になっても不調がなくならない Microsoft純正Windows Exploer。起動直後、検索中かなにかで数分ダンマリが目立つようになってきました。Windowsを再起動すると解消しますが、急ぎのときはそれもできません。 代替え品を探します。この手の記事はたくさんあるのですが、肝心な問題点が記載されていない(タダの検索件数稼ぎ?)ので、レポートいたします。弊方では、Win32API/MFC/.NETも大体使え、開発環境もあるので純粋Winアプリでオープンソースがよいです。

ばっと目についたのがコレ、64bit版あり、フリーですがオープンソースではないようです。ダウンロードはこちら

普通にダウンロードできます。

インストーラは無く、exe直実行です。

以下画面サンプルです。メニュー等は英語ですが複雑なアプリではないのであまり問題ないのでしょう。

問題点は、

  • 操作音が消せない。これは致命傷レベルです。Windowサウンド設定は「無」にしていても消せない。オプション設定もみられず。

以上、実用できません。

シンプルで軽そうなので目に留まりました。古くから存在するようです。ダウンロードはこちら。

こちらはWindows Installerタイプ。スキンから見ますと古い2010の頃の Install shiled で作られているようです。

確かに軽い、タブも2つで必要最小。以下画面です。

問題点は、

  • 列の表示項目が固定となっている。「ファイルの種類」は要らんです。
  • ネットワークドライブを参照すると、左ツリーのカレント位置が、約一秒置きにルートディレクトリに戻る。これも致命傷です。おそらく周期的に接続状態をチェックしている影響かと思います。

以上、実用できません。

最新で高機能っぽいので目に留まりました。こちにはMS Storeアプリで、無償(お試し?)版と有償版があります。ダウンロードはこちら

やはり少し重い。以下画面サンプルです。同様に行間詰めるモードあり。Win11 Exploer に準拠している感じですね。

少し触ってみると、邪魔なピン止めを非表示にできたり、Win11でファイルドラッグ中に別タブ上を通過するとタブが切替わってしまう問題(MSの怠慢かと、かなりイラっときます)が解消されていたり。MS版のネガが抑えられているようです。

上書きの問い合わせが面倒です。強制上書きオプションまでは無いようです。

拡張子警告しないオプションは画期的です。

問題点は、

  • クリック時の反応が、純正Expolerにくらべワンテンポ遅い。ソフトウェア芸が多すぎでは?
  • 左ツリーのツリー表示がない。これも致命傷です。弊方は、左ツリーをキーボート操作で開いていくのが常なので、無いと仕事になりません。有償版ではあるのでしょうか?
  • 起動時にダンマリすることあり。

以上、実用できません。


以上、継続調査中です。

.NET DataGridViewで行末尾追加を実現するには?

.NET DataGridViewで行末尾に、行追加できないようです。以下の行追加試しました。

AIによると DataSource を追加しないといけないと言われます。ちょっと面倒すぎです。別の手を考えました。

追加用のダミー末尾を追加して、見せないようにします。コード例は CLI です。

private: System::Windows::Forms::DataGridView^  dgrdSend;

  ・・・中略・・・
 
private: System::Void Form1_Load(  System::Object^  sender,  System::EventArgs^  e) 
{
  ・・・中略・・・
	dgrdSend->RowCount = 2;
	dgrdSend->Rows[0]->Cells[1]->Value = "1000";	// デフォルト送信データ行
	dgrdSend->Rows[0]->Cells[2]->Value = "0";
	dgrdSend->Rows[1]->Height = 0;				// 送信データ行追加用ダミー(Addで末尾追加未サポのため)
	dgrdSend->Rows[1]->ReadOnly = true;
	// dgrdSend->Rows[1]->Visible = false;   -> エラーになる
	// dgrdSend->Rows[1]->Resizable = false; -> エラーになる
	dgrdSend->AllowUserToResizeRows = false;	// 全体に行リサイズ変更はOK
  ・・・中略・・・
}

		int		selectedRowSndData;			// 選択中の送信データ行

/* ****************************************************************************
 * 機能名 : 送信データ追加
 * ***************************************************************************/
private: System::Void menuAddSendItem_Click(
	System::Object^ sender, 
	System::EventArgs^ e 
) {
	selectedRowSndData ++;
	dgrdSend->Rows->Insert( selectedRowSndData, 1 );
}

/* ****************************************************************************
 * 機能名 : 送信データ挿入
 * ***************************************************************************/
private: System::Void menuInsertSendItem_Click(
	System::Object^ sender, 
	System::EventArgs^ e 
) {
	dgrdSend->Rows->Insert( selectedRowSndData, 1 );
}

実行結果です。