




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一個(gè)c語(yǔ)言的串口通信程序范例(2010-04-02 15:19:47 轉(zhuǎn)載標(biāo)簽: c語(yǔ)言串口通信通信程序it分類: 技術(shù)筆記 最近接觸一個(gè)項(xiàng)目,用HL-C1C激光位移傳感器+易控組態(tài)軟件完成生產(chǎn)線高度跳變檢測(cè),好久沒(méi)有接觸c c#,一些資料,找來(lái)做個(gè)記錄,也許大家用的著#include #include #include #include #define COM232 0x2f8#define COMINT 0x0b#define MaxBufLen 500#define Port8259
2、; 0x20#define EofInt 0x20static int comportaddr;static char intvectnum;static unsigned char maskb;static unsigned char BufferMaxBufLen;static int CharsInBuf,CircIn,CircOut;static void (interrupt far *OldAsyncInt(;static vo
3、id interrupt far AsyncInt(void;void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; C
4、harsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100; f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80; outp(ComPortAddr,Low; outp(ComPortAddr+1,High; Data=(Data-5|(Stop-1*4; if(Parity=2 Data=Data|0x18; else if(Parity=1 Data=Data|0x8;
5、;outp(ComPortAddr+3,Data; outp(ComPortAddr+4,0x0a; outp(ComPortAddr+1,0x01; disable(; OldAsyncInt=getvect( IntVectNum ; setvect( IntVectNum, AsyncInt ; enable(; maskb=inp(Port8259+1; if(IntVectNum=0x0coutp(Port8259+1,maskb&0xef;
6、0;else outp(Port8259+1,maskb&0xf7; static void interrupt far AsyncInt(void disable(; if(CharsInBuf BufferCircIn=inp(comportaddr; if(CircIn else CircIn=0; if(CircIn=CircOut CircOu
7、t+; else CharsInBuf+; enable(; outp(Port8259,EofInt; void Restore(void setvect(intvectnum,OldAsyncInt; outp(Port8259+1,maskb; int GetCharInBuf(unsigned char *Char int Flag; Flag=-1; if(CharsInBuf>0 (*Char=BufferCircOut;
8、; if(CircOut else CircOut=0; CharsInBuf-; Flag=0; return Flag; int SendChar(unsigned char Char if(inp(comportaddr+5&0x20=0 return -1; outp(comportaddr,Char; return 0;main( int i,c; unsigned char InChar; Init
9、_COM(COM232,COMINT,1200,8,1,0; while(1 if(kbhit( if(InChar=getch(=27break; else while(SendChar(InChar; if(GetCharInBuf(&InChar=0 printf("%c&
10、quot;,InChar; Restore(; 接收程序:#include #include #include #include #include #include #define RXD 0 /接收#define TXD 0 /發(fā)送#define LSB 0 /波特率調(diào)節(jié)低8位#define MSB 1 /波特率調(diào)節(jié)高8位#define IER 1 / 中斷起用寄存器#define IIR 2 /中斷標(biāo)識(shí)寄存器#define LCR 3 /線路控制寄存器#define MCR 4 /調(diào)制解調(diào)器控制寄存器#define LSR 5 /線路狀態(tài)寄存器#define MSR 6
11、 /調(diào)制解調(diào)器狀態(tài)寄存器#define IERV 1#define OUT2 0x08#define ERTS 2#define EDTR 1#define EMPTY 0X20#define READY 0X30#define ICREG 0X20#define IMASKREG 0X21#define EOI 0X20#define WAITCOUNT 5000#define BUFFLEN 2048 /用于存儲(chǔ)字符的數(shù)組的界#define ALTE 0X12#define ALTQ 0X10#define SER_BAUD_1200 96 #define SER_BAUD_2
12、400 48#define SER_BAUD_9600 0x0C#define SER_BAUD_19200 6#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 character
13、s*/#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*/int port;int ComNum;unsigned portaddr;unsigned portf;unsigned int baudtable=0x180,0xc0,0x60,0x30,0x18,0x0c,0x06;unsigned ch
14、ar paritytable=0x08,0x18,0x00,0x28,0x38;unsigned char bufferBUFFLEN;/recv bufint buffin=0;int buffout=0;int incount=0;int outcount=0;void interrupt(*vect_com(.;void putb(unsigned char ch/write a char to the recvbuf 將中斷得到的數(shù)據(jù)寫(xiě)到緩沖區(qū)int temp;temp=buffin;if(+buffin=BUFFLEN buffin=0;if(buffin!=buffout buff
15、erbuffin=ch; / printf("bufferin%d=%c",bufferbuffin; / getch(; else buffin=temp;unsigned char getb(/read a char from the recvbufif(buffout!=buffin if(+buffout=BUFFLEN buffout=0; /printf("bufferout%d=%c",buffout,bufferbuffout; return(bufferbuffout; else return(0xff;/*unsigned char
16、sender( unsigned char choutportb(portaddr2+TXD,ch;printf("nsender outportdata=%cn",ch;outcount+;return(1;*/void interrupt receiver(.unsigned char ch;ch=inportb(portaddr+RXD;putb(ch;incount+; /記錄接收了多少個(gè)數(shù)據(jù)。outportb(ICREG,EOI;void SerInit(int baud,int configurationdisable(;outportb(portaddr+LC
17、R,0x80;outportb(portaddr+LSB,baud;outportb(portaddr+MSB,0x00;outportb(portaddr+LCR,configuration;enable(;void SerOpen(voidvect_com=getvect(portf+8;disable(;inportb(portaddr+RXD;inportb(portaddr+MSR;inportb(portaddr+LSR;inportb(portaddr+IIR;outportb(portaddr+IER,IERV;outportb(portaddr+MCR,OUT2|ERTS|E
18、DTR;outportb(IMASKREG,inportb(IMASKREG&(1< setvect(portf+8,receiver; enable(; ; void SerClose(void disable(; outportb(portaddr+IER,0; outportb(portaddr+MCR,0; outportb(IMASKREG,inportb(IMASKREG|(1< enable(; setvect(portf+8,vect_com; ; void Getportaddr(int port switch (port case 0: portaddr
19、=0x3F8; break; case 1: portaddr=0x2F8; break; case 2: portaddr=0x3E8; break; case 3: portaddr=0x2E8; break; portf=(port=0?4:3; ; void Int( unsigned char key,key2; port=ComNum-1; if(peek(0x40,port*2=0 printf("have no special com .n" exit(1; else printf("The used port is :COM%dn",C
20、omNum; ; Getportaddr(port; / 得到串口地址 SerInit(SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1; / 初始化串口,設(shè)置波特率等 SerOpen(; do if(kbhit( key2=getch(; if(key2=27 break; ; key=getb(; if(key!=0xff printf("%xt",key; FILE *fp; fp=fopen("C:Receivedata.dat","ab" / 可選擇接收數(shù)據(jù)的存放文
21、件路徑和文件名 if(fp=NULL printf("File open error!" / fputc(key,fp; fwrite(&key,sizeof(unsigned char,1,fp; fclose(fp; while (key2!=27; SerClose(; / printf("%d char has been receivedn",incount; / printf("%d char has been sendedn",outcount; / printf("nsum=%d n",sum
22、; void main(/com1 receive printf("Please input the receive COMnum:(14n" cin>>ComNum; printf("the current com set is:9600,even, data bits 8, stop 1," Int(; printf("nnOVERn" exit(0; ; 發(fā)送文件程序 #include #include #include #include #include #include #ifdef _cplusplus #de
23、fine _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_BA
24、UD_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 COM_3 0x3E8 #define COM_4 0x2E8 #define SER_STOP_1 0 /*/ 1 stop bit per character*/ #define SER
25、_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_O
26、DD 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 int
27、errupt 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_bufferSERIAL_BUFF_SIZE; /*/ the receive buf
28、fer*/ 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*/
29、 /*/ isn't altered will it is being written*/ /*/ to by the ISR*/ /*- 寫(xiě)串口 -*/ 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_bufferser_end = ser_ch; +char_ready; outp(PIC_ICR,0x20; serial_lock
30、= 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_bufferser_start; printf("%x",ch; if (char_ready > 0 -char_ready; return(ch; else
31、return(0; /*- 寫(xiě)串口 -*/ 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; disable(; outp(port_base + SER_LCR, SER_DIV_LATCH_ON; outp(port_base
32、+ 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 | port_base=COM_3 Old_Isr = _dos_getvect(INT_SER_PORT_0; _dos_setvect(INT_SER_PORT_0, Serial_Isr; printf("nOpening Commun
33、ications Channel Com Port #1/3.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/4.n" old_int_mask = inp(PIC_IMR; outp(PIC_IMR, (port_base=COM_1 ? (old_int_mask & 0xEF : (old_int_mask & 0
34、xF7 ; enable(; /*- 關(guān)閉串口 -*/ 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,
35、 Old_Isr; printf("nClosing Communications Channel Com Port #2.n" /*- 發(fā)送應(yīng)用 -*/ void main(int argc,char *argv char ch,press; int done=0; FILE *fp; argc=2; /argv1="c:comfile.c" if(argc<2 printf("nUsage:display filename.wav!" / exit(1; if(fp=fopen(argv1,"r+b"=NULL printf("cannot open the filen" / exit(0; fseek(fp, 0, SEEK_SET; Open_S
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東清遠(yuǎn)市2025年化學(xué)高一下期末聯(lián)考試題含解析
- 安徽省合肥市第三十五中學(xué)2025屆高一化學(xué)第二學(xué)期期末統(tǒng)考試題含解析
- 視力防護(hù)策劃書(shū)范文模板
- 2024年全球及中國(guó)餐具掛鉤行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 江蘇省揚(yáng)州高郵市2025屆高一下化學(xué)期末統(tǒng)考模擬試題含解析
- 中國(guó)中橋總成行業(yè)市場(chǎng)行情動(dòng)態(tài)分析及發(fā)展前景趨勢(shì)預(yù)測(cè)報(bào)告
- 2025屆四川省成都市龍泉第二中學(xué)化學(xué)高一下期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 2025年中國(guó)農(nóng)副行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年中國(guó)手搖輪椅車市場(chǎng)競(jìng)爭(zhēng)策略及行業(yè)投資潛力預(yù)測(cè)報(bào)告
- 2022-2027年中國(guó)機(jī)械行業(yè)市場(chǎng)調(diào)研及投資戰(zhàn)略規(guī)劃建議報(bào)告
- 建筑工程設(shè)計(jì)合作協(xié)議書(shū)
- 谷子介紹課件
- 直播肖像權(quán)使用合同協(xié)議
- 2025屆高考政治復(fù)習(xí)重點(diǎn)知識(shí)大全(全7冊(cè))
- 電梯公告板制度
- 餐飲內(nèi)部考核管理制度
- 酒吧股東合伙協(xié)議書(shū)
- 臥床病人康復(fù)鍛煉課件
- 兒科換錯(cuò)藥護(hù)理不良事件
- 糖尿病管理工作制度
- 2025年初級(jí)等保測(cè)評(píng)試題及答案
評(píng)論
0/150
提交評(píng)論