SerialPort クラスを使用して、C# で System.IO.Ports を使用して LCD ディスプレイに書き込もうとしています。
まず、それは機能します!私のプログラムはそれに正常に書き込み、正常に表示されます...ただし、以前の商用プログラム(LCDC)を実行した後でのみです。
LCDC (完全な LCD ディスプレイ GUI プログラム) を実行する前にプログラムを実行すると、LCD ディスプレイはちらつきさえせず、空白のままになります。
LCDCで「表示を開始」し(つまり、LCDCのカタログから1つの画面でも表示するようにします)、「表示を停止」してLCDCを完全にシャットダウンした場合。そして、私のプログラムを実行すると、まったく問題なく動作します。
そのため、LCDC が COM/シリアル ポートなどをアクティブ化または初期化しているようです。これは、プログラムがシャットダウンした後にポートが記憶するものです。誰にもアイデアはありますか?
(さまざまなオンライン リソースから) SerialPort を使用して数え切れないほどのコード サンプルを試しましたが、それらはすべて同じ問題を抱えています。LCDC の前には何もありませんが、その後は完全に機能します。
必要に応じてコードを投稿できますが、それが標準です: SerialPort ポートを宣言します
port.Open( x, yz); port.Write("文字列");
などで、LCDC を実行した後は問題なく動作します。
アップデートとして、私はまだ立ち往生しています!PortMon を使用してポートを分析しました。まず、プログラムを単独で実行しています。
0 0.04459980 MatOrbOfficialT IRP_MJ_CREATE VCP0 SUCCESS Options: Open
1 0.00000531 MatOrbOfficialT IOCTL_SERIAL_GET_PROPERTIES VCP0 SUCCESS
2 0.00000335 MatOrbOfficialT IOCTL_SERIAL_GET_MODEMSTATUS VCP0 SUCCESS
3 0.00000251 MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS
4 0.00000251 MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS
5 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS
6 0.00000251 MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS
7 0.00000307 MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS
8 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS
9 0.00000196 MatOrbOfficialT IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS
10 0.00000196 MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS
11 0.00216620 MatOrbOfficialT IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 19200
12 0.00295484 MatOrbOfficialT IOCTL_SERIAL_SET_RTS VCP0 SUCCESS
13 0.00297244 MatOrbOfficialT IOCTL_SERIAL_CLR_DTR VCP0 SUCCESS
14 0.00297496 MatOrbOfficialT IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
15 0.00000251 MatOrbOfficialT IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
16 0.00501293 MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:0 Replace:40 XonLimit:1024 XoffLimit:1024
17 0.00000251 MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS
18 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS
19 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS
20 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS
21 0.00282829 MatOrbOfficialT IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 19200
22 0.00293892 MatOrbOfficialT IOCTL_SERIAL_SET_RTS VCP0 SUCCESS
23 0.00296909 MatOrbOfficialT IOCTL_SERIAL_CLR_DTR VCP0 SUCCESS
24 0.00297719 MatOrbOfficialT IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
25 0.00000279 MatOrbOfficialT IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
26 0.00294954 MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:0 Replace:40 XonLimit:1024 XoffLimit:1024
27 0.00288919 MatOrbOfficialT IOCTL_SERIAL_CLR_DTR VCP0 SUCCESS
28 0.00000447 MatOrbOfficialT IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS
29 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS
30 0.00000251 MatOrbOfficialT IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS
31 0.00000223 MatOrbOfficialT IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS
32 0.00285763 MatOrbOfficialT IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 19200
33 0.00296406 MatOrbOfficialT IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS
34 0.00298753 MatOrbOfficialT IOCTL_SERIAL_CLR_DTR VCP0 SUCCESS
35 0.00292132 MatOrbOfficialT IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
36 0.00000559 MatOrbOfficialT IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
37 0.00491962 MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024
38 0.00292942 MatOrbOfficialT IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS
39 0.00000475 MatOrbOfficialT IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:-1 RC:-2 WM:0 WC:0
40 0.00245674 MatOrbOfficialT IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
41 0.00000670 MatOrbOfficialT IOCTL_SERIAL_SET_QUEUE_SIZE VCP0 SUCCESS InSize: 4096 OutSize: 2048
42 0.00000000 MatOrbOfficialT IOCTL_SERIAL_WAIT_ON_MASK VCP0
43 0.00049811 MatOrbOfficialT IRP_MJ_WRITE VCP0 SUCCESS Length 2: .X
次に LCDC の場合:
0 0.05153979 LCDC.exe IRP_MJ_CREATE VCP0 SUCCESS Options: Open
1 0.00000503 LCDC.exe IOCTL_SERIAL_SET_QUEUE_SIZE VCP0 SUCCESS InSize: 1024 OutSize: 1024
2 0.00000251 LCDC.exe IOCTL_SERIAL_GET_BAUD_RATE VCP0 SUCCESS
3 0.00000279 LCDC.exe IOCTL_SERIAL_GET_LINE_CONTROL VCP0 SUCCESS
4 0.00000223 LCDC.exe IOCTL_SERIAL_GET_CHARS VCP0 SUCCESS
5 0.00000251 LCDC.exe IOCTL_SERIAL_GET_HANDFLOW VCP0 SUCCESS
6 0.00274029 LCDC.exe IOCTL_SERIAL_SET_BAUD_RATE VCP0 SUCCESS Rate: 19200
7 0.00299563 LCDC.exe IOCTL_SERIAL_CLR_RTS VCP0 SUCCESS
8 0.00295205 LCDC.exe IOCTL_SERIAL_CLR_DTR VCP0 SUCCESS
9 0.00289757 LCDC.exe IOCTL_SERIAL_SET_LINE_CONTROL VCP0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
10 0.00000531 LCDC.exe IOCTL_SERIAL_SET_CHAR VCP0 SUCCESS EOF:b0 ERR:1 BRK:1 EVT:0 XON:79 XOFF:13
11 0.00296155 LCDC.exe IOCTL_SERIAL_SET_HANDFLOW VCP0 SUCCESS Shake:0 Replace:0 XonLimit:256 XoffLimit:256
12 0.00000307 LCDC.exe IOCTL_SERIAL_SET_TIMEOUTS VCP0 SUCCESS RI:-1 RM:0 RC:0 WM:100 WC:1000
13 0.00251401 LCDC.exe IOCTL_SERIAL_SET_WAIT_MASK VCP0 SUCCESS Mask: RXCHAR ERR
14 0.00000335 LCDC.exe IOCTL_SERIAL_GET_MODEMSTATUS VCP0 SUCCESS
15 0.00000251 LCDC.exe IOCTL_SERIAL_GET_MODEMSTATUS VCP0 SUCCESS
16 0.00000251 LCDC.exe IOCTL_SERIAL_GET_MODEMSTATUS VCP0 SUCCESS
17 0.00000391 LCDC.exe IOCTL_SERIAL_PURGE VCP0 SUCCESS Purge: TXCLEAR RXCLEAR
18 0.00066545 LCDC.exe IRP_MJ_WRITE VCP0 SUCCESS Length 3: .P.
19 3.94750981 LCDC.exe IOCTL_SERIAL_WAIT_ON_MASK VCP0 SUCCESS
20 0.00091632 LCDC.exe IRP_MJ_WRITE VCP0 SUCCESS Length 3: ...
何か案は?
LCDC が書き込みの直前に IOCTL_SERIAL_PURGE を実行していることに気付きましたが、私のプログラムは切断時にこれを実行し、再接続後も機能しません (したがって、このパージとは関係ないと想定しています)。
LCDC の後にプログラムを再度実行すると、次の点を除いてまったく同じように表示されます。
26 0.00294954 MatOrbOfficialT IOCTL_SERIAL_SET_HANDFLOW VCP0 成功 Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024
Replace:40 を読み取るために Replace:0 が使用されているとどこに書いてありますか?これは重要ですか?
私が知る限り... LCDCによって設定された他のすべての値は、プログラムを実行した後にプログラムによってリセットされるので、一部の値が異なっていても違いはありませんか? 私のプログラムが正常に書き込みを行うとすれば... LCDC がビジネスを完了した後でのみです。