• <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无码久久精品狠狠爱浪潮| 久久婷婷五月综合97色直播| 中文字幕无码免费久久| 久久精品国产乱子伦| 97久久超碰国产精品旧版| 久久精品国产99久久丝袜| 久久无码专区国产精品发布| 国产精品一久久香蕉国产线看 | 激情伊人五月天久久综合| 狠狠色丁香久久综合五月| 欧洲性大片xxxxx久久久| 人妻精品久久久久中文字幕69| 国产精品九九久久精品女同亚洲欧美日韩综合区| 精品人妻伦九区久久AAA片69| 色综合久久久久综合体桃花网| 久久九九免费高清视频 | 99久久精品国产一区二区三区 | 久久夜色tv网站| 伊人久久综合无码成人网| 久久高潮一级毛片免费| 韩国三级大全久久网站| 超级97碰碰碰碰久久久久最新| 伊人久久精品线影院| 亚洲精品乱码久久久久久中文字幕 | 久久久精品久久久久久| av午夜福利一片免费看久久| 久久频这里精品99香蕉久| 一本大道久久a久久精品综合| 三上悠亚久久精品| 国内高清久久久久久| 久久这里有精品视频| 国产69精品久久久久9999| 久久线看观看精品香蕉国产| 久久国产色AV免费观看| 日韩av无码久久精品免费| 久久丫忘忧草产品| 欧美精品乱码99久久蜜桃| 少妇久久久久久被弄到高潮| 精品久久久久中文字幕一区| 99久久精品国产综合一区| 久久香蕉综合色一综合色88|