在win98下的dos模式可以控制RS232 , 但在關機->MS-DOS模式下卻無法控制RS232 |
尚未結案
|
before
一般會員 發表:2 回覆:4 積分:1 註冊:2005-08-16 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
|
before
一般會員 發表:2 回覆:4 積分:1 註冊:2005-08-16 發送簡訊給我 |
Dear
這是我寫的code
#include
void transmitter(char *send,int BASE_ADD,int len);
int receiver(int BASE_ADD);
int byte3,byte4,lux;
void main ()
{ int ok,length;
char send[]="\" \"";
outportb(0x3f8+4,0);
outportb(0x3f8+1,0);
bioscom(0,0xe3,0);
length=strlen(send);
do{
transmitter(send,0x3f8,length);
ok=receiver(0x3f8);
lux=(byte3/16*10+byte3)*100+(byte4/16*10+byte4);
gotoxy(x1,y1);
printf("%4d",lux);
}while(!kbhit()); } /* main program */ void reset()
{} void transmitter(char *send,int BASE_ADD,int len)
{
int j;
outportb(BASE_ADD+4,0x02);
for(j=0;j {
outportb(BASE_ADD,send[j]);
delay(200);
while((inportb(BASE_ADD+5)&0x40)==0);
}
return;
} int receiver(int BASE_ADD)
{
int i=0;
long j=0;
int rec[10];
outportb(BASE_ADD+4,0);
delay(100);
do
{
while((inportb(BASE_ADD+5)&0x01)!=1) // receive data available
{j++;if(j>20000) return(0);}
rec[i]=inportb(BASE_ADD);
}while(rec[i]!=0x02);
do
{
while((inportb(BASE_ADD+5)&0x01)!=1) // receive data available
{j++;if(j>20000) return(0);}
i++;
rec[i]=inportb(BASE_ADD);
}while((rec[i]!=0x03)||(i<4));
byte3=rec[i-2];
byte4=rec[i-1];
return(i);
}
我在WIN98的開始->程式集->MS-DOS模式下可以正常收發,
但在開始->關機->將電腦重新啟動在MS-DOS模式,卻無法控制.
dos版本是 windows98 [version 4.10.2222],我是用Turbo C3.0寫的.
不知問題出在那裡呢?
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
|
before
一般會員 發表:2 回覆:4 積分:1 註冊:2005-08-16 發送簡訊給我 |
void transmitter(char *send,int BASE_ADD,int len); int receiver(int BASE_ADD); int byte3,byte4,lux; void main () { int ok,length; char send[]="\" \""; outportb(0x3f8 4,0); outportb(0x3f8 1,0); bioscom(0,0xe3,0); // COM1 initial (None 8 1) length=strlen(send); do{ transmitter(send,0x3f8,length); ok=receiver(0x3f8); lux=(byte3/16*10 byte3)*100 (byte4/16*10 byte4); gotoxy(x1,y1); printf("M",lux); }while(!kbhit()); } /* main program */ void reset() {} void transmitter(char *send,int BASE_ADD,int len) { int j; outportb(BASE_ADD 4,0x02); for(j=0;j { outportb(BASE_ADD,send[j]); delay(200); while((inportb(BASE_ADD 5)&0x40)==0); } return; } int receiver(int BASE_ADD) { int i=0; long j=0; int rec[10]; outportb(BASE_ADD 4,0); delay(100); do { while((inportb(BASE_ADD 5)&0x01)!=1) // receive data available {j ;if(j>20000) return(0);} rec[i]=inportb(BASE_ADD); }while(rec[i]!=0x02); do { while((inportb(BASE_ADD 5)&0x01)!=1) // receive data available {j ;if(j>20000) return(0);} i ; rec[i]=inportb(BASE_ADD); }while((rec[i]!=0x03)||(i<4)); byte3=rec[i-2]; byte4=rec[i-1]; return(i); } |
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
To before : 你把bioscom那一行Mark, 以下面的來取代看看 outputb(0x3f8 3, 0x83); // Set 8N1 & DLAB bit
outputb(0x3f8, 0x6); // Set DLL = 6
outputb(0x3f8 1, 0x0); // Set DLM =0 Baudrate = 115200
// Under 11.0592MHz
outputb(0x3f8 3, 0x3); 還有, 有些外部裝置會使用Modem Control Signal來控
制傳輸的開始及結束, 或許你也必須設定DSR Bit去讓外
部裝置認為已被連接, 所以 unsigned char mcr; mcr = inportb(0x3f8 4);
mcr |= 1;
outputb(0x3f8 4, mcr); 上述的動作會是必須要的.
|
before
一般會員 發表:2 回覆:4 積分:1 註冊:2005-08-16 發送簡訊給我 |
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
before你好: 我建議你在開機時先去確認BIOS的
1. Serial Port是否有打開
2. IO port是否和你指定的相同(0x3F8)
3. 你接RS232的位置確定是沒錯 說不定你在98DOS MODE下可以使用是因為98幫你打開了
但是BIOS根本沒開,以至於你沒有先進98就無法使用(純屬猜測) 如果上述都沒錯,接下來,你可以在"純DOS下"使用debug去做測試
你把internal loop back打開,再從TX傳一個BYTE出去RX收回來
如果資料是正確的話,表示硬體方面都沒問題,你再去check你的程式吧
|
before
一般會員 發表:2 回覆:4 積分:1 註冊:2005-08-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |