C プログラムを C# プログラムに置き換えようとしています。C プログラムは、COM1 シリアル ポートを介して古いコンピュータに接続します。Cコードが他のマシンにどのように接続するかについての情報はありませんが、正しく接続しているので、どのように接続しているのか推測する必要があります. Portmonを使用して、C プログラムがどのように書き込みと読み取りを正常に行っているかを把握しようとしています。新しい C# アプリケーションを実行しているときに、Portmon も実行しています。私の C# プログラムでは、SerialPort クラスを使用しています。
作業中のプログラムで Portmon の出力を使用して、SerialPort クラスのさまざまな項目が持つべき値を判断しようとしています。クラスの正しい値を取得できれば、正しく読み書きできると思います。プログラム (下記) が正しく動作していません。プログラムは COM1 ポートを正常に開きますが、ピリオド (および別のピリオド) を書き込もうとすると失敗します。これらはタイムアウトを与えます。
古い C プログラムの背後で実行されている Portmon の出力を見ると、動作中のプログラムは COM1 ポートを開き、ピリオドを 1 つ書き込んでから、COM1 ポートから成功値 (&OK) を読み取る前に別のピリオドを書き込んでいました。古いプログラムは、C# プログラムで複製したいいくつかの値を設定しました。
以下の SerialPort オプションのさまざまな組み合わせを試しましたが、明らかに何もヒットしませんでした。
ところで、Stack Overflow question Reading and writing from a serial port in C#, part 2 で予備的な質問をしました。
プログラムを実行しているマシンで Windows XP を使用しています。COM1 ポートの反対側のマシンは非常に古い PC です。
これを行うより良い方法はありますか?Portmon 以外の何かを使用しますか? 古いプログラムの Portmon 出力の場合、Process 列は ntvdm.exe です。問題ありますか?C# SerialPort クラスを使用しない方がよいですか? おそらく最も重要な質問は、古いプログラムと一致させるために Serialport クラスにどの値を使用すればよいかということです。
私のC#プログラム:
SerialPort comport = new SerialPort();
comport.BaudRate = 9600;
comport.DataBits = 7;
comport.StopBits = StopBits.One;
comport.Parity = Parity.Odd;
comport.RtsEnable = true;
comport.DtrEnable = true;
comport.Handshake = Handshake.RequestToSend;
comport.ReadBufferSize = 8192;
comport.WriteBufferSize = 100;
comport.WriteTimeout = 30000; // 30 sec
comport.ReadTimeout = 30000; // 30 sec
comport.PortName = "COM1";
string tempFbuffer;
byte[] Fbuffer = new byte[200];
string alldata5;
tempFbuffer = "..";
for (int cnt = 0; cnt < tempFbuffer.Length; cnt++)
{
Fbuffer[cnt] = Convert.ToByte(tempFbuffer[cnt]);
}
comport.Open();
comport.Write(Fbuffer, 0, 1);
comport.Write(Fbuffer, 1, 1);
for (i = 0; i < 4; i++)
{
alldata5 = alldata5 + comport.ReadChar();
}
comport.Close();
模倣したいアプリケーションの Portmon 出力は以下のとおりです。このアプリケーションは他のマシンに接続し、正常に動作します。見出しを手動で上部に配置しました。
ご覧のとおり、33 行目と 34 行目で書き込みが成功し、35 行目と 36 行目で読み取りが成功しています。バックグラウンドで Portmon を使用してプログラムを実行しました。
# Time Process Reuest Port Result Other
0 0.00004407 ntvdm.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 0.00000198 ntvdm.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
2 0.00000115 ntvdm.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
3 0.00000104 ntvdm.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
4 0.00000106 ntvdm.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
5 0.0000008 ntvdm.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
6 0.00000082 ntvdm.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
7 0.00000085 ntvdm.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
8 0.00000081 ntvdm.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
9 0.00000712 ntvdm.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 1200
10 0.00000349 ntvdm.exe IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
11 0.00000366 ntvdm.exe IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
12 0.00000225 ntvdm.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 5
13 0.00000111 ntvdm.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
14 0.00000735 ntvdm.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 Replace:0 XonLimit:2048 XoffLimit:512
15 0.00000133 ntvdm.exe IOCTL_SERIAL_LSRMST_INSERT Serial0 SUCCESS Char: ffffffff
16 0.00000338 ntvdm.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 8192 OutSize: 100
17 0.00000083 ntvdm.exe IOCTL_SERIAL_GET_TIMEOUTS Serial0 SUCCESS
18 0.00000092 ntvdm.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0
19 0.00000349 ntvdm.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
20 0.00000342 ntvdm.exe IOCTL_SERIAL_SET_RTS Serial0 SUCCESS
21 0.00001121 ntvdm.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 1200
22 0.00000262 ntvdm.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR CTS DSR RLSD ERR RING
23 36.94054111 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
24 0.00000403 ntvdm.exe IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
25 0.00000356 ntvdm.exe IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
26 0.00000351 ntvdm.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
27 0.00000348 ntvdm.exe IOCTL_SERIAL_SET_RTS Serial0 SUCCESS
28 0.00000717 ntvdm.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 9600
29 0.00000145 ntvdm.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
30 0.00000246 ntvdm.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: ODD WordLength: 5
31 0.00000086 ntvdm.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
32 0.00000226 ntvdm.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: ODD WordLength: 7
33 0.00002222 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
34 0.00002142 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: .
35 0.00000562 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 4: &OK.
36 0.00000239 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0:
37 0.00000533 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
38 0.0000023 ntvdm.exe IRP_MJ_READ Serial0 SUCCESS Length 0:
39 95.8854497 ntvdm.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
40 0.00002486 ntvdm.exe IRP_MJ_WRITE Serial0 SUCCESS Length 1: D
私が作成している C# アプリケーションの Portmon 出力は次のとおりです。バックグラウンドで Portmon を使用して上記の C# コードを実行すると、この出力が作成されます。ヘッダーを入れました。
ご覧のとおり、書き込み中に 69 行目にタイムアウト エラーがあります。書き込みと読み取りが機能するように、これを C に十分近づけて実行する必要があります。
明らかに、ボーレート、ワード長、パリティ、およびその他のいくつかが正しく設定されています。
# Time Process Reuest Port Result Other
0 0.00004362 fancom.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 0.0000019 fancom.exe IOCTL_SERIAL_GET_PROPERTIES Serial0 SUCCESS
2 0.00000263 fancom.exe IOCTL_SERIAL_GET_MODEMSTATUS Serial0 SUCCESS
3 0.00000096 fancom.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
4 0.00000097 fancom.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
5 0.00000084 fancom.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
6 0.00000097 fancom.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
7 0.00000081 fancom.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
8 0.00000088 fancom.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
9 0.0000008 fancom.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
10 0.00000079 fancom.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
11 0.00000715 fancom.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 9600
12 0.00000355 fancom.exe IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
13 0.0000024 fancom.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: ODD WordLength: 7
14 0.00000107 fancom.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:3f BRK:3f EVT:1a XON:11 XOFF:13
15 0.00000779 fancom.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:8 Replace:84 XonLimit:1024 XoffLimit:1024
16 0.0000008 fancom.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
17 0.00000081 fancom.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
18 0.00000081 fancom.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
19 0.00000081 fancom.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
20 0.00000705 fancom.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 9600
21 0.00000349 fancom.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
22 0.0000022 fancom.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: ODD WordLength: 7
23 0.00000098 fancom.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:3f BRK:3f EVT:1a XON:11 XOFF:13
24 0.00000493 fancom.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:9 Replace:84 XonLimit:1024 XoffLimit:1024
25 0.00000684 fancom.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
26 0.00000108 fancom.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:-1 RC:30000 WM:0 WC:30000
27 0.00000227 fancom.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
28 35.62327662 fancom.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
29 0.00000399 fancom.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 8192 OutSize: 100
30 30.00157726 fancom.exe IRP_MJ_WRITE Serial0 TIMEOUT Length 1: .
31 0.00000767 fancom.exe IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS
32 0.00001012 fancom.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask:
33 0.00000402 fancom.exe IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
34 0.00000116 fancom.exe IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS
35 0.0000023 fancom.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: RXABORT RXCLEAR
36 0.00000163 fancom.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT TXCLEAR
37 0.00000404 fancom.exe IRP_MJ_CLEANUP Serial0 SUCCESS
38 0.00322359 fancom.exe IRP_MJ_CLOSE Serial0 SUCCESS
39 0.00004607 fancom.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open
40 0.00000188 fancom.exe IOCTL_SERIAL_GET_PROPERTIES Serial0 SUCCESS
41 0.00000277 fancom.exe IOCTL_SERIAL_GET_MODEMSTATUS Serial0 SUCCESS
42 0.00000092 fancom.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
43 0.00000112 fancom.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
44 0.0000008 fancom.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
45 0.00000093 fancom.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
46 0.00000079 fancom.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
47 0.00000085 fancom.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
48 0.00000081 fancom.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
49 0.00000082 fancom.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
50 0.00000704 fancom.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 9600
51 0.00000352 fancom.exe IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
52 0.00000225 fancom.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
53 0.00000113 fancom.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
54 0.00000489 fancom.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:8 Replace:80 XonLimit:1024 XoffLimit:1024
55 0.00000084 fancom.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
56 0.00000083 fancom.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
57 0.00000081 fancom.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
58 0.00000081 fancom.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
59 0.00000696 fancom.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 9600
60 0.00000344 fancom.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
61 0.00000222 fancom.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
62 0.00000102 fancom.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
63 0.00000474 fancom.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:9 Replace:80 XonLimit:1024 XoffLimit:1024
64 0.00000345 fancom.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
65 0.00000081 fancom.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:-1 RC:30000 WM:0 WC:30000
66 0.00000192 fancom.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
67 30.00755135 fancom.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
68 0.00000353 fancom.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 8192 OutSize: 100
69 29.99287343 fancom.exe IRP_MJ_WRITE Serial0 TIMEOUT Length 1: .
70 0.00000349 fancom.exe IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS
71 0.00000985 fancom.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: