卡提諾王國's Archiver

Andy95 發表於 2009-5-1 11:54

(C)我已經寫好連結電腦,誰可以教我寫rs-232讀資料跟送資料

[i=s] 本帖最後由 風箏惡魔 於 2009-5-2 11:20 編輯 [/i]

這是關於ip-link 1220 晶片是8051,
我目前就寫到這樣可以連結,但是不知道怎麼讀和送資料

請各位前輩幫幫忙,幫我看一下,我用的是C>"<

#include <stdio.h>
#include <stdlib.h>

#define ControlHeader 0
#define LinkQualityIndicator 1
#define DestinationAddress 2
#define PayloadLength 4
#define Payload 5
int Checksum;

FILE *ZigBee;

unsigned char sBuf[104], rBuf[104];

const unsigned char CRequest = 128;
const unsigned char CResponse = 192;
const unsigned char DRequest = 160;
const unsigned char DResponse = 224;

int ZigBeeInit(int comNum, int channel, int isClient, unsigned short netNodeID, unsigned short netID)
{
    char sCOM[5] = "COM3";
    char *master = "master", *client = "client";
    char *nodeType;
    unsigned char xorSum;
    int sequence, i, n;
    sCOM[3] = comNum + '0'; sCOM[4] = 0;
    if((ZigBee = fopen(sCOM, "r+")) == NULL){
               fprintf(stderr, "Can't open %s !\n", sCOM);
               exit(1);
    }
    sequence = 1;
    sBuf[ControlHeader] = CRequest + sequence%16;
    sBuf[LinkQualityIndicator] = 0;
    sBuf[DestinationAddress] = 0x00;
    sBuf[DestinationAddress+1] = 0x00;
    sBuf[PayloadLength] = 0x03;
    sBuf[Payload] = 0x8f;
    //sBuf[Payload+1] = 0x70;
    //sBuf[Payload+2] = 0;
    Checksum = Payload + PayloadLength;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    if(rBuf[Payload+1] == 0){
                       fprintf(stdout,"ZigBee sending power is set to max!\n");
    }
    sBuf[Payload+1] = 0x72;
    sBuf[Payload+2] = (unsigned char) channel;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    if(rBuf[Payload+1] == 0){
                       fprintf(stdout,"ZigBee RF channel is set to %d!\n", channel);
    }
    sBuf[Payload+1] = 0x96;
    sBuf[Payload+2] = (unsigned char) (isClient==0)?0:1;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    if(rBuf[Payload+1] == 0){
                       nodeType = (isClient==0)?master:client;
                       fprintf(stdout,"ZigBee is set to %s!\n", nodeType);
    }
    sBuf[Payload+1] = 0x99;
    sBuf[Payload+2] = (unsigned char) 1;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0x9A;
    sBuf[Payload+2] = (unsigned char) 1;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0x9e;
    sBuf[Payload+2] = (unsigned char) 0;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0x9f;
    sBuf[Payload+2] = (unsigned char) 0xff;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xa0;
    sBuf[Payload+2] = (unsigned char) 0x62;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xb4;
    sBuf[Payload+2] = (unsigned char) 1;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xb5;
    sBuf[Payload+2] = (unsigned char) 1;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xb7;
    sBuf[Payload+2] = (unsigned char) 0;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xbc;
    sBuf[Payload+2] = (unsigned char) netNodeID >> 8;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xbd;
    sBuf[Payload+2] = (unsigned char) (netNodeID << 8)>> 8;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xbe;
    sBuf[Payload+2] = (unsigned char) netID >> 8;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xbf;
    sBuf[Payload+2] = (unsigned char) (netID << 8)>> 8;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xc0;
    sBuf[Payload+2] = (unsigned char) netNodeID >> 8;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }
    sBuf[Payload+1] = 0xc1;
    sBuf[Payload+2] = (unsigned char) (netNodeID << 8)>> 8;
    for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
    sBuf[Checksum] = xorSum;
    if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
          fprintf(stderr, "Can't write to Zigbee\n");
          exit(2);
    }
    if((n = fread(rBuf, 104, 104, ZigBee))==0){
          fprintf(stderr, "Can't read from ZigBee!");
          exit(3);
    }  
}

//接收資料
void accecpter() {
     int n, i;
     while((n = fread(rBuf,104,104,ZigBee))==0);
     for(i=0;i<104;i++)fprintf(stdout,"%2x\t",rBuf[i]);fprintf(stdout,"\n");

}   
int main(int argc, char *argv[])
{
  ZigBeeInit(4,1,1,1,1);
    system("PAUSE");       
  return 0;
}

