主题:Qbasic下關於串口通訊的問題
原本有一個windows下的串口通訊程序可正常使用,而我在Qbasic下寫了一個卻收不全字符,也就是說收到前面的一段字符後,後面的就收不到了,其實程序還是一直在收。
Qbasic是用簡單的open com1:命令,如下:
OPEN "COM1:4800,N,8,1, CS0,DS0" FOR INPUT AS #1
OPEN outfile$ FOR OUTPUT AS #2
WHILE 1
line$ = INPUT$(LOC(1), #1)
IF INSTR(1, line$, "E") THEN GOTO inNCend
PRINT #2, line$;
line$ = ""
WEND
inNCend:
CLOSE
用串口監看程序看:
原程序為:
0 IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
2 IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 1024 OutSize: 1024
3 IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
4 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:5000
5 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
6 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
7 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
8 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
9 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
10 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
11 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
12 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
13 IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
14 IOCTL_SERIAL_SET_RTS Serial0 SUCCESS
15 IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
16 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
17 IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
18 IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:48 XonLimit:256 XoffLimit:256
....
0000223 vc7comm.exe IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
20682 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
20683 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
20684 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
20685 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
20686 IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
20687 IRP_MJ_READ Serial0 SUCCESS Length 6: 01.MIN
20688 IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
....
我寫的Qbasic程序為:
3274774 IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
2 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
3 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
4 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
5 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
6 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
7 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
8 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
9 IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
10 IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
11 IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
12 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
13 IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
14 IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 Replace:8 XonLimit:2048 XoffLimit:512
15 IOCTL_SERIAL_LSRMST_INSERT Serial0 SUCCESS Char: ffffffff
16 IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 8192 OutSize: 100
17 IOCTL_SERIAL_GET_TIMEOUTS Serial0 SUCCESS
18 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:5000
19 IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
20 IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
21 IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
22 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
23 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 5
24 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
25 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
26 IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
27 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR CTS DSR RLSD ERR RING
28 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
29 IOCTL_SERIAL_GET_MODEMSTATUS Serial0 SUCCESS
30 IOCTL_SERIAL_SET_RTS Serial0 SUCCESS
31 IRP_MJ_READ Serial0 SUCCESS Length 3: FF 03 11
32 IRP_MJ_READ Serial0 SUCCESS Length 0:
33 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
34 IRP_MJ_READ Serial0 SUCCESS Length 6: 24 42 4D 31 39 37
35 IRP_MJ_READ Serial0 SUCCESS Length 0:
36 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
37 IRP_MJ_READ Serial0 SUCCESS Length 0:
38 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
39 IRP_MJ_READ Serial0 SUCCESS Length 6: 30 31 2E 4D 49 4E
....
對照了一下,好像我監視結果的第14行(IOCTL_SERIAL_SET_HANDFLOW Shake:0 Replace:8 XonLimit:2048 XoffLimit:512) 和原程序(Shake:1 Replace:48 XonLimit:256 XoffLimit:256)的不同, 以及第27行(IOCTL_SERIAL_SET_WAIT_MASK Mask: RXCHAR CTS DSR RLSD ERR RING )和原程序的(Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING )不同。不知道是不是因為這裏的問題導致收不全文本。如果是,那Qbasic裏怎麼操作HANDFLOW和TXEMPTY?
還請高手賜教 !這裏先謝了!
Qbasic是用簡單的open com1:命令,如下:
OPEN "COM1:4800,N,8,1, CS0,DS0" FOR INPUT AS #1
OPEN outfile$ FOR OUTPUT AS #2
WHILE 1
line$ = INPUT$(LOC(1), #1)
IF INSTR(1, line$, "E") THEN GOTO inNCend
PRINT #2, line$;
line$ = ""
WEND
inNCend:
CLOSE
用串口監看程序看:
原程序為:
0 IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
2 IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 1024 OutSize: 1024
3 IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
4 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:5000
5 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
6 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
7 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
8 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
9 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
10 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
11 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
12 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
13 IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
14 IOCTL_SERIAL_SET_RTS Serial0 SUCCESS
15 IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
16 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
17 IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
18 IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:48 XonLimit:256 XoffLimit:256
....
0000223 vc7comm.exe IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
20682 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
20683 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
20684 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
20685 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
20686 IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
20687 IRP_MJ_READ Serial0 SUCCESS Length 6: 01.MIN
20688 IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
....
我寫的Qbasic程序為:
3274774 IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
2 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
3 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
4 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
5 IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
6 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
7 IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
8 IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
9 IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
10 IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
11 IOCTL_SERIAL_CLR_DTR Serial0 SUCCESS
12 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
13 IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
14 IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 Replace:8 XonLimit:2048 XoffLimit:512
15 IOCTL_SERIAL_LSRMST_INSERT Serial0 SUCCESS Char: ffffffff
16 IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 8192 OutSize: 100
17 IOCTL_SERIAL_GET_TIMEOUTS Serial0 SUCCESS
18 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:5000
19 IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
20 IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
21 IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
22 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
23 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 5
24 IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
25 IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
26 IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 4800
27 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR CTS DSR RLSD ERR RING
28 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
29 IOCTL_SERIAL_GET_MODEMSTATUS Serial0 SUCCESS
30 IOCTL_SERIAL_SET_RTS Serial0 SUCCESS
31 IRP_MJ_READ Serial0 SUCCESS Length 3: FF 03 11
32 IRP_MJ_READ Serial0 SUCCESS Length 0:
33 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
34 IRP_MJ_READ Serial0 SUCCESS Length 6: 24 42 4D 31 39 37
35 IRP_MJ_READ Serial0 SUCCESS Length 0:
36 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
37 IRP_MJ_READ Serial0 SUCCESS Length 0:
38 IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
39 IRP_MJ_READ Serial0 SUCCESS Length 6: 30 31 2E 4D 49 4E
....
對照了一下,好像我監視結果的第14行(IOCTL_SERIAL_SET_HANDFLOW Shake:0 Replace:8 XonLimit:2048 XoffLimit:512) 和原程序(Shake:1 Replace:48 XonLimit:256 XoffLimit:256)的不同, 以及第27行(IOCTL_SERIAL_SET_WAIT_MASK Mask: RXCHAR CTS DSR RLSD ERR RING )和原程序的(Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING )不同。不知道是不是因為這裏的問題導致收不全文本。如果是,那Qbasic裏怎麼操作HANDFLOW和TXEMPTY?
還請高手賜教 !這裏先謝了!