COM port communication
13 отговора
348 прегледа
COM port communication
Здравейте, може ли някой да ми каже как може да се направи на С++ следната комуникация през СОМ порта на Turbo BASIC:
а%=20
b%=&h81
...................
a1%=a% or &hc0
call pred(a1%)
call priem(k%,t&,10000)
call pred(b%)
call priem(k%,t&,10000)
for k%=0 to 30
call priem(i%,t%,10000)
if t%=10000 then k%=30
c%(k%)=i%
next
sub pred(ou%)
do
m%=inp(&h2fd)
m%=m% and &b01000000
loop while m%=0
out &h2f8,ou%
end sub
sub priem(c%,t%,d%)
p%=0
p%=p%+1
q%=inp(&h2fd)
q%=q% and 1
loop while q%=0 and p%<d%
t%=p%
c%=inp(&h2f8)
end sub
а%=20
b%=&h81
...................
a1%=a% or &hc0
call pred(a1%)
call priem(k%,t&,10000)
call pred(b%)
call priem(k%,t&,10000)
for k%=0 to 30
call priem(i%,t%,10000)
if t%=10000 then k%=30
c%(k%)=i%
next
sub pred(ou%)
do
m%=inp(&h2fd)
m%=m% and &b01000000
loop while m%=0
out &h2f8,ou%
end sub
sub priem(c%,t%,d%)
p%=0
p%=p%+1
q%=inp(&h2fd)
q%=q% and 1
loop while q%=0 and p%<d%
t%=p%
c%=inp(&h2f8)
end sub
Re: COM port communication
hum, za kva platforma. dos, linux, win9x, win2k/XP??? ekvivalenta na tvoite funkcii za c pod dos sa inp, outp, mai biaha v io.h. imat si opisanie 4eti helpa, ba4ka se lesno. za win2k ti triabva ili da izu4ish DDKto, koeto e dosta goliamo i gadni4ko ili da si vzemesh biblioteka za dostap ot vida na WinDriver
Re: COM port communication
Zasega se opitwam pod DOS, ama shte e po-dobre pod Win9x. Zatowa sega si swalqm C++ builder-a V5 da widja tam kak e, che pod DOS neshto ne moga da go podkaram.
Re: COM port communication
Opitaj s file-owite API na WIndows. Oswen towa probwaj SetCommTimeout i wig DCB structurite w help-a.
Re: COM port communication
za DOS trebva da procetes dokumentaciata na COM-Port-a
sa trebva sam da si napravis vsicko! ama ne e trudno!!!
pod windows e po trudno!!!!!
sa trebva sam da si napravis vsicko! ama ne e trudno!!!
pod windows e po trudno!!!!!
Re: COM port communication
Ако ползваш C++ Builder, изтегли си от [линк] "Async32 v2.0". Това в контрола за работа с COM портовете.Има доста подробен Help и примери, така че ще се ориентираш как се използва
Re: COM port communication
Ne go slushaj...
Po dobre razuchi API funkciite na Win32.
Po dobre razuchi API funkciite na Win32.
Re: COM port communication
OK. A ima li njakade iz net-a primerni programki, che w knigite i uchebnicite, koito imam njama nishto za com portowete. Shte mi se da go naprawja maksimalno prosto. Nemoje na Turbo Basic da e tolkowa prosto a na C da polzwam otdelni moduli?! Na C++ za DOS razuchih funkcijte za komunikcija, no s otwarjaneto na com porta neshto ne moga da se sprawja.
Re: COM port communication
Ama ne se zanimawai s DOS!
Hwashtash API to za ushite i go prawish za Windows. Otwariash MSDN pishesh "Communication Functions" i 4etesh - "SetCommXXX, GetCommXXX i razni drugi fumkciiki a za da otworish porta
hPort=CreateFile("COM2",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0)".
Towa e! Wsi4ko stawa mnogo lesno.
I kakwi sa tezi C Builderi

