• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            開源之路

            憶往昔, 項羽不過江. 江東好風光! 今振臂一呼,率甲三千, 試問天!
            posts - 86, comments - 55, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            TC中的串口編程

            Posted on 2006-07-18 13:03 江邊之鳥 閱讀(508) 評論(0)  編輯 收藏 引用
            作者:未知 來源:未知 加入時間:2004-7-20 天新軟件園
            /*==========================*/
            /*本程序由sunny編寫,如有傳載*/
            /*請注明http://sunny1979.icpcn.com */
            /*或者http://tchome.icpcn.com??*/
            #include <dos.h>
            #include <bios.h>
            #include <stdio.h>
            #include <math.h>
            #include <conio.h>
            #include <graphics.h>
            #ifdef __cplusplus
            ????#define __CPPARGS ...
            #else
            ????#define __CPPARGS
            #endif
            #define SER_RBF????????0???
            #define SER_THR????????0???
            #define SER_IER????????1????
            #define SER_IIR????????2????
            #define SER_LCR????????3???
            #define SER_MCR????????4????
            #define SER_LSR????????5????
            #define SER_MSR????????6????
            #define SER_DLL????????0????
            #define SER_DLH????????1????

            #define SER_BAUD_1200??96???
            #define SER_BAUD_2400??48
            #define SER_BAUD_9600??12
            #define SER_BAUD_19200??6
            #define SER_GP02????????8?????
            #define COM_1???????????0x3F8
            #define COM_2???????????0x2F8 /*/ base port address of port 1*/
            #define SER_STOP_1??????0?????/*/ 1 stop bit per character*/
            #define SER_STOP_2??????4?????/*/ 2 stop bits per character*/
            #define SER_BITS_5??????0?????/*/ send 5 bit characters*/
            #define SER_BITS_6??????1?????/*/ send 6 bit characters*/
            #define SER_BITS_7??????2?????/*/ send 7 bit characters*/
            #define SER_BITS_8??????3?????/*/ send 8 bit characters*/
            #define SER_PARITY_NONE 0?????/*/ no parity*/
            #define SER_PARITY_ODD??8?????/*/ odd parity*/
            #define SER_PARITY_EVEN 24????/*/ even parity*/
            #define SER_DIV_LATCH_ON 128??/*/ used to turn reg 0,1 into divisor latch*/
            #define PIC_IMR????0x21???/*/ pic's interrupt mask reg.*/
            #define PIC_ICR????0x20???/*/ pic's interupt control reg.*/
            #define INT_SER_PORT_0????0x0C??/*/ port 0 interrupt com 1 & 3*/
            #define INT_SER_PORT_1????0x0B??/*/ port 0 interrupt com 2 & 4*/
            #define SERIAL_BUFF_SIZE 128????/*/ current size of circulating receive buffer*/

            void interrupt far (*Old_Isr)(__CPPARGS);??/*/ holds old com port interrupt handler*/

            char ser_buffer[SERIAL_BUFF_SIZE];??/*/ the receive buffer*/

            int ser_end = -1,ser_start=-1;??????/*/ indexes into receive buffer*/
            int ser_ch, char_ready=0;???????????/*/ current character and ready flag*/
            int old_int_mask;???????????????????/*/ the old interrupt mask on the PIC*/
            int open_port;??????????????????????/*/ the currently open port*/
            int serial_lock = 0;????????????????/*/ serial ISR semaphore so the buffer*/
            ????????/*/ isn't altered will it is being written*/
            ????????????????????????????????????/*/ to by the ISR*/


            /*-------------寫串口-----------------*/??
            void interrupt far Serial_Isr(__CPPARGS)
            {
            serial_lock = 1;
            ser_ch = inp(open_port + SER_RBF);
            if (++ser_end > SERIAL_BUFF_SIZE-1)
            ????ser_end = 0;
            ser_buffer[ser_end] = ser_ch;

            ++char_ready;
            outp(PIC_ICR,0x20);
            serial_lock = 0;

            }


            int Ready_Serial()
            {
            return(char_ready);

            }

            /*--------------讀串口--------------*/

            int Serial_Read()
            {
            int ch;
            while(serial_lock){}
            if (ser_end != ser_start)
            ???{
            ???if (++ser_start > SERIAL_BUFF_SIZE-1)
            ???????ser_start = 0;
            ???ch = ser_buffer[ser_start];
            ??if (char_ready > 0)
            ???????--char_ready;
            ???return(ch);

            ???}
            else
            ???return(0);

            }

            /*--------------寫串口-----------------*/
            Serial_Write(char ch)
            {
            while(!(inp(open_port + SER_LSR) & 0x20)){}
            asm cli
            outp(open_port + SER_THR, ch);
            asm sti
            }

            /*-----------初始化串口---------------*/
            Open_Serial(int port_base, int baud, int configuration)
            {
            open_port = port_base;
            outp(port_base + SER_LCR, SER_DIV_LATCH_ON);
            outp(port_base + SER_DLL, baud);
            outp(port_base + SER_DLH, 0);
            outp(port_base + SER_LCR, configuration);
            outp(port_base + SER_MCR, SER_GP02);
            outp(port_base + SER_IER, 1);
            if (port_base == COM_1)
            ???{
            ???Old_Isr = _dos_getvect(INT_SER_PORT_0);
            ???_dos_setvect(INT_SER_PORT_0, Serial_Isr);
            ???printf("\nOpening Communications Channel Com Port #1...\n");

            ???}
            else
            ???{
            ???Old_Isr = _dos_getvect(INT_SER_PORT_1);
            ???_dos_setvect(INT_SER_PORT_1, Serial_Isr);
            ???printf("\nOpening Communications Channel Com Port #2...\n");
            ???}
            old_int_mask = inp(PIC_IMR);
            outp(PIC_IMR, (port_base==COM_1) ? (old_int_mask & 0xEF) : (old_int_mask & 0xF7 ));
            }
            /*-------------關閉串口--------------*/
            Close_Serial(int port_base)
            {
            outp(port_base + SER_MCR, 0);
            outp(port_base + SER_IER, 0);
            outp(PIC_IMR, old_int_mask );
            if (port_base == COM_1)
            ???{
            ???_dos_setvect(INT_SER_PORT_0, Old_Isr);
            ???printf("\nClosing Communications Channel Com Port #1.\n");
            ???}
            else
            ???{
            ???_dos_setvect(INT_SER_PORT_1, Old_Isr);
            ???printf("\nClosing Communications Channel Com Port #2.\n");
            ???}

            }

            /*-------------發送應用----------------*/

            void main(int argc,char *argv[])
            {

            char ch,press;
            int done=0;
            FILE *fp;
            argc=2;
            argv[1]="test.cpp";
            if(argc<2)
            {
            ??printf("\nUsage:display filename.wav!!!");
            ??exit(0);
            }
            if((fp=fopen(argv[1],"r+b"))==NULL)
            {
            ??printf("cannot open the file\n");
            ??exit(0);
            }
            fseek(fp, 0, SEEK_SET);
            Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_NONE | SER_BITS_8 | SER_STOP_1);
            printf("press any key to begin sending");
            getch();
            Serial_Write(' ');
            while(!done&&ch != EOF)
            ?????{
            ch = fgetc(fp);
            if(ch==EOF) Serial_Write(27);
            Serial_Write(ch);
            if (kbhit())
            {
            ??press=getch();
            ??if (press==27)
            ??{
            ???Serial_Write(27);
            ???done=1;
            ??}
            }
            ?????}??
            Close_Serial(COM_1);
            fclose(fp);
            }
            亚洲综合日韩久久成人AV| 久久精品国产清自在天天线| 久久亚洲国产精品成人AV秋霞| 一本色道久久88综合日韩精品 | 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲AV无码久久精品狠狠爱浪潮| www.久久热.com| 色综合久久夜色精品国产| 大伊人青草狠狠久久| 国产精品一区二区久久精品涩爱 | 亚洲国产成人久久综合一区77| 狠狠色丁香婷婷久久综合五月| 国产国产成人精品久久| 三级三级久久三级久久| 国产精品免费看久久久香蕉| 中文字幕日本人妻久久久免费| 中文字幕成人精品久久不卡| 久久亚洲中文字幕精品一区| 久久久久国色AV免费看图片| 久久精品成人免费看| 99久久这里只精品国产免费| 国产日韩久久久精品影院首页| 久久久久久毛片免费播放| 久久久久久国产a免费观看黄色大片 | 国产亚洲精品美女久久久| 一本一道久久a久久精品综合| 亚洲狠狠久久综合一区77777| 久久精品国产亚洲AV蜜臀色欲| 日本加勒比久久精品| 91亚洲国产成人久久精品网址| 国产成人无码久久久精品一| 99精品国产综合久久久久五月天| 久久无码中文字幕东京热| 一级a性色生活片久久无少妇一级婬片免费放 | 久久精品国产亚洲77777| 香蕉久久夜色精品国产尤物| 性高湖久久久久久久久AAAAA| 伊人久久大香线蕉成人| 伊人 久久 精品| 亚洲午夜久久久影院| 久久精品亚洲一区二区三区浴池 |