iautsi 發表於 2009-5-3 20:41

大大的用法比較偏向純C
不知道大大有沒有試用過
CreateFile的方式來開啟COM port呢
記得CreateFile之後只要對COM port
使用FileRead及FileWrite就可以讀寫了
剩下的就是事件流程的控制

Andy95 發表於 2009-5-4 13:44

[i=s] 本帖最後由 Andy95 於 2009-5-4 13:48 編輯 [/i]

Send Data
int seqNo = 0;

int sendTo(FILE *ZigBee, unsigned short NodeID, char *theData)
{
    int i, retCode;
   
    sBuf[ControlHeader] = 0xA0+(seqNo++)%16;
    sBuf[LQI] = 0xFF;
    sBuf[DestinationAddress] = NodeID>>8; sBuf[DestinationAddress+1] = NodeID%0x10000;
    for(i=0; i<=97; i++) if(theData[i] == 0) break;
    sBuf[PayloadLength] = i;
    for(i=0; i<=sBuf[PayloadLength]-1; i++)sBuf[Payload+i] = theData[i];
    int XORChecksum = 0;
    for(i=0; i<sBuf[sBuf[PayloadLength]]; i++) XORChecksum ^= sBuf[i];
    sBuf[sBuf[PayloadLength]+5] = XORChecksum;
   
    (sBuf, 1, sBuf[PayloadLength]+5, ZigBee);
    if(fread(rBuf,1,8,ZigBee) == 0){
                                   fprintf(stderr, "read from zigbee error!\n");
                                   exit(1);
    }
    return (retCode = rBuf[5]*(2<<8) + rBuf[6]);
}
==================================================
Received Data
char* receive(FILE *ZigBee, char *theData)
{
         
     int n, i;
     while((n = fread(theData,1,104,ZigBee))==0);
     for(i=0;i<104;i++)fprintf(stdout,"%2x\t",*(theData+i));fprintf(stdout,"\n");
     return theData;
     
}   
....
......
int main(int argc, char *argv[])
{
    char theData[200];
    ZigBeeInit(5,0,1,atoi(argv[1]),1);
   送端送資料~~
    if(sendTo(ZigBee, 0xffff, "12345") == 0){
                      fprintf(stdout, "I have sent it\n");
                      }
                     
=========   
   收端收資料~~   
    fprintf(stdout, "Now ready to receive!\n");        
    if(theData == receive(ZigBee, theData)){
               fprintf(stdout, "I have receice!\n");
    }   
      
  system("PAUSE");       
  return 0;
}         

各位大大~我寫這樣有錯嗎?
為什麼還是收不到資料>"<   
我是用IP-LINK1220 zigbee~無線傳輸資料

jack007352 發表於 2009-8-12 23:50

這個部分我是建議你先做硬體上的測試看看是否正常
你可以先使用超級終端機測試看看硬體是否正確
再考慮程式碼的問題

cmdunlop 發表於 2009-10-7 14:50

[i=s] 本帖最後由 cmdunlop 於 2009-10-7 14:52 編輯 [/i]

