Just nu i M3-nätverket
Gå till innehåll

Få tillgång till en ny serieport i msdos?


Roland Bengtsson

Rekommendera Poster

Roland Bengtsson

Jag har köpt ett snabbt io-kort för serieporten med ett 16950 UART. Jag har kört ett testprogram i msdos som visar IO-address 0xD800 och IRQ 10. Det är också samma som windows visar för kortet.

 

Men nu vill jag komma åt kortet från mitt eget program utan att windows är igång. Här är ett första försök att göra detta. Jag har kört samma program på COM1 (med andra adresser förstås) och det fungerar bra. Problemet är att IRQ 10 ligger på en annan adress och irq-controller men det är så jag tror det fungerar iaf.

#include <dos.h>
#include <stdio.h>
#include <conio.h>

#define PORT1 0xD800  /* Port Address Goes Here */
#define INTVECT 0x72 /* Com Port's IRQ here (Must also change PIC setting)
*/
#define PIC 0xA1

char vec[4];  /* For debugging */
int index=0;

int bufferin = 0;
int bufferout = 0;
char ch;
char buffer[1025];
char test=0;

void interrupt (*oldport1isr)();

void interrupt PORT1INT()  /* Interrupt Service Routine (ISR) for PORT1 */
{
  int c;

  do
  {
    c = inportb(PORT1 + 5);
    test++;

    vec[index++] = inportb(PORT1+2) & 6;

    if (c & 1)
    {
      buffer[bufferin] = inportb(PORT1);
      bufferin++;

      if (bufferin == 1024)
        bufferin = 0;
    }
  }while (c & 1);
  
  outportb(0x20,0x20);
  outportb(0xA0,0x20);
}

void main(void)
{
  int c;

  outportb(PORT1 + 1 , 0);        /* Turn off interrupts - Port1 */

  oldport1isr = getvect(INTVECT); /* Save old Interrupt Vector of later
        recovery */

  setvect(INTVECT, PORT1INT);     /* Set Interrupt Vector Entry */
                                  /* PORT 1 - Communication Settings         */

  outportb(PORT1 + 3 , 0x80);     /* SET DLAB ON */
  outportb(PORT1 + 0 , 0x0C);     /* Set Baud rate - Divisor Latch Low Byte */
                                  /* 0x0C =   9,600 BPS */
  outportb(PORT1 + 1 , 0x00);     /* Set Baud rate - Divisor Latch High Byte */
  outportb(PORT1 + 3 , 0x03);     /* 8 Bits, No Parity, 1 Stop Bit */
  outportb(PORT1 + 2 , 0xC7);     /* FIFO Control Register */
  outportb(PORT1 + 4 , 0x0B);     /* Turn on DTR, RTS, and OUT2 */

  outportb(PIC,(inportb(PIC) & 0xFB));  /* Set Programmable Interrupt
                                     Controller to IRQ 10*/

  outportb(PORT1 + 1 , 0x01);     /* Interrupt when data received */

  printf("\nSample Comm's Program. Press ESC to quit \n");

  do
  {
    printf("\rtest - %X, 0 - %X, 1 - %X, 2 - %X, 3 - %Xx",
      test,(unsigned char)vec[0], (unsigned char)vec[1], (unsigned char)vec[2],
      (unsigned char)vec[3]);
    
    if(index == 4)
      index = 0;
    
    if (bufferin != bufferout)
    {
      ch = buffer[bufferout];
      bufferout++;
      
      if (bufferout == 1024)
        bufferout = 0;
      
      printf("  %X",(unsigned char)ch);
    }
    
    if (kbhit())
    {
      c = getch();
      outportb(PORT1, c);
      putchar(c);
    }
  }while (c !=27);

  outportb(PORT1 + 1 , 0);              /* Turn off interrupts - Port1 */
  outportb(PIC,(inportb(PIC) | 0x04));  /* MASK IRQ using PIC */
  setvect(INTVECT, oldport1isr);        /* Restore old interrupt vector */
}
Jag behöver verkligen få igång det här så det vore snällt med hjälp från någon!

 

Mvh Roland

 

 

[inlägget ändrat 2002-11-26 09:23:32 av Roland Bengtsson]

Länk till kommentar
Dela på andra webbplatser

En dum(?) fråga, är du säker på att det fungerar ifrån enbart DOS ?

Jag köpte ett extra serieportskort, det stod att det skulle fungera i DOS, men det krävdes att windows var igång.

 

Jag menar att du kanske bara körde ifrån en kommandoprompt i från windows ?

 

Sen undrar jag lite över den här

#define INTVECT 0x72 /* Com Port's IRQ here (Must also change PIC setting)

IRQ 10 ?

 

/TN

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...