全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3155
推到 Plurk!
推到 Facebook!

在win98下的dos模式可以控制RS232 , 但在關機->MS-DOS模式下卻無法控制RS232

尚未結案
before
一般會員


發表:2
回覆:4
積分:1
註冊:2005-08-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-16 22:31:54 IP:219.86.xxx.xxx 未訂閱
請問 我在WIN98下的開始->MS-DOS模式寫了一個RS232程式,用來控制TES1336A這台照度計. 在win下可以正常收送資料. 但如果在純DOS(關機->啟動在MS-DOS模式)下,程式卻無法正常運作......不知是什麼原因呢? 我是用Turbo C 3.0寫的... 用outportb(0x3f8,0);這類的方法去控制RS232... 如果需要source code,明天我在post上來,因為在公司~~~我下班了~~~thkx.
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-17 06:13:27 IP:61.59.xxx.xxx 未訂閱
因為它不是真正的DOS。 它沒有跟硬體動作的能力。 只是像DOS而已。
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-17 16:00:47 IP:210.202.xxx.xxx 未訂閱
To before : Under MSDOS下直接讀取某項裝置這種事我做過 不少次, 不太會發生無法運作. 而且你的"無法運 作"的範圍很廣, 可能是編譯器編出來的執行檔本 來就無法在MSDOS下執行, 你再Check看看, 我用 過下列東西寫過: DJGPP DPMI x86組合語言 MSVC 4.0版
before
一般會員


發表:2
回覆:4
積分:1
註冊:2005-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-17 17:02:21 IP:220.128.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-17 17:48:18 IP:210.68.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-17 18:05:33 IP:210.202.xxx.xxx 未訂閱
To before : 看不出來你那裏有設連線參數, 不會是bioscom(0, 0xe3, 0) 這個東西吧
before
一般會員


發表:2
回覆:4
積分:1
註冊:2005-08-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-17 18:16:07 IP:61.220.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-18 13:09:47 IP:210.202.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-18 17:45:53 IP:61.220.xxx.xxx 未訂閱
To Derrenbol1 上面的方法在win98的dos也可以連結儀器, 但在純dos還是不行....... 純dos的uart IC是16550a
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-18 18:05:02 IP:210.202.xxx.xxx 未訂閱
To before : 哦, 這麼難搞啊. 你可以量測你的TX 有送出去嗎? 還有, 你是用Polling的, 所以你知道程式死在那一行嗎?
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-19 08:51:12 IP:61.66.xxx.xxx 未訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-22 13:28:04 IP:61.220.xxx.xxx 未訂閱
Dear 試了之後,在純DOS可以正常送資料出去控制儀器,但是儀器送回的資料我卻讀不到....這是什麼問題呢? 在win98的dos可以正常運作.
系統時間:2024-03-29 5:37:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!