za was niama li VC++
Hwashtash API to za ushite i go prawish za Windows. Otwariash MSDN pishesh "Communication Functions" i 4etesh - "SetCommXXX, GetCommXXX i razni drugi fumkciiki a za da otworish porta
hPort=CreateFile("COM2",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0)".
Towa e! Wsi4ko stawa mnogo lesno.
I kakwi sa tezi C Builderi
za was niama li VC++
stiga s toia windows be!
ako pise samo windows nikoga nema da nauci sto e to rs232 i t.n.
Re: stiga s toia windows be!
Abe i az predpochitam da e pod DOS, che e po-prosto. Obache probwam s c++ 3.1 i ne moga da razbera kak da stane. Help-a e mnogo beden, a neznam kade da tarsja poweche informacija. Prosto iskam da izpolzwam po-golemite wazmojnosti na C++, inache programkata si raboti dobre i na Turbo Basic, samo deto iska chist DOS a na men mi trjabwa da raboti neprekasnato, dokato se raboti s Win-a.
Re: stiga s toia windows be!
ama vij sega! pod dos trebva sam da si inicialkiziras rs-a kaot pises nujnoto po nuknite portove! IRQ-to (ako ste polzvas takova) v nai prostia slucia moje d apolzvas funkciit ena BIOS ili dori na DOS ama te polzvat samo hardueren protokol(DTR/DSR)
eto ti izvadka ot techlelp:
eto ti izvadka ot techlelp:
The BIOS Data Area contains a list of up to four COM port base addresses.
During POST the older BIOSes tests for and initialize COM1 and COM2; newer
ones also handle COM 3 and COM 4.
ю The COM1 adapter decodes ports 3f8H through 3ffH
ю The COM2 adapter decodes ports 2f8H through 2ffH
ю The COM3 adapter decodes ports 3e8H through 3efH
ю The COM4 adapter decodes ports 2e8H through 2efH
The ROM BIOS INT 14H will work with any of the four ports, as long as you
store the port's base address into the COMn port table starting at
0040:0000. It is critical that no two adapters share the same physical
port addresses or neither will work.
BIOS supports a simple polling-style serial I/O. The adapter is able to
force a hardware interrupt on a variety of conditions, depending upon the
values in the Interrupt Enable Register (3f9H or 2f9H).
ю COM1 forces interrupt level 4 (IRQ 4 is handled by INT 0cH vector)
ю COM2 forces interrupt level 3 (IRQ 3 is handled by INT 0bH vector)
ю COM3 shares IRQ4. BIOS checks the Int ID regs to see who rang
ю COM4 shares IRQ3. BIOS checks the Int ID regs to see who rang
In the following chart, pb+n is one of 3f8H+n, 2f8H+n, 3e8H+n, 2e8H+n,
depending upon the port. For instance, for COM1, pb+3=3fbH.
Port Description
ЯЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
pb+0 Write: transmitter holding register. 8 bits of character to be sent.
Read: receiver buffer register. 8 bits of character received.
Write: (if DLAB=1) divisor latch low byte Baud DivisorЮЭBaud Divisor
After OUT pb+3,80H this port holds ЯЯЯЯ ЯЯЯЯЯЯЯЮЭЯЯЯЯ ЯЯЯЯЯЯЯ
the low byte of the clock divisor 110 1040ЮЭ1200 96
which, together with the high byte 150 768 ЮЭ2400 48
(port pb+1) constitute 16-bit value 300 384 ЮЭ4800 24
that sets the baud rate as shown: 600 192 ЮЭ9600 12
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+1 Write: divisor latch high byte (when DLAB=1; i.e., after OUT pb+3,80H)
Write: interrupt enable register
Ц7В6В5В4В3В2В1В0·
є0 0 0 0і і і і є
УДБДБДБДБТБТБТБТЅ bit
є є є ИН 0: 1=enable interrupt when rec'd data is available
є є ИННН 1: 1=enable interrupt when transmit buffer is empty
є ИННННН 2: 1=enable int on rec'r line status (err or break)
ИННННННН 3: 1=enable int on modem status (CTS,DSR,RI,RLSD)
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+2 Read: interrupt identification reg. When an interrupt occurs, read
this register to find what caused it.
Ц7В6В5В4В3В2В1В0·
є і0 0і і і є
УДБДБДБДБТБДБДБТЅ bit
ИЛј є ИЛј ИН 0: 1=no interrupt pending; can be used in polling
є є ИНННН1-2: 00=receiver line status interrupt. Occurs on:
є є overrun, parity, or framing error, or break
є є Reset by reading line status (port pb+5)
є є 01=received data available
є є Reset by reading receiver buffer (port pb+0)
є є 10=transmitter buffer empty
є є Reset by writing transmitter buffer (pb+0)
є є 11=modem status. Occurs upon:
є є Clear To Send, Data Set Ready, Ring Ind, or
є є Rec'd Line Signal Detect.
є є Reset by reading modem status (port pb+6).
є ИННННННН 3: (16550 UARTs) 1=Receiver FIFO time-out
ИНННННННННННННН6-7: (16550 UARTs) 00=FIFOs disabled (or old 8250)
11=FIFOs enabled
01=FIFOs enabled and DMA mode
Write: (16550 UARTs) FIFO control register (write only)
Ц7В6В5В4В3В2В1В0·
є і0 0і і і і є
УДБДБДБДБТБТБТБТЅ bit
ИЛј є є є ИН 0: 1=enable FIFO mode
є є є ИННН 1: 1=clear receiver FIFO
є є ИННННН 2: 1=clear transmit FIFO
є ИННННННН 3: DMA mode select
ИНННННННННННННН6-7: FIFO interrupt triggger level: 00=1 byte;
01=four bytes; 10=8 bytes; 11=16 bytes
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+3 Read/Write: line control register
Ц7В6В5В4В3В2В1В0·
є і і іparіsіlenє
УТБТБТБДБДБТБДБДЅ bit
є є є ИЛј є ИНКН 0-1: word length: 00=5, 01=6, 10=7, 11=8
є є є є ИННННН 2: stop bits: 0=1,1=2 (some oddball exceptions)
є є є ИНННННН 3-4: parity: x0=None, 01=Odd, 11=Even
є є ИННННННННННН 5: stuck parity (not used by BIOS)
є ИННННННННННННН 6: enable break control. 1=start sending 0s (spcs)
ИННННННННННННННН 7: DLAB (Divisor Latch Access Bit) Determines mode
of ports pb+1 and pb+2. 1=set baud, 0=normal
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+4 Write: modem control register
Ц7В6В5В4В3В2В1В0·
є0 0 0і і і і і є
УДБДБДБТБТБТБТБТЅ bit
є є є є ИН 0: 1=activate -DTR (-data trmnl rdy), 0=deactivate
є є є ИННН 1: 1=activate -RTS (-request to send), 0=deactivate
є є ИННННН 2: 1=activate -OUT1 (spare, user-designated output)
є ИННННННН 3: 1=activate -OUT2
ИННННННННН 4: 1=activate loopback for diagnostic testing
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+5 Read: line status register
Ц7В6В5В4В3В2В1В0·
є і і і і і і і є Note: bits 1-4 cause interrupt if enabled (pb+1)
УТБТБТБТБТБТБТБТЅ bit
є є є є є є є И 0: 1=data ready (DR). Reset by reading recv'r buffer
є є є є є є ИНН 1: 1=overrun error (OE). Previous character is lost
є є є є є ИНННН 2: 1=parity error (PE). Reset by reading line status
є є є є ИНННННН 3: 1=framing error (FE). Bad stop bit in character
є є є ИНННННННН 4: 1=break indicated (BI). Sustained space received
є є ИНННННННННН 5: 1=transmitter holding register empty. OK to send
є ИНННННННННННН 6: 1=transmitter empty. No data being processed.
ИНННННННННННННН 7: (16450 UARTs) 1=Receiver FIFO error
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+6 Read: modem status register
Ц7В6В5В4В3В2В1В0·
є і і і і і і і є Note: bits 0-3 cause an interrupt if enabled (pb+1)
УТБТБТБТБТБТБТБТЅ bit
є є є є є є є ИН 0: 1=Delta Clear To Send (DCTS) has changed state
є є є є є є ИННН 1: 1=Delta Data Set Ready (DDSR) has changed state
є є є є є ИННННН 2: 1=Trailing Edge Ring Indicator (TERI) is active
є є є є ИННННННН 3: 1=Delta Data Carrier Detect (DDCD) has changed
є є є ИННННННННН 4: 1=Clear To Send (CTS) is active
є є ИННННННННННН 5: 1=Data Set Ready (DSR) is active
є ИННННННННННННН 6: 1=Ring Indicator (RI) is active
ИННННННННННННННН 7: 1=Data Carrier Detect (DCD) is active
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
pb+7 Read/Write scratch pad
ДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
See Also: INT 14H (serial port I/O)
BIOS Data Area
Cables and Pin Outs
I/O Port Map
--
***************************************************
ili kak tova moje a stane ot PASCAL (na C ocevidno ste e sastoto)
UNIT RS232;
INTERFACE
PROCEDURE RSINIT(C:BYTE;BR:LONGINT;X1,X2:WORD);
PROCEDURE RSCLOSE;
PROCEDURE RSW(B:BYTE);
FUNCTION RSR:BYTE;
FUNCTION RSRX:BOOLEAN;
PROCEDURE PC(C:CHAR);
FUNCTION GC:CHAR;
PROCEDURE SETDTR;
PROCEDURE CLRDTR;
PROCEDURE SETRTS;
PROCEDURE CLRRTS;
PROCEDURE DELAY18(B:BYTE);
IMPLEMENTATION
USES DOS;
CONST
RBR=0;
THR=0;
IER=1;
IIR=2;
LCR=3;
MCR=4;
LSR=5;
MSR=6;
DDL=0;
DLM=1;
VAR
RSCOM:BYTE;
RSPORT:WORD;
RSIRQ:BYTE;
MIN:ARRAY[0..256]OF BYTE;
MINX1,MINX2:BYTE;
IRQMASK:BYTE;
IRQSAVE:POINTER;
{--------------------------------------------}
PROCEDURE RSINT;INTERRUPT;
BEGIN
IF PORT[RSPORT+IIR] AND 4<>0 THEN BEGIN INC(MINX2);MIN[MINX2]:=PORT[RSPORT+RBR];END;
PORT[$20]:=$20;
END;
{--------------------------------------------}
PROCEDURE RSINIT(C:BYTE;BR:LONGINT;X1,X2:WORD);
BEGIN
IF (C<>1)AND(C<>2)AND(C<>3)AND(C<>4) THEN C:=1;
IF C=1 THEN BEGIN RSPORT:=$3F8;RSIRQ:=$04;END;
IF C=2 THEN BEGIN RSPORT:=$2F8;RSIRQ:=$03;END;
IF C=3 THEN BEGIN RSPORT:=$3E8;RSIRQ:=$04;END;
IF C=4 THEN BEGIN RSPORT:=$2E8;RSIRQ:=$03;END;
IF X1<>0 THEN RSPORT:=X1;
IF X2<>0 THEN RSIRQ:=X2;
GETINTVEC($08+RSIRQ,IRQSAVE);
SETINTVEC($08+RSIRQ,ADDR(RSINT));
PORT[RSPORT+LCR]:=$83;
PORT[RSPORT+DDL]:=LO(TRUNC(1.84332E6/16/BR));
PORT[RSPORT+DLM]:=HI(TRUNC(1.84332E6/16/BR));
PORT[RSPORT+LCR]:=$03;
PORT[RSPORT+IER]:=$01;
PORT[RSPORT+MCR]:=$08;
C:=PORT[RSPORT+RBR];
C:=PORT[RSPORT+RBR];
C:=PORT[RSPORT+RBR];
IRQMASK:=PORT[$21];
IF RSIRQ=$05 THEN PORT[$21]:=PORT[$21]AND $DF;
IF RSIRQ=$04 THEN PORT[$21]:=PORT[$21]AND $EF;
IF RSIRQ=$03 THEN PORT[$21]:=PORT[$21]AND $F7;
END;
{--------------------------------------------}
PROCEDURE RSCLOSE;
BEGIN
SETINTVEC($08+RSIRQ,IRQSAVE);
PORT[$21]:=IRQMASK;
PORT[RSPORT+IER]:=$00;
END;
{--------------------------------------------}
PROCEDURE SETDTR;BEGIN PORT[RSPORT+MCR]:=PORT[RSPORT+MCR]OR 1;END;
PROCEDURE CLRDTR;BEGIN PORT[RSPORT+MCR]:=PORT[RSPORT+MCR]AND $FE;END;
PROCEDURE SETRTS;BEGIN PORT[RSPORT+MCR]:=PORT[RSPORT+MCR]OR 2;END;
PROCEDURE CLRRTS;BEGIN PORT[RSPORT+MCR]:=PORT[RSPORT+MCR]AND $FD;END;
{--------------------------------------------}
PROCEDURE RSW(B:BYTE);
BEGIN
REPEAT UNTIL PORT[RSPORT+LSR]AND $20<>0;PORT[RSPORT+THR]:=B;
END;
{--------------------------------------------}
FUNCTION RSR:BYTE;
BEGIN
REPEAT UNTIL MINX1<>MINX2; INC(MINX1);RSR:=MIN[MINX1];
END;
{--------------------------------------------}
FUNCTION RSRX:BOOLEAN;
BEGIN IF MINX1<>MINX2 THEN RSRX:=TRUE ELSE RSRX:=FALSE;END;
{--------------------------------------------}
PROCEDURE PC(C:CHAR);
BEGIN RSW(BYTE(C));END;
FUNCTION GC:CHAR;
BEGIN GC:=CHAR(RSR);END;
{--------------------------------------------}
PROCEDURE DELAY18(B:BYTE);
VAR I:BYTE;L:LONGINT;
L1:LONGINT ABSOLUTE $40:$6C;
BEGIN
FOR I:=0 TO B DO BEGIN L:=L1;REPEAT UNTIL L<>L1;END;
END;
{--------------------------------------------}
BEGIN
MINX1:=0;MINX2:=0;
END.