Mail Archives: djgpp/2000/05/17/17:40:47
From: | "Alexei A. Frounze" <alex DOT fru AT mtu-net DOT ru>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Re: com1 programming .... a lot of question
|
Date: | Wed, 17 May 2000 21:47:53 +0400
|
Organization: | MTU-Intel ISP
|
Lines: | 292
|
Message-ID: | <3922DB49.69774632@mtu-net.ru>
|
References: | <8fudhg$jnb$1 AT nets3 DOT rz DOT RWTH-Aachen DOT DE>
|
NNTP-Posting-Host: | ppp104-101.dialup.mtu-net.ru
|
Mime-Version: | 1.0
|
X-Trace: | gavrilo.mtu.ru 958589773 62734 212.188.104.101 (17 May 2000 18:56:13 GMT)
|
X-Complaints-To: | usenet-abuse AT mtu DOT ru
|
NNTP-Posting-Date: | 17 May 2000 18:56:13 GMT
|
X-Mailer: | Mozilla 4.72 [en] (Win95; I)
|
X-Accept-Language: | ru,en
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
This is a multi-part message in MIME format.
--------------DBD5F7550924A76260A1B9C7
Content-Type: text/plain; charset=koi8-r
Content-Transfer-Encoding: 7bit
Try this one.
Good Luck
Alexei A. Frounze
-----------------------------------------
Homepage: http://alexfru.chat.ru
Mirror: http://members.xoom.com/alexfru
Florent wrote:
>
> Hi,
> I'm trying to send datas in the com1 to a controller in order to pilot a
> machine.
>
> I have some questions about the functions _bios_serialcom.
>
> I use : state= _bios_serialcom(_COM_STATUS,0,byte);
>
> then I want to test byte with all the values in order to get the settings of
> the COM1, I do :
>
> if ((byte&_COM_9600)==_COM_9600) printf ("9600 bauds);
>
> But I have problems because when I init the com1 at 9600bauds (with
> _COM_INIT) and then I test the status of the com1, the settings are not 9600
> bauds, it's always 110bauds !
>
> Do I test it in the wrong way or ..... ???
>
> For _COM_INIT I do :
>
> state=_bios_serialcom(_COM_INIT,0,_COM_9600 | _COM_CHR8 | _COM_STOP1 |
> _COM_NOPARITY);
>
> There is something strange also, I test the constante _COM_STOP1, _COM_STOP2
> and _COM_EVENPARITY and there are egal to 0 !!!! Hwo can I know if my
> settings is one stop bit or 2 if both constante egal to 0 !!
>
> In order to know the value of all constant of _bios_serialcom I have done :
>
> printf("%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x|%#x",_COM_CH
> R7,_COM_CHR8,_COM_STOP1,_COM_NOPARITY,
> _COM_ODDPARITY,_COM_EVENPARITY,_COM_110,_COM_150,
> _COM_300,_COM_600,_COM_1200,_COM_2400,_COM_4800,_COM_9600);
>
> thank you for your help ...
>
> Florent.
--------------DBD5F7550924A76260A1B9C7
Content-Type: text/plain; charset=koi8-r;
name="SER_CHAT.TXT"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="SER_CHAT.TXT"
///////////////////////////////////////////////////////
// Serial Chat program by Alexei A. Frounze (c) 2000 //
// //
// Compiler: Borland C or DJGPP //
// //
// E-Mail : alexfru AT chat DOT ru //
// Homepage: http://alexfru.chat.ru //
// Mirror : http://members.xoom.com/alexfru //
///////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#ifdef DJGPP
#include <sys/movedata.h>
#endif
// Baud rates //
#define B_110 1040
#define B_150 768
#define B_300 384
#define B_600 192
#define B_1200 96
#define B_2400 48
#define B_4800 24
#define B_9600 12
#define B_19200 6
#define B_38400 3
#define B_57600 2
#define B_115200 1
// Size of character //
#define BITS_5 0
#define BITS_6 1
#define BITS_7 2
#define BITS_8 3
// Number of stop bits //
#define STOPS_1 0
#define STOPS_2 4
// Parity type //
#define PARITY_NO 0
#define PARITY_EVEN 0x18
#define PARITY_ODD 8
// Registers //
#define IO_REG 0
#define LO_DIV 0
#define HI_DIV 1
#define INT_REG 1
#define INT_ID 2
#define CONTROL 3
#define MODEM 4
#define STATUS 5
#define MSTATUS 6
// some extra constants
#define ESC 27
#define CR 13
#define LF 10
// Base addresses of ports //
int base[4]={0,0,0,0};
// Function that finds base addresses of all serial ports //
int find_base_addresses() {
int res=0, i;
short addr;
for (i=0;i<4;i++) {
#ifndef DJGPP
addr = (short) peek (0x40, i*2);
#else
_dosmemgetw (0x400+i*2, 1, &addr);
#endif
base[i] = addr;
if (addr) res++;
}
return res;
}
int OpenCOM (int ComNo, int BaudRate, char Config) {
int b;
if ((ComNo<1) || (ComNo>4)) return 0;
b = base[ComNo-1];
if (!b) return 0;
// Waiting while the previous data is being sent...
while ((inportb(b+STATUS) & 0x60) != 0x60) {};
// Programming the port
outportb (b+CONTROL, 0x80);
outportb (b+HI_DIV, BaudRate >> 8);
outportb (b+LO_DIV, BaudRate & 0xFF);
outportb (b+CONTROL, Config);
outportb (b+MODEM, 0);
outportb (b+INT_REG, 0);
return 1;
}
int CloseCOM (int ComNo) {
int b;
if ((ComNo<1) || (ComNo>4)) return 0;
b = base[ComNo-1];
if (!b) return 0;
outportb (b+INT_REG, 0);
outportb (b+MODEM, 0);
return 1;
}
int SendChar (int ComNo, char value) {
int b;
if ((ComNo<1) || (ComNo>4)) return 0;
b = base[ComNo-1];
if (!b) return 0;
// Waiting while previous character is being sent
while ((inportb(b+STATUS) & 0x20) == 0) {};
// Sending the character
outportb (b, value);
return 1;
}
int ReceiveChar (int ComNo, char *value) {
int b;
if ((ComNo<1) || (ComNo>4)) return 0;
b = base[ComNo-1];
if (!b) return 0;
// If there is no any available character, quit with result of 0
if ((inportb(b+STATUS) & 1) == 0) return 0;
// otherwise we get the character form the port and return result of 1
*value = inportb (b);
return 1;
}
int main() {
int serial_ports, i;
int ComNo;
char c, k;
clrscr();
printf ("Serial Chat program by Alexei A. Frounze (c) 2000\n\n");
printf ("E-Mail : alexfru AT chat DOT ru\n");
printf ("Homepage: http://alexfru.chat.ru\n");
printf ("Mirror : http://members.xoom.com/alexfru\n\n");
serial_ports = find_base_addresses();
printf ("There are %d serial ports available.\n", serial_ports);
if (!serial_ports) return 0;
printf ("\nBase addresses are:\n");
for (i=0;i<4;i++)
if (base[i])
printf (" COM%d ... 0x%X\n", 1+i, base[i]);
printf ("\nPlease choose COM port number: ");
ComNo = getch();
printf ("%c\n", ComNo);
ComNo -= '0';
if ((ComNo < 1) || (ComNo > 4)) {
printf ("Ivalid number.\n");
return 0;
};
if (!base[ComNo-1]) {
printf ("COM%d doesn't exist.\n", ComNo);
return 0;
};
printf ("You've choosen COM%d\n", ComNo);
if (!OpenCOM (ComNo, B_9600, BITS_8+STOPS_1+PARITY_NO)) {
printf ("Couldn't open the port.\n");
return 0;
};
printf ("\nCOM%d port is open. Enjoy the chat. Hit ESC for quit.\n\n", ComNo);
while (ReceiveChar (ComNo, &c)) {}; // skip data from the previos session
do {
if (ReceiveChar (ComNo, &c)) { // if there is a character available...
switch (c) {
case ESC:
printf ("Remote machine disconnected.\n"); // :))
break;
case CR:
printf ("\n"); // move the cursor to the new line
break;
default:
printf ("%c", c); // print the received chracter
}
}
if (kbhit()) {
k = getch();
if (!SendChar (ComNo, k)) {
printf ("Couldn't send a character.\n");
return 0;
};
} else k=0xFF;
} while (k!=ESC); // quit (disconnect :)
CloseCOM (ComNo);
return 0;
}
--------------DBD5F7550924A76260A1B9C7--
- Raw text -