c語言串口通信范例_第1頁
c語言串口通信范例_第2頁
c語言串口通信范例_第3頁
c語言串口通信范例_第4頁
c語言串口通信范例_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論