0

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 がビジネスを完了した後でのみです。

4

4 に答える 4

2

まず、コンピュータのシリアル ポートで構成されているものではなく、データの送信を開始する前に LCD が必要とする初期化だと思います。

シリアル ポートでトレーサーを実行して、表示するテキストの最初の行を送信する前に、他のアプリケーションが LCD に送信しているものを確認することをお勧めします。

Sysinternals (現在は Microsoft の一部) のPortmonを試すことができます。

于 2009-07-30T15:36:57.687 に答える
1

最近、シリアルポート通信でほぼ同じ問題が発生しました。デバイスに接続しようとしましたが、通信が正常に機能しませんでした。次に、シリアルポート監視プログラムを開いて、実際にデータ転送が行われているかどうかを確認しました。すべて問題がないように見えます。最後に、もう一度接続してみると、きちんとコミュニケーションが取れるようになりました。

私の場合、プログラムでボーレート、読み取り/書き込みタイムアウト、およびデータ特性(データビット、ストップビット、パリティビット)を設定していませんでした。デバッグプログラムはそれを自動的に実行し、それらの変更はシリアルポートに「固定」されているように見えました。そのため、デバッグプログラムを1回実行した後、プログラムが機能しました

プログラムでこれらの設定をすべて正しく設定していることを確認してください

于 2009-07-30T16:11:31.920 に答える
1

ハンドシェイクが、相手が期待しているものと一致していることを確認してください。DTR と RTS を true に設定してみてください。

sPort.Dtr = true;
sPort.Rts = true;
于 2009-07-30T15:58:23.180 に答える
0

モーターへの接続で同様の問題が発生しました。別のアプリケーションを実行すると、最初にアプリケーションが機能しました。

問題は、書き込み時と読み取り時の両方で、シリアルポートのノイズでした。テスト/ジャンク メッセージを送信し、入力および出力バッファをクリアすると、最終的に問題が解消されました。私の場合、他のアプリケーションはバッファからジャンクをクリアしていました。

于 2009-07-30T15:38:03.363 に答える