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

WindowsXP與DOS使用RS232連線傳輸資料實作問題?

尚未結案
jim1247
一般會員


發表:8
回覆:20
積分:5
註冊:2003-01-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-21 16:56:52 IP:59.120.xxx.xxx 未訂閱
目前是要使用WindowsXP將指令透過RS232 傳輸到DOS端的程式來控制儀器 在XP使用BCB開啟RS232的部份是ok的 但DOS端則一直有問題 我是使用Turbo C 來開發的 不知有沒這方面實作的範例 包含流量控制.資料傳送.設定等等 謝謝
暗黑破壞神
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-21 21:01:21 IP:59.104.xxx.xxx 未訂閱
DOS 的 RS232 要用到 INT 中斷去處理。 這部份的資料目前已經比較少見了。 去舊書店找看看有沒有吧。
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-21 23:32:19 IP:220.139.xxx.xxx 未訂閱
請問你目前DOS下如何使用RS232a???
jim1247
一般會員


發表:8
回覆:20
積分:5
註冊:2003-01-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-22 09:31:17 IP:59.120.xxx.xxx 未訂閱
先謝上面2位大大的回應 可能真的太舊了 相關資料真的很少,又沒有人可以問 目前我只能利用fopen函式來開啟com port 但不知為何一開啟去fread會一現一堆'\x'的資料 要先讀完才會清空stream,而且baudrate.flow control等也不知如何處理 真的滿急的說...
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-22 16:06:38 IP:220.139.xxx.xxx 未訂閱
試試這個Tool http://web4.moxa.com/support/download_TW.asp#4_mxdos36.exe 我以前用於DOS環境.不支版本變更否?
friendlly
高階會員


發表:22
回覆:144
積分:103
註冊:2003-04-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-07-25 09:11:50 IP:61.64.xxx.xxx 未訂閱

DOS的方式只要針對 0x3f8 <=看你是要用com 1or .....位置不同

先設定通訊的potocol,再建立一個中斷指標的subfunction.

ps: 1.sample 不一定你能用(參考):

2.程式太久了若有問題,你見諒.

#define _COM1_ 0x3F8
#define _COM2_ 0x2F8
#define _COM3_ 0x2E8
#define _COM4_ 0x2E0
#define _8259_ 0x20
#define Rate600 0xc0
#define Rate1200 0xc0
#define Rate1800 0x60
#define Rate2000 0x40
#define Rate2400 0x3a
#define Rate3600 0x30
#define Rate4800 0x20
#define Rate7200 0x18
#define Rate9600 0x0c
#define DataBit5 0x00
#define DataBit6 0x01
#define DataBit7 0x02
#define DataBit8 0x03
#define StopBit 0x04
#define CheckEO 0x08
#define EventBit 0x10
#define OddBit 0x00
#define SetRate 0x80
#define RDataRdy 0x01
#define OverRun 0x02
#define EOError 0x04
#define FarmErr 0x08
#define BrkDetec 0x10

void ( interrupt far *_old_irq4_ )( );

//////////////////////////////////////////////////
//////////////////////////////////////////////////
void init_rs232(int _Com_,int _Rate,int _Status)
{
#ifndef _Demo
outp((_Com_ LineCont),SetRate); //ENABLE CHANGE TRANSFER RATE
outp(_Com_,_Rate); //SET RATE LSB
outp((_Com_ IntEnReg),0x00); //SET RATE MSB
outp((_Com_ LineCont),(_Status & 0x7f)); //ENABLE CHANGE TRANSFER RATE
outp((_Com_ ModemCon),0x03); //set modem work in no error
outp((_Com_ IntEnReg),0x01); //set revice data to interrupt
#endif
}

//////////////////////////////////////////////////
//////////////////////////////////////////////////
void Transfer_Data(int _Com_,char _Data)
{
#ifndef _Demo
if(inp(_Com_ LinStats) && 0x20){
outp(_Com_,_Data);
// printf("%1x",_Data);
}
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void interrupt far _read_data_from_com1( )
{
#ifndef _Demo
outp( 0x20, 0x20 ); // E.O.I.
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _setup_new_irq3( )
{
#ifndef _Demo
_old_irq3_ = _dos_getvect( 0x0B ); // backup old irq3 sub.
_dos_setvect( 0x0B, _read_data_from_com2 ); // setup new irq3 sub.
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _restore_old_irq3( )
{
#ifndef _Demo
_dos_setvect( 0x0B, _old_irq3_ ); // restore old irq3 sub.
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _disable_irq3( )
{
#ifndef _Demo
outp( _8259_, inp( _8259_ )|0x08 );
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _enable_irq3( )
{
#ifndef _Demo
outp( _8259_, inp( _8259_ )&0xF7 );
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _enable_rcv_interrupt( int _port_ )
{
#ifndef _Demo
int _status;
_status = inp( _port_ LineCont )&0x7F;
outp( _port_ LineCont, _status ); // set DLAB = 0
outp( _port_ IntEnReg, 1 ); // enable RXY interrupt
( _port_==_COM1_ ) ? _enable_irq4( ) : _enable_irq3( );
#endif
}
//////////////////////////////////////////////////
void _disable_rcv_interrupt( int _port_ )
{
#ifndef _Demo
int _status;
_status = inp( _port_ LineCont )&0x7F;
outp( _port_ LineCont, _status ); // set DLAB = 0
outp( _port_ IntEnReg, 0 ); // disable RXY interrupt
( _port_==_COM1_ ) ? _disable_irq4( ) : _disable_irq3( );
#endif
}//////////////////////////////////////////////////
//////////////////////////////////////////////////

main()

{

//init Com port

init_rs232(_COM1_,Rate9600,DataBit8|CheckEO|OddBit|StopBit);
_setup_new_irq4();
_enable_rcv_interrupt( _COM1_ );


Transfer_Data(_COM1_,0x2);
delay(10);

//exit

_restore_old_irq4( );

}

friendlly
高階會員


發表:22
回覆:144
積分:103
註冊:2003-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-07-25 09:16:12 IP:61.64.xxx.xxx 未訂閱

忘了一件事情,,上面的程式只有傳送....

至於接收的部份....你去察看_8259 有一個Bit是在偵測有無資料進來...

系統時間:2024-04-19 9:49:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!