标题: 谁能给我一份DOS下串口编程的资料或者源代码?谢谢!
[打印本页]
作者: wwm_820924
时间: 2005-2-22 00:00
标题: 谁能给我一份DOS下串口编程的资料或者源代码?谢谢!
刚开始学习DOS下串口编程,谁能给我一份DOS下串口编程的资料或者源代码?谢谢!
作者: wwm_820924
时间: 2005-2-23 00:00
对拉,我的邮箱是wwm_820924@sohu.com或wwm_820924@163.com
作者: stamp
时间: 2005-2-25 00:00
标题: serial
我以前写的一个串口程序,看看对你有没有帮助,我比较懒,没有注释,你研究串口,根据具体的名称应该可以明白他们的含义
打开附件
作者: wwm_820924
时间: 2005-2-25 00:00
标题: [原创]
打开附件
首先感谢stamp。
在此我找了一份龚建平伟的源码,一起给大家共享,有需要的下载
作者: rocchapter
时间: 2005-11-29 14:30
我在学校时用过一个代码是电力系统模拟控制程序,其精髓就是RS232的通信编程,不知道还在不在
作者: Neat
时间: 2005-12-17 22:15
我也想要一份看看
作者: syking117
时间: 2006-3-28 15:10
不知道还有没有人理这贴,我也想要一个,能不能给我传一个(
sykings@peoplemail.com.cn),谢谢
作者: cliffwb
时间: 2006-6-21 00:07
附件都下不了啊,
wbin_mail@sohu.com
现已修正(管理员注 2009-4-22)
作者: mengy
时间: 2006-6-29 11:14
标题: 来看看这个吧
还是转来的,对基本原理已经讲的比较清除,自己修改一下就可以了。
附件
1: dos串口通讯原码.c (2006-6-29 11:14, 5.12 K, 下载附件所需积分 1点
,下载次数: 284)
作者: lisa888
时间: 2006-10-7 09:10
谢谢!
作者: chanjoh
时间: 2007-8-23 20:37
下了谢谢!先看看合用不
作者: nokor
时间: 2007-8-27 22:49
这里人好热心啊!!谢谢了
作者: agang220
时间: 2007-9-11 16:52
非常感谢
作者: BA_WANG_MAO
时间: 2007-9-12 15:52
MS-DOS 6.22 下如何编程控制RS232串口详细资料及源程序
http://www.cn-dos.net/forum/viewthread.php?tid=33505
作者: junzhangsh
时间: 2007-11-18 03:10
太好了呀
作者: shim
时间: 2007-11-21 10:49
谢谢分享!
作者: jojand
时间: 2007-11-22 11:08
A机的发送端(TX)与B机的接收端(RX)相连,A机的接收端(RX)与B机的发送端(TX)相连,两机的地线(GND)相连;
发送:
OPEN "COM1:1200,N,8,1,RS,CS,DS" AS #1
PRINT #1,"OK"
CLOSE #1
接收:
OPEN "COM1:1200,N,8,1,RS,CS,DS" AS #1
INPUT #1,A$
CLOSE #1
作者: maclover815
时间: 2007-12-13 22:46
标题: nice
good
作者: shlinno
时间: 2007-12-19 15:49
不错啊,我也需要一个
作者: gaoxy2008
时间: 2008-4-11 10:25
非常感谢
作者: dragon123321
时间: 2008-4-11 17:30
呵呵。。串口并口编程,我的代码
http://hi.baidu.com/大伦子
作者: dragon123321
时间: 2008-4-11 17:31
转载时请留言哦。。我只是想认识几个朋友罢了,交流交流编程罢了,呵呵
作者: netwinxp
时间: 2008-4-17 09:06
Quote: |
Originally posted by jojand at 2007-11-22 11:08:
A机的发送端(TX)与B机的接收端(RX)相连,A机的接收端(RX)与B机的发送端(TX)相连,两机的地线(GND)相连;
发送:
OPEN "COM1:1200 ... |
|
对,居于com设备句柄的操作更省事。
另:单片机方面可以用232芯片(如max232)来实现电平匹配从而降低对电源的要求,以前的电流环在设计中比较容易出现意外。
作者: danieldy
时间: 2008-5-15 12:42
我想下载,可是积分不够
作者: Pauly
时间: 2008-5-15 13:53
下来学习下
作者: ycjyh007
时间: 2008-5-16 16:15
非常感谢~学习中
作者: yhoyo
时间: 2008-5-16 17:03
看看...学习
作者: saliwen302
时间: 2008-5-21 11:43
ding qi !!
作者: lqhlqg123
时间: 2008-5-21 18:48
下载了,谢谢
作者: saliwen302
时间: 2008-5-22 14:50
标题: 贴一段phoenix 的int 14h的code吧
先是注释:
;----------------------------------------------------------------------------
;
; I N T E R R U P T 1 4
;
; coreBiosSerialInterface - The BIOS serial interface supports the
; Intel 8250 Serial chip.
; Functions available are init, send, receive, and status.
;
;
; AH = 00 - Initialize Communications Port
; Entry: DX - COM adapter to initialize (0-3)
; AL - Initialization values
;
; 7 6 5 4 3 2 1 0
; Baud rate Parity stop bits Word length
; ---------------------------------------
; 000-110 00-None 0-1 10-7 Bits
; 001-150 01-Odd 1-2 11-8 Bits
; 010-300 10-None
; 011-600 11-Even
; 100-1200
; 101-2400
; 110-4800
; 111-9600
; Exit: AH - Line status
;
;
; AH = 01 - Send Character
; Entry: DX - Communication adapter number (0-3)
; AL - Character to send
; Exit: AH - Line Status
;
;
; AH = 02 - Receive Character
; Entry: DX - Communcation adapter number (0-3)
; Exit: AL - Character received
; AH - Line Status
;
;
; AH = 03 - Return Communication Status
; Entry: DX - Communication adapter number (0-3)
; Exit: AL - Modem status
; Bit 0 - Delta clear to send
; Bit 1 - Delta data set ready
; Bit 2 - Trailing edge ring indicator
; Bit 3 - Delta (RLSD)
; Bit 4 - Clear to send
; Bit 5 - Data set ready
; Bit 6 - Ring indicator
; Bit 7 - Received line signal detect
;
; AH - Line status
; Bit 0 - Data ready
; Bit 1 - Overrun error
; Bit 2 - Parity Error
; Bit 3 - Framing Error
; Bit 4 - Break detect
; Bit 5 - Trans holding register empty
; Bit 6 - Trans shift register empty
; Bit 7 - Time out error
;
; AH = 04 - Extended Initialize (PS2 compatibility)
; Entry: DX - Communication adapter number (0-3)
; AL - Break
; 00H - No Break
; 01H - Break
; BH - Parity
; 00H - None
; 01H - Odd
; 02H - Even
; 03H - Stick parity odd
; 04H - Stick parity even
; BL - Stop Bit
; 00H - One
; 01H - Two if 6,7, or 8 bit word length
; One and one-half if 5 bit word length
; CH - Word Length
; 00H - 5 bits
; 01H - 6 bits
; 02H - 7 bits
; 03H - 8 bits
; CL - Baud Rates
; 00H - 110 baud
; 01H - 150 baud
; 02H - 300 baud
; 03H - 600 baud
; 04H - 1200 baud
; 05H - 2400 baud
; 06H - 4000 baud
; 07H - 9600 baud
; 08H - 19200 baud
;
; Exit: AL - Modem status
; Bit 0 - Delta clear to send
; Bit 1 - Delta data set ready
; Bit 2 - Trailing edge ring indicator
; Bit 3 - Delta (RLSD)
; Bit 4 - Clear to send
; Bit 5 - Data set ready
; Bit 6 - Ring indicator
; Bit 7 - Received line signal detect
;
; AH - Line status
; Bit 0 - Data ready
; Bit 1 - Overrun error
; Bit 2 - Parity Error
; Bit 3 - Framing Error
; Bit 4 - Break detect
; Bit 5 - Trans holding register empty
; Bit 6 - Trans shift register empty
; Bit 7 - Time out error
;
; AH = 05 - Extended Communications Port Control (PS2 compatibility)
; Entry: AL = 0 Read modem control register
; DX - Communication adapter number (0-3)
; Exit BL = Modem control register
;
; Entry AL = 01 Write modem control register
; DX - Communication adapter number (0-3)
; BL - Modem Control Register
;
; Exit: AL - Modem status
; Bit 0 - Delta clear to send
; Bit 1 - Delta data set ready
; Bit 2 - Trailing edge ring indicator
; Bit 3 - Delta (RLSD)
; Bit 4 - Clear to send
; Bit 5 - Data set ready
; Bit 6 - Ring indicator
; Bit 7 - Received line signal detect
;
; AH - Line status
; Bit 0 - Data ready
; Bit 1 - Overrun error
; Bit 2 - Parity Error
; Bit 3 - Framing Error
; Bit 4 - Break detect
; Bit 5 - Trans holding register empty
; Bit 6 - Trans shift register empty
; Bit 7 - Time out error
;
;============================================================================
作者: saliwen302
时间: 2008-5-22 14:52
标题: 贴一段phoenix 的int 14h的code吧 2
这个是int 14h的入口函数,用来dispatch任务
;============================================================================
;
; DECLARE SERIAL COMMAND TABLE
;
PUBLIC coreSerialCmdTable
coreSerialCmdTable LABEL WORD
DW coreSerialInit
DW coreSerialSend
DW coreSerialReceive
DW coreSerialStatus
DW coreExtendedSerialInit
DW coreExtendedPortControl
coreBiosSerialInterface PROC FAR
sti
PUSH_REG_STACK ; Save regs, set BP
cmp ah, 05 ; Command out of range?
ja serialExit ; Yes - Don't do anything
cmp dx, 3 ; Requesting > COM4?
ja serialExit ; Yes - Don't do anything
mov ds, SegAddressBDA ; Access BIOS data area
mov bx, dx ; Get COM channel number
mov cl, bdaRS232TimeOut[bx] ; Get timeout value
shl bx, 1 ; Double for Base address
mov dx, bdaRS232Table[bx] ; Read base address for COM
or dx, dx ; Test for COM not available
jz serialExit ; Yes-Dont do anything
movzx bx, ah ; Save command number in BX
mov ah, cl ; Keep timeut in AH
shl bx, 1 ; Double for table offset
add dx, 04 ; Advance DX to MCR
call cs:coreSerialCmdTable[bx] ; Go perform command
serialExit:
mov BYTE PTR [bp].regStack.axReg + 1, ah ; Save line status in AH
POP_REG_STACK ; Restore callers registers
iret
coreBiosSerialInterface ENDP
作者: saliwen302
时间: 2008-5-22 14:54
标题: 贴一段phoenix 的int 14h的code吧 3
两个macro,帮助理解程序:
;;---------------------------------------------------------------------------
;;
;; PUSH_REG_STACK - set up register stack
;;
;; Processing:
;; pushes all regs associated with register stack structure
;; copies SP to BP
;;
;; Usage:
;; PUSH_REG_STACK - to set up register stack
;; [bp].regStack.axReg - to reference AX register on regStack
;;
PUSH_REG_STACK MACRO
pusha
push es
push ds
mov bp, sp
ENDM
;;---------------------------------------------------------------------------
;;
;; POP_REG_STACK - restore regs from register stack
;;
;; Usage:
;; POP_REG_STACK - to restore regs from register stack
;;
POP_REG_STACK MACRO
pop ds
pop es
popa
ENDM
作者: saliwen302
时间: 2008-5-22 14:55
标题: 贴一段phoenix 的int 14h的code吧 3
Init COM的代码,分为legacy init和extend mode init
;+---------------------------------------------------------------------------
;
; coreSerialInit - Initialize the specified RS232 channel.
;
; Entry:
;
; Exit:
;
; Modifies:
;
; Processing:
; Initialization consists of programming the line control registers,
; the baud rate divisor, and clearing the interrupt enable register.
;
coreSerialInit PROC NEAR PUBLIC
and al, 01Fh ; Clear Baud bits from init
mov ch, al ; Save to restore w DLAB off
or al, 080h ; Set the DLAB bit on
dec dx ; Decrement to LCR (xFBH)
out dx, al ; Keep Stick and Set Break low
mov al, BYTE PTR [bp].regStack.axReg ; Get init byte again
mov cl, 05 ; Shift baud bits down
shr al, cl ; to bit 0 position
mov cl, al ; Save baud rate number
or al, al ; Are we setting 110 baud ?
mov ax, 417h ; Handle 110 baud special
jz setBaudRate ; Yes-Use value in AX
mov ax, 0600h ; Compute divisor based
shr ax, cl ; on baud rate number
setBaudRate:
xchg al, ah ; Get high divisor into AL
dec dx ; Move back to high divisor
dec dx ; located at xF9H.
out dx, al ; Write MSB of divisor
IODELAY
dec dx ; Move back to LSB of divisor
mov al, ah ; Get LSB divisor byte
out dx, al ; Write at xF8H.
add dx, 03 ; Advance to LCR
mov al, ch ; Get LCR value w/o DLAB set
out dx, al ; Write LCR (xFBH)
sub dx, 02 ; Go back to interrupt
mov al, 00 ; Dont allow any 8250
out dx, al ; interrupts occur
add dx, 03h ; Move to (LSR-1) (xFCH)
jmp coreSerialStatus ; Go return Line & Modem status
coreSerialInit ENDP
;+---------------------------------------------------------------------------
; coreExtendedSerialInit - For PS/2 Compatibility
; Extended communications port initialization.
;
; Entry:
; DX points to MCR
;
; Exit:
;
; Modified:
;
coreExtendedSerialInit PROC NEAR PUBLIC
mov cx, [bp].regStack.cxReg
cmp cl, 8
ja extendedSerialInitEx
xor ch, ch ; Retrieve the baud rate divisor
shl cx, 1 ; and set the baud rate.
mov di, cx
mov bx, baudDivisorTable[di]
dec dx ; Reference the line control register.
push ax
call setBd
pop ax
and al, 00000001b ; Use only the break/no break.
shl al, 6 ; Build the line control word. AL is
mov bx, [bp].regStack.bxReg
shl bl, 2 ; Break/no break, BL is stops,
or al, bl ; Doesn't match the control register's
mov cx, [bp].regStack.cxReg
or al, ch
mov bl, bh
and bx, 00000111b
or al, BYTE PTR BHTranslate[BX]
out dx, al ; Set LCR
IODELAY
sub dx, 02 ; Go back to interrupt
mov al, 00 ; Dont allow any 8250
out dx, al ; interrupts occur
add dx, 03h ; Move to MCR
ExtendedSerialInitEx:
jmp coreSerialStatus ; Go return Line & Modem status
coreExtendedSerialInit ENDP
作者: saliwen302
时间: 2008-5-22 14:56
标题: 贴一段phoenix 的int 14h的code吧 4
然后是发送和接受
;+---------------------------------------------------------------------------
;
; coreSerialSend - Send specified character to 8250 Serial Device.
;
; Entry:
;
; Exit:
;
; Modifies:
;
; Processing:
; Before the data is sent, CTS and DTR must be set and the tranmitter
; holding register must be empty.
;
coreSerialSend PROC NEAR PUBLIC
movzx cx, ah ; Set timeout in CX
mov al, 03h ; Set DTR and RTS
out dx, al ; Write to MCR (xFCH)
inc dx ; Advance to Modem status
inc dx ; register (MSR at xFEH)
sendWaitLoop:
push cx ; Save Timeout count
mov bx, 3030h ; Mask for CTS and DSR
mov cx, 8235h ; Wait for 1 sec
call coreIOstatus30us ; Wait for CTS and DSR
jz lsrTranReg
pop cx ; Restore count
loop sendWaitLoop ; Loop again if I/O timeout
jmp coreSerialTimeout
lsrTranReg:
pop cx
dec dx ; Else-Move back to LSR
transmitWait:
push cx ; Save timeout
mov bx, 2020h ; Wait for Transmit Reg empty
mov cx, 8235h
call coreIOstatus30us
pop cx ; Restore timeout
loopne transmitWait ; Go wait if not ready and time left
jnz coreserialTimeout ; Exit if error
serialTransmit:
sub dx, 05 ; Move back to Data reg (xF8H)
mov al, BYTE PTR [bp].regStack.axReg ; Get byte to send
out dx, al ; Send it to 8250
add dx, 05 ; Advance to LSR
jmp coreserialStatus1 ; Go return Line Status
coreSerialTimeout::
mov ah, 080h ; Return timeout error
ret
coreSerialSend ENDP
;+---------------------------------------------------------------------------
;
; coreSerialReceive - Receive a character from the 8250.
;
; Entry:
;
; Exit:
;
; Modifies:
;
; Processing:
; In order for a character to be received, DSR must be set in
; the modem status register and em status register and data ready must be set in the
; line status register. If the break key is pressed during the
; timeout period, then a premature timeout will occur.
;
coreSerialReceive PROC NEAR PUBLIC
movzx cx, ah ; Set timeout in CX
mov al, 01 ; Set DTR in MCR
out dx, al ; Write to Modem Control reg
inc dx ; Advance to modem status
inc dx ; register (MSR at xFEH)
dsrWaitLoop:
push cx ; Save timeout count
mov bx, 2020h ; Mask for DSR
mov cx, 8235h ; Wait for 1 sec
call coreIOstatus30us ; Wait for DSR - All registers
; are preserved across call
pop cx ; Restore count
jz checkLsrDataRdy
loop dsrWaitLoop ; Loop again if I/O timeout
jmp coreSerialTimeout ; Exit if error
checkLsrDataRdy:
dec dx ; Else-Decrement to LSR
in al, dx ; Read LSR
mov ah, al ; Save line status
and ah, 1Eh ; Isolate error bits
receiveWait:
push cx ; Save timeout
mov bx, 0101h ; Mask for Data Ready
mov cx, 8235h ; 1 sec wait
call coreIOstatus30us ; Wait for Data Ready - All registers
; are preserved across call
pop cx ; Restore timeout
loopne receiveWait ; Go wait if not ready and time left
jnz coreSerialTimeout ; Exit if error
coreDataReady:
sub dx, 05 ; Move back to data register
in al, dx ; Read character from line
mov BYTE PTR [bp].regStack.axReg, al ; Save character in AL
ret ; Return to caller
coreSerialReceive ENDP
作者: saliwen302
时间: 2008-5-22 14:58
标题: 贴一段phoenix 的int 14h的code吧 5
取得当前COM状态的函数
;+---------------------------------------------------------------------------
;
; coreSerialStatus - Return the status of the line status register
; and the modem status register.
;
; Entry:
;
; Exit:
;
coreSerialStatus PROC NEAR PUBLIC
inc dx ; Advance to LSR
call coreSerialStatus1 ; Read status of registers
mov BYTE PTR [bp].regStack.axReg, al ; Save the Modem status in AL
ret
coreSerialStatus ENDP
;+---------------------------------------------------------------------------
;
; coreSerialStatus1 - Return the status of the line status register
; and the modem status register.
;
; Entry:
;
; Exit:
;
coreSerialStatus1 PROC NEAR PUBLIC
in al, dx ; Read Line Status register
mov ah, al ; Save line status in AH
inc dx ; Advance to Modem status reg
in al, dx ; Read modem status register
ret
coreSerialStatus1 ENDP
作者: saliwen302
时间: 2008-5-22 14:59
最后一个函数,如果是用 ah=05 int 14h的话,就会到以下这个函数执行。
;+---------------------------------------------------------------------------
;
; coreExtendedPortControl - For PS/2 compatability
;
; Entry:
; DX points to MCR
;
; Exit:
;
coreExtendedPortControl PROC NEAR PUBLIC
cmp al, 1 ; Check function in range
je ecpcWrite ; If AL == 1, then WRITE requested.
jb ecpcRead ; If AL == 0, then READ requested.
ret
; the READ returns the contents of the Modem Control Port, of the Line Status
; Register, and of the Modem Status Register.
ecpcRead:
in al, dx ; Read it and
mov BYTE PTR [bp].regStack.bxReg, al
jmp ecpcExit
; the WRITE sets the contents of the Modem Control Register, and then returns
; the contents of the Modem Status Register and of the Line Status Register.
ecpcWrite:
mov al, BYTE PTR [bp].regStack.bxReg ; Get original bx
and al, 01Fh
out dx, al ; Set modem control
ecpcExit:
IODELAY
jmp coreSerialStatus
coreExtendedPortControl ENDP
作者: saliwen302
时间: 2008-5-22 15:04
标题: 贴一段phoenix 的int 14h的code吧 6
以下这个函数是在发送和接受的时候会用到的。这个是一个通用的函数,不得不佩服Phoenix的功力。
至于里面调用的coreDelayMin15us的实现是通过读取acpi timer来实现的。这个就要看具体的南桥的spec了。就不贴了。
;+---------------------------------------------------------------------------
;
; coreIOStatus30us - Wait a specified time for an IO port status
;
; Entry:
; BH - Mask
; BL - Match
; CX - Time in 30us
; DX - IO Address
;
; Exit:
; ZF = 0 - Timed out waiting for desired status
; = 1 - Data value matched
;
; Modifies:
; Minor flags
;
; Process:
; This routine waits until either the specified port matches
; the desired state or for the specified time to expire.
;
coreIOStatus30us PROC NEAR PUBLIC
push ax
push ecx
movzx ecx, cx ; Convert to 15uS intervals
shl ecx, 1
jmp IOS30CheckEntry
IOS30Check:
push cx
mov cx, 1 ; Delay at least 15us
call coreDelayMin15us
pop cx
IOS30CheckEntry:
in al, dx ; AL := Current value of target port
and al, bh ; Eliminate don't care bits
cmp al, bl ; Remaining bits = expected pattern?
je IOS30GotStatus ; Yes-Exit check loop
loopd IOS30Check ; No -Repeat until timer expires
IOS30GotStatus:
pop ecx
pop ax
ret
coreIOStatus30us ENDP
作者: biqiang
时间: 2008-5-23 15:07
学习一下吧,现在想弄一下DOS下Modem通讯
作者: yanchunyun
时间: 2008-7-16 11:53
一直都沒上論壇,積分居然為 0,丟人啊!
作者: cmangel
时间: 2008-8-28 23:17
谢谢,没想到这里有我想找的东东,好好学习一下,太感谢了。
作者: 112223333
时间: 2009-2-15 17:35
xiexie
作者: zhanglitao422
时间: 2009-2-23 12:29
关注中,看看。。
作者: weiguohua
时间: 2009-3-16 00:03
标题: 2008
这年头搞这个的人不多见了.
作者: chali
时间: 2009-4-9 23:30
ding
作者: lonegoer
时间: 2009-4-21 12:41
有没有具体点的关于rts,dtr握手处理相关的串口c源码啊?
作者: saline
时间: 2009-4-27 10:40
看看哦
作者: djxxt
时间: 2009-11-29 19:47
多谢。我也学习学习
作者: bausrpgf888
时间: 2009-12-6 10:11
学习了,谢谢资料.
作者: wangwei86117
时间: 2009-12-9 09:56
很好
作者: cir2633
时间: 2010-1-7 15:03
mark
作者: czweb
时间: 2010-6-6 12:09
楼上发的附件怎么才能变成可以执行文件,如bat,exe
作者: 人类
时间: 2010-6-16 01:07
DOS下编程可以用BC++3.1啊,很经典
作者: blue007
时间: 2010-8-10 18:20
谢谢
作者: yysn
时间: 2010-9-19 01:51
我也想要
作者: netreg
时间: 2010-10-9 10:13
很好,牛人……
作者: hxfcm1234
时间: 2010-10-9 23:14
好
作者: wangz
时间: 2010-10-13 23:25
串口通讯比较方便谢谢提供资料!
作者: luoshiwan
时间: 2015-11-3 22:02
谢谢