[table][tr][td][list=1][*]//8051[*]#include <reg52.h>
#include <string.h>
#include <intrins.h>[*]#define uchar unsigned char
#define uint unsigned int[*][*]void serial_init()
{
/* 9600,n,8,1,外部晶振11.0592MHz,查詢模式 */[*] TMOD = 0x20;    // 定時器T1使用工作模式2
TH1 = 250;
TL1 = 250;
TR1 = 1;     // 開始計時
PCON = 0x80;    // SMOD = 1
SCON = 0x50;    // 工作模式1,波特率9600kbit/s,允許接收
}[*][*] void sendByte()
{
      
  TI = 0;      // 清發送標誌位
  while(!TI);     // 等待發送完成
}[*][*]void main()
{[*]uchar *tmp = 0;[*]
  serial_init() ;
        //ADCRD = 1 ;
    EX0 = 1;  // 打開外部中斷0[*][*] RI = 0;
              while(!RI);
              *tmp = SBUF;[*]
  while(1);
}[*][*]
[color=#0099cc]複製代碼[/color][/list]
[/td][/tr][/table]




以上是8051對RS232寫法
while(!RI);就是在讀取
*tmp = SBUF;讀取完成後寫入SBUF

以上是不完善的程式碼
但是也可以應付你所需要的
內容有些Bug
請自行處理

靠仔細看妳應該是電腦端的程式並非是8051的程式
抱歉~沒注意到~

dml5319 發表於 2009-10-12 00:16

這是十幾年前的程式了,8051(Single chip)那頭你要設好速率(本例是 9600),
有問題建議你用示波器(單一觸發)勾勾看是哪一頭出問題.

#include        <stdio.h>
#include        <dos.h>
#include        "ibmcom.h"
#include        "parament.h"

#define     IER         1              /* Interrupt enable register */
#define     IIR         2              /* Interrupt ID register */
#define     LCR         3              /* Line control register */
#define     MCR         4              /* Modem control register */
#define     LSR         5              /* Line status register */
#define     MSR         6              /* Modem status register */

#define     DTR         0x01           /* Data terminal ready */
#define     RTS         0x02           /* Request to send */
#define     OUT1        0x04           /* Output #1 */
#define     OUT2        0x08           /* Output #2 */

#define     DCTS        0x01           /* Delta clear to send */
#define     DDSR        0x02           /* Delta data set ready */
#define     TERI        0x04           /* Trailing edge ring indicator */
#define     DRLSD       0x08           /* Delta Rx line signal detect */
#define     CTS         0x10           /* Clear to send */
#define     DSR         0x20           /* Data set ready */
#define     RI          0x40           /* Ring indicator */
#define     RLSD        0x80           /* Receive line signal detect */

#define     DATA        0x03           /* 8 bits Data */

#define     STOP        0x00           /* 1 Stop bit */

#define     PARI        0x00           /* No parity */

#define     RDR         0x01           /* Receive data ready */
#define     ERRS        0x1E           /* All the error bits */

#define     DR          0x01           /* Data ready */
#define     RLS         0x04           /* Receive line status */
#define     TXR         0x20
#define     THRE        0x02

#define     MAX_PORT    4
#define     TRUE        1
#define     FALSE       0
#define     PORT        2
#define     SPEED       9600
#define  RX_QUEUE_SIZE  2048           /* Receive queue size. Change to suit */
#define  TX_QUEUE_SIZE  90             /* Receive queue size. Change to suit */

int         uart_data;                 /* Data register */
int         uart_ier;                  /* Interrupt enable register */
int         uart_iir;                  /* Interrupt identification register */
int         uart_lcr;                  /* Line control register */
int         uart_mcr;                  /* Modem control register */
int         uart_lsr;                  /* Line status register */
int         uart_msr;                  /* Modem status register */

char        com_installed;             /* Flag: Communications routines installed */
int         intnum;                    /* Interrupt vector number for chosen port */
char        i8259bit;                  /* 8259 bit mask */
char        old_i8259_mask;            /* Copy as it was when we were called */
char        old_ier;                   /* Modem register contents saved for */
char        old_mcr;                   /* Restoring when we're done */
void        interrupt (*old_vector)(); /* Place to save COM1 vector */

unsigned char tx_queue[90];
int           tx_out,tx_in;            /* Index of where to store next character */
int           tx_chars;                /* Count of characters in queue */
extern unsigned char rx_queue[QUEUE];
extern int   rx_in;                    /* Index of where to store next character */
extern int   rx_chars;                 /* Count of characters in queue */

const int   uart_base[MAX_PORT] =   { 0x3F8, 0x2F8, 0x3E8, 0x2E8 };
const char  intnums[MAX_PORT] =     { 0x0C,  0x0B,  0x0C,  0x0B };
const char  i8259levels[MAX_PORT] = { 4,     3,     4,     3 };
extern long DATASTATUS;
void        com_flush_rx(void);
int         com_install(int portnum);
void        set_speed(long speed);
void        com_deinstall(void);
void        com_set_parity(enum par_code parity, int stop_bits);


void interrupt com_interrupt_driver()
   {
    char        iir;                   /* Local copy if IIR */
    extern long DATASTATUS;
    extern char TIMECOUNT;

    while (!((iir = inportb(uart_iir)) & 1))    /* While there is an int ... */
       {
        disable();
        switch (iir)                            /* Branch on interrupt type */
           {
            case 0:                             /* Modem status interrupt */
                inportb(uart_msr);              /* clear the interrupt */
                break;
             case 2:                            /* Transmit register empty */
                outportb(uart_ier,              /*  off transmit interrupts */
                         inportb(uart_ier) & ~2);
                break;
            case 4:                             /* Received data interrupt */
                rx_queue[rx_in] = inportb(uart_data);  /* Grab received character */
                if (rx_queue[rx_in] == 126)
                   DATASTATUS++;
                TIMECOUNT=(TIMECOUNT | 0x02);
                rx_chars++;
                rx_in++;
                if (rx_in>=QUEUE)
                   rx_in=rx_chars=0;            /* rx_chars=0; */
                break;
            case 6:                             /* Line status interrupt */
                inportb(uart_lsr);              /* Just clear the interrupt */
           }                                    /* End switch */
       }                                        /* End 'is an interrupt' */
     outportb(0x20,0x20);                      /* Send EOI to 8259 */
     enable();
    }                                           /* End com_interrupt_driver() */


int com_install(int portnum)
   {
    if (com_installed)                          /* Drivers already installed */
        return 3;
    if ((portnum < 1) || (portnum > MAX_PORT))  /* Port number out of bounds */
        return 1;
    uart_data = uart_base[portnum-1];           /* Set UART I/O addresses */
    uart_ier  = uart_data + IER;                /*  for the selected comm */
    uart_iir  = uart_data + IIR;                /*  port */
    uart_lcr  = uart_data + LCR;
    uart_mcr  = uart_data + MCR;
    uart_lsr  = uart_data + LSR;
    uart_msr  = uart_data + MSR;
    intnum    = intnums[portnum-1];             /* Ditto for interrupt */
    i8259bit  = 1 << i8259levels[portnum-1];    /*  vector and 8259 bit mask */
    old_ier = inportb(uart_ier);                /* Return an error if we */
    outportb(uart_ier, 0);                      /*  can't access the UART */
    if (inportb(uart_ier) != 0)
        return 2;
    disable();                                  /* Save the original 8259 */
    old_i8259_mask = inportb(0x21);             /*  mask, then disable the */
    outportb(0x21, old_i8259_mask | i8259bit);  /*  8259 for this interrupt */
    enable();
    com_flush_rx();
    old_vector = getvect(intnum);               /* Save old COMM vector, */
    setvect(intnum, &com_interrupt_driver);     /*  then install a new one, */
    com_installed = TRUE;                       /*  and note that we did */
    outportb(uart_lcr, 0x03);                   /* 8 data, no parity, 1 stop */
    disable();                                  /* Save MCR, then enable */
    old_mcr = inportb(uart_mcr);                /*  interrupts onto the bus, */
    outportb(uart_mcr,                          /*  activate RTS and leave */
             (old_mcr & DTR) | (OUT2 + RTS));   /*  DTR the way it was */
    enable();
    outportb(uart_ier, DR);                     /* Enable receive interrupts */
    disable();                                  /* Now enable the 8259 for */
    outportb(0x21, inportb(0x21) & ~i8259bit);  /*  this interrupt */
    enable();
    return 0;                                   /* Successful installation */
   }                                            /* End com_install() */


void com_deinstall(void)
   {

    if (com_installed)
       {                                        /* Don't de-install twice! */
        outportb(uart_mcr, old_mcr);            /* Restore the UART */
        outportb(uart_ier, old_ier);            /*  registers ... */
        disable();
        outportb(0x21,                          /*  ... the 8259 interrupt */
                 (inportb(0x21)  & ~i8259bit) | /*  mask ... */
                 (old_i8259_mask &  i8259bit));
        enable();
        setvect(intnum, old_vector);            /*  ... and the comm */
        com_installed = FALSE;                  /*  interrupt vector */
       }                                        /* End com_installed */
   }                                            /* End com_deinstall() */


void set_speed(long speed)
   {
    unsigned    divisor;                        /* A local temp */

    if (com_installed)
       {
        if (speed < 2) speed = 2;               /* Force proper input */
        divisor = 115200L / speed;              /* Recond baud rate divisor */
        disable();                              /* Interrupts off */
        outportb(uart_lcr,                      /* Set up to load baud rate */
                 inportb(uart_lcr) | 0x80);     /*  divisor into UART */
        outport(uart_data, divisor);            /* Do so */
        outportb(uart_lcr,                      /* Back to normal UART ops */
                 inportb(uart_lcr) & ~0x80);
        enable();                               /* Interrupts back on */
       }                                       /* End "comm installed" */
   }                                           /* End com_set_speed() */



const char      lcr_vals[] = {DATA + PARI};

void com_set_parity(enum par_code parity, int stop_bits)
   {

    disable();
    outportb(uart_lcr, lcr_vals[parity] | stop_bits);
    enable();
   }                                               /* End com_set_parity() */


void com_flush_rx(void)
   {
    disable();
    rx_chars = rx_in = 0;
    enable();
   }


void ract()
   {
    int   herb;

    clrscr();
    if ((herb = com_install(PORT))!= 0)
      {
       printf ("com_install() error: %d\n",herb);
         exit(1);
      }
    com_flush_rx();
    delay(1);
    set_speed(SPEED);
    delay(50);
   }

頁: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.