【解決方法】(解決済み) C# が常に COM ポートに書き込まないのはなぜですか?

プログラミングQA


更新: 解決しましたが、方法がわからないため、この質問の解決策を書くことができません

少なくとも、それが起こっていることだと思います。 コードのどちら側で問題が発生しているかを特定するのは困難です。

基本的に、4×115200 ボーの SerialPort クラスを使用して、USB CDC シリアル経由で 1 秒に 1 回データを ESP32 に送信する C# アプリケーションがあります。 (8N1)

タイトル パケットは正常に送信されますが、これはタイトル文字列の長さに応じて非常に小さくなります。

また、2052 バイトのアイコン パケットも送信しますが、問題はそこにあります。

デバッガにドロップしてその行で中断し、続行すると機能します。

Thread.Sleepをそこにドロップしたとき、少なくともある時点では機能していました(デバッグによって機能することがわかった後)

そこで、書き込みバッファのサイズが 16kB に増加し、もう一方の読み取りバッファのサイズが同じである可能性があると考えました。

次に、UI タイマーが別のスレッドで起動するためではないかと考えました。 そこで、Control.Invoke を使用して SerialPort 呼び出しを UI スレッドにサンクダウンしました。

そこで、チャンク化して一度に 64 バイトずつ書き込んでみようかなと思い、そうしました。 テキストさえも送信されないようになっているようです(テキスト部分をチャンク化していませんが)

見知らぬ人 まだアイコンパケットを1秒に1回送信し続けると強制的に送信されるようですが、データが変更されていないときに物事を生き続けるためにキープアライブパケットをそこに置くと、アイコンは機能しなくなります。

私が試したこと:

これがその核心です (すべてのデータが準備された後)

C#
string title = Path.GetFileNameWithoutExtension(path);
// open if necessary
if (!port.IsOpen)
{
	port.WriteTimeout = 1000;
	port.WriteBufferSize = 16384;
	port.Open();

}
var ba = new byte[5 + title.Length];
ba[0] = 1;
BitConverter.GetBytes(title.Length).CopyTo(ba, 1);
Encoding.ASCII.GetBytes(title).CopyTo(ba, 5);


// write the command
port.Write(ba, 0, ba.Length);
port.BaseStream.Flush();
if (iconBuffer != null)
{
	// open if necessary
	if (!port.IsOpen)
	{
	    port.WriteTimeout = 1000;
		port.WriteBufferSize = 16384;
		port.Open();
	}
	ba = new byte[iconBuffer.Length + 5];
	ba[0] = 2;
	BitConverter.GetBytes(iconBuffer.Length).CopyTo(ba, 1);
	iconBuffer.CopyTo(ba, 5);
	System.Threading.Thread.Sleep(100);
	// write the command
	port.Write(ba, 0, ba.Length);

	port.BaseStream.Flush();
}

コメント

タイトルとURLをコピーしました