• <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 江邊之鳥 閱讀(511) 評論(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久久久无码| 日韩欧美亚洲综合久久| 国产午夜电影久久| 嫩草影院久久99| 国产精品久久永久免费| 97热久久免费频精品99| 99久久人妻无码精品系列 | 久久精品中文字幕大胸| 亚洲精品国精品久久99热| 色老头网站久久网| 精品国产乱码久久久久久呢| 99久久国产宗和精品1上映| 热re99久久精品国99热| 久久国产精品无码HDAV| 久久久青草久久久青草| 久久久久无码精品| 久久精品国产99国产精品亚洲| 亚洲熟妇无码另类久久久| 欧美va久久久噜噜噜久久| 日产精品99久久久久久| 亚洲国产二区三区久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久精品国产清自在天天线| 天天综合久久一二三区| 天天躁日日躁狠狠久久| 99久久精品免费观看国产| 超级碰碰碰碰97久久久久| 久久婷婷五月综合色高清| 久久国产精品一区| 亚洲va中文字幕无码久久| 97久久精品人人做人人爽| 精品国产日韩久久亚洲| 久久AV高清无码| 亚洲国产成人久久综合一区77| 久久精品www人人爽人人| 久久无码一区二区三区少妇| 久久精品国产亚洲AV无码麻豆| 日产久久强奸免费的看| 久久国产精品成人免费| 久久久久久国产精品无码下载|