版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、一個c語言的串口通信程序范例(2010-04-02 15:19:47 轉載標簽: c語言串口通信通信程序it分類: 技術筆記 最近接觸一個項目,用HL-C1C激光位移傳感器+易控組態(tài)軟件完成生產(chǎn)線高度跳變檢測,好久沒有接觸c c#,一些資料,找來做個記錄,也許大家用的著#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 /中斷標識寄存器#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 /用于存儲字符的數(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ù)寫到緩沖區(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+; /記錄接收了多少個數(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; / 初始化串口,設置波特率等 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*/ /*- 寫串口 -*/ 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; /*- 寫串口 -*/ 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(; /*- 關閉串口 -*/ 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ā)送應用 -*/ 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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024裝修增加項目施工合同模板
- 個人經(jīng)營貸款合同樣本
- 2024建筑單包工合同范文
- 2024股份擔保借款合同范本
- 2024個人住房公積金的借款合同
- 2024動產(chǎn)家具無償寄托合同
- 房產(chǎn)項目合作開發(fā)協(xié)議書
- 三輪車買賣合同完整協(xié)議2024年
- 倉配租賃合同模板
- 工業(yè)用地投資協(xié)議
- 2024中國一汽校園招聘1000+崗位高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- GB/T 19533-2024汽車用壓縮天然氣鋼瓶定期檢驗與評定
- 婦產(chǎn)科護士晉升述職報告
- 骨髓腔內(nèi)輸液(IOI)技術
- 建筑幕墻工程(鋁板、玻璃、石材)監(jiān)理實施細則(全面版)
- 小學數(shù)學與思政融合課教學設計
- 體育公園運營管理方案
- 休閑生態(tài)農(nóng)業(yè)觀光園建設項目財務分析及效益評價
- 江西省南昌市民德學校2023-2024學年八年級上學期期中數(shù)學試題
- 國際金融(英文版)智慧樹知到期末考試答案2024年
- 2024年《藥物臨床試驗質量管理規(guī)范》(GCP)網(wǎng)絡培訓題庫
評論
0/150
提交評論