1、c语言串口通信范例一个c语言的串口通信程序范例(2010-04-02 15:19:47) 转载标签: c语言串口通信通信程序it分类: 技术笔记 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着#include #include #include #include #define COM232 0x2f8#define COMINT 0x0b#define MaxBufLen 500#define Port8259 0x20#define EofInt 0x20static int comporta
2、ddr;static char intvectnum;static unsigned char maskb;static unsigned char BufferMaxBufLen;static int CharsInBuf,CircIn,CircOut;static void (interrupt far *OldAsyncInt)();static void interrupt far AsyncInt(void);void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, u
3、nsigned char Stop, unsigned char Parity)unsigned char High,Low;int f;comportaddr=ComPortAddr;intvectnum=IntVectNum;CharsInBuf=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(Par
4、ity=2) Data=Data|0x18;else if(Parity=1) Data=Data|0x8;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=0x0c)outp(Port8259+1,maskb&0xef);else outp(Port825
5、9+1,maskb&0xf7);static void interrupt far AsyncInt(void)disable();if(CharsInBufMaxBufLen) BufferCircIn=inp(comportaddr);if(CircIn0) (*Char)=BufferCircOut; if(CircOutMaxBufLen-1)CircOut+; else CircOut=0; CharsInBuf-; Flag=0; return Flag;int SendChar(unsigned char Char)if(inp(comportaddr+5)&0x20)=0) r
6、eturn -1;outp(comportaddr,Char);return 0;main()int i,c;unsigned char InChar;Init_COM(COM232,COMINT,1200,8,1,0);while(1) if(kbhit() if(InChar=getch()=27)break; else while(SendChar(InChar); if(GetCharInBuf(&InChar)=0) printf(%c,InChar);Restore();接收程序:#include #include #include #include #include #inclu
7、de #define RXD 0 /接收#define TXD 0 /发送#define LSB 0 /波特率调节低8位#define MSB 1 /波特率调节高8位#define IER 1 / 中断起用寄存器#define IIR 2 /中断标识寄存器#define LCR 3 /线路控制寄存器#define MCR 4 /调制解调器控制寄存器#define LSR 5 /线路状态寄存器#define MSR 6 /调制解调器状态寄存器#define IERV 1#define OUT2 0x08#define ERTS 2#define EDTR 1#define EMPTY 0X20#
8、define READY 0X30#define ICREG 0X20#define IMASKREG 0X21#define EOI 0X20#define WAITCOUNT 5000#define BUFFLEN 2048 /用于存储字符的数组的界#define ALTE 0X12#define ALTQ 0X10#define SER_BAUD_1200 96 #define SER_BAUD_2400 48#define SER_BAUD_9600 0x0C#define SER_BAUD_19200 6#define SER_STOP_1 0 /*/ 1 stop bit per
9、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*/#def
10、ine 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 char paritytable=0x08,0x18,0x00,0x28,0x38;unsigned char bufferBUFFLEN;/recv bufint buffin=0;int bu
11、ffout=0;int incount=0;int outcount=0;void interrupt(*vect_com)(.);void putb(unsigned char ch)/write a char to the recvbuf 将中断得到的数据写到缓冲区int temp;temp=buffin;if(+buffin=BUFFLEN) buffin=0;if(buffin!=buffout) bufferbuffin=ch; / printf(bufferin%d=%c,bufferbuffin); / getch(); else buffin=temp;unsigned cha
12、r 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 sender( unsigned char ch)outportb(portaddr2+TXD,ch);printf(nsender outportdata=%cn,ch);outcount+;return(1);
13、*/void interrupt receiver(.)unsigned char ch;ch=inportb(portaddr+RXD);putb(ch);incount+; /记录接收了多少个数据。outportb(ICREG,EOI);void SerInit(int baud,int configuration)disable();outportb(portaddr+LCR,0x80);outportb(portaddr+LSB,baud);outportb(portaddr+MSB,0x00);outportb(portaddr+LCR,configuration);enable()
14、;void SerOpen(void)vect_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|EDTR);outportb(IMASKREG,inportb(IMASKREG)&(1portf);setvect(portf+8,receiver);enable();void SerClo
15、se(void)disable();outportb(portaddr+IER,0);outportb(portaddr+MCR,0);outportb(IMASKREG,inportb(IMASKREG)|(1ComNum;printf(the current com set is:9600,even, data bits 8, stop 1,);Int();printf(nnOVERn);exit(0);发送文件程序#include #include #include #include #include #include #ifdef _cplusplus #define _CPPARGS
16、 .#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_
17、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_STOP_2 4 /*/ 2 stop bits per character*/#define SER_BITS_5 0 /*/ send 5 bit characters*/#define SER_
18、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 t
19、urn reg 0,1 into divisor latch*/#define PIC_IMR 0x21 /*/ pics interrupt mask reg.*/#define PIC_ICR 0x20 /*/ pics 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 siz
20、e of circulating receive buffer*/void interrupt far (*Old_Isr)(_CPPARGS); /*/ holds old com port interrupt handler*/char ser_bufferSERIAL_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*
21、/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*/ /*/ isnt altered will it is being written*/ /*/ to by the ISR*/*-写串口-*/ void interrupt far Serial_Isr(_CPPARGS)serial_lock = 1;ser_ch =
22、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 = 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 return(0); /*-写串口-*/Serial_Write(char ch)while(!(inp(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1