




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、叮叮小文库c 语言的串口通信程序范例标签: 分类: 技术笔记c 语言串口通信通信程序it最近接触一个项目,用 HL-C1C 激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c# ,一些资料,找来做个记录,也许大家用的着#include <stdio.h>#include <dos.h>#include <conio.h>#include <string.h>#define COM232 0x2f8#define COMINT 0x0b#define MaxBufLen500#define Port82590x20#define
2、 EofInt0x20static int comportaddr;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, i
3、nt Baud,unsigned char Data, unsigned char Stop, unsigned char Parity)unsigned char High,Low; int f;comportaddr=ComPortAddr;intvectnum=IntVectNum;Charsl nBuf=O;Circl n=0;CircOut=0;f=(Baud/100);f=1152/f; High=f/256;Low=f-High*256;outp(ComPortAdd 叶 3,0x80); outp(ComPortAddr,Low);outp(ComPortAdd r+1,Hig
4、h);Data=(Data-5)|(Stop-1)*4);if(Parity=2) Data=Data|0x18;else if(Parity=1) Data=Data|0x8;outp(ComPortAdd 叶 3,Data);outp(ComPortAdd 叶 4,0x0a);outp(ComPortAdd 叶 1,0x01);disable。;01dAs yncln t=getvect( In tVectNum );setvect( In tVectNum, Asynclnt );en able();maskb=i np(Port8259+1);if(I ntVectNum=0x0c)o
5、utp(Port8259+1,maskb&0 xef); else outp(Port8259+1,maskb&0 xf7);static void in terrupt far Asyn cI nt(void)disable。;if(CharsI nBufvMaxBufLe n)BufferCircI n=i np(comportaddr);if(CircIn<MaxBufLen-1) CircIn+;else Circln=0;if(CircI n=CircOut) CircOut+;else Chars In Buf+;en able();outp(Port8259
6、,Eofl nt); void Restore(void)setvect(i ntvect num ,OldAs yncln t); outp(Port8259+1,maskb);int GetCharl nBuf(u nsig ned char *Char)int Flag;Flag=-1;if(Charsl nBuf>0)(*Char尸BufferCircOut;if(CircOut<MaxBufLe n-1)CircOut+; else CircOut=0;CharsI nBuf-;Flag=0; return Flag;int Sen dChar( un sig ned c
7、har Char)if(inp(comportaddr+5)&0x20)=0) return -1; outp(comportaddr,Char); return 0;mai n()int i,c;un sig ned char In Char;In it_COM(COM232,COMINT,12OO,8,1,O);while(1)if(kbhit()if(I nChar=getch()=27)break; else while(Se ndChar(I nChar);if(GetCharl nBuf(&ln Char)=0) prin tf("%c",l n
8、Char);Restore。;接收程序:# in elude <dos.h># in elude <fstream.h># in elude <coni o.h># in elude <stdio.h># in elude <stdlib.h># in elude <math.h># define RXD 0 / 接收# define TXD 0 / 发送# define LSB 0 II波特率调节低 8位# define MSB 1 II波特率调节高 8位# define IER 1 II中断起用寄存器# define
9、IIR 2 II中断标识寄存器# define LCR 3 II线路控制寄存器# define MCR 4 II调制解调器控制寄存器# defi ne LSR 5 II线路状态寄存器# define MSR 6 II调制解调器状态寄存器#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 BU
10、FFLEN 2048 II 用于存储字符的数组的界#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 I*I 1 stop bit per eharaeter*I#define SER_STOP_2 4 I*I 2 stop bits per eharaeter*I#define SER_BITS_5 0 I*I send 5 bit ehar
11、aeters*I# defi ne SER_BITS_6 1 /*/ send 6 bit eharaeters*/# defi ne SER_BITS_7 2 /*/ send 7 bit eharaeters*/# defi ne SER_BITS_8 3 /*/ send 8 bit eharaeters*/# defi ne SER_PARITY_NONE 0 /*/ no parity*/# defi ne SER_PARITY_ODD 8 /*/ odd parity*/# defi ne SER_PARITY_EVEN 24 /*/ eve n parity*/ int port
12、;int ComNum;un sig ned portaddr;un sig ned portf;unsigned int baudtable尸0x180,0xc0,0x60,0x30,0x18,0x0c,0x06;unsigned char paritytable=0x08,0x18,0x00,0x28,0x38;un sig ned char bufferBUFFLEN;recv bufint buffin=0;int buffout=0;int incoun t=0;int outco un t=0;void in terrupt(*vect_com)();void putb(u nsi
13、g ned char ch)/write a char to the recvbuf将中断得到的数据写到缓冲区int temp;temp=buffi n;if(+buffi n=BUFFLEN)buffi n=0;if(buffi n!=buffout)bufferbuffi n=ch;/ prin tf("bufferi n%d=%c",bufferbuffi n);/ getch();elsebuffi n=temp;un sig ned char getb()/read a char from the recvbufif(buffout!=buffi n)if(+bu
14、ffout=BUFFLEN)buffout=0;/pri ntf("bufferout%d=%c",buffout,bufferbuffout);return(bufferbuffout);elsereturn(0xff);/*un sig ned char sen der( un sig ned char ch)outportb(portaddr2+TXD,ch);prin tf("nsen der outportdata=%c n",ch);outco un t+;return(1);*/void in terrupt receiver 。.)un
15、sig ned char ch;14ch=in portb(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,c on figurati on);en able();void SerOpe n( void)
16、vect_com=getvect(portf+8);disable。;in portb(portaddr+RXD);in portb(portaddr+MSR);in portb(portaddr+LSR);in portb(portaddr+IIR);outportb(portaddr+IER,IERV); outportb(portaddr+MCR,OUT2|ERTS|EDTR);outportb(IMASKREG,i nportb(IMASKREG )&(1<<portf); setvect(portf+8,receiver);en able();void SerCl
17、ose(void)disable。;outportb(portaddr+IER,0);outportb(portaddr+MCR,0);outportb(IMASKREG,i nportb(IMASKREG)|(1<<portf);en able();setvect(portf+8,vect_com);;void Getportaddr(i nt port)switch (port)case 0: portaddr=0x3F8; break;case 1: portaddr=0x2F8; break;case 2: portaddr=0x3E8; break;case 3: por
18、taddr=0x2E8; break;portf=(port=0)?4:3;void Int()un sig ned char key,key2;port=ComNum-1;if(peek(0x40,port*2)=0) prin tf("have no special com .n");exit(1);else prin tf("The used port is :COM%dn",ComNum);Getportaddr(port); / 得至 U 串 口 地址Serinit(SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS
19、_8 | SER_STOP_1); 初始化 串口,设置波特率等SerOpe n();do if(kbhit() key2=getch();if(key2=27) break;key=getb();if(key!=0xff) prin tf("%xt",key);FILE *fp;fp=fopen("C:Receivedata.dat","ab"); II可选择接收数据的存放文件路径和文件名if(fp=NULL)pri ntf("File ope n error!");II fputc(key,fp);fwrite(
20、&key,sizeof( un sig ned char),1,fp);fclose(fp);while (key2!=27);SerClose();II prin tf("%d char has bee n receivedn",i ncoun t);II prin tf("%d char has bee n sen dedn",outco un t);II prin tf("nsum=%d n",sum);void main() com1 receiveprin tf("Please in put the rec
21、eive COMn um:(14)n");cin> >ComNum;prin tf("the curre nt com set is:9600,eve n, data bits 8, stop 1,");In t();prin tf("nnOVER'n");exit(0);发送文件程序#in clude <dos.h>#in clude <bios.h>#in clude <stdio.h>#in clude <math.h>#in clude <coni o.h>
22、#in clude <graphics.h> #ifdef _cplusplus#defi ne _CPPARGS .#else#defi ne _CPPARGS#en dif# defi ne SER_RBF 0# defi ne SER_THR 0# defi ne SER_IER 1# defi ne SER_IIR 2# defi ne SER_LCR 3# defi ne SER_MCR 4# defi ne SER_LSR 5# defi ne SER_MSR 6# defi ne SER_DLL 0#defi ne SER_DLH 1#defi ne SER_BAUD
23、_1200 96#defi ne SER_BAUD_2400 48#defi ne SER_BAUD_9600 12#defi ne SER_BAUD_19200 6#defi ne SER_GP02 8#defi ne COM_1 0x3F8#defi ne C0M_2 0x2F8 /*/ base port address of port 1*/#defi ne COM_3 0x3E8#defi ne COM_4 0x2E8# defi ne SER_STOP_1 0 /*/ 1 stop bit per character*/# defi ne SER_STOP_2 4 /*/ 2 st
24、op bits per character*/# defi ne SER_BITS_5 0 /*/ send 5 bit characters*/# defi ne SER_BITS_6 1 /*/ send 6 bit characters*/# defi ne SER_BITS_7 2 /*/ send 7 bit characters*/# defi ne SER_BITS_8 3 /*/ send 8 bit characters*/# defi ne SER_PARITY_NONE 0 /*/ no parity*/# defi ne SER_PARITY_ODD 8 /*/ odd
25、 parity*/#defi ne SER_PARITY_EVEN 24 /*/ eve n parity*/#defi ne 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.*/#defi ne INT_SER_PORT_0 0x0C /*/ port 0 in terrupt com 1
26、 & 3*/#defi ne INT_SER_PORT_1 0x0B /*/ port 0 in terrupt com 2 & 4*/#defi ne SERIAL_BUFF_SIZE 128 /*/ curre nt size of circulat ing receive buffer*/ void in terrupt far (*Oldsr)( _CPPARGS); /*/ holds old com port in terrupt han dler*/ char ser_bufferSERIAL_BUFF_SIZE; /*/the receive buffer*/i
27、nt ser_e nd = -1,ser_start=-1; /*/ i ndexes into receive buffer*/int ser_ch, char_ready=0; /*/ curre nt character and ready flag*/int old_ in t_mask; /*/ the old in terrupt mask on the PIC*/int ope n_port; /*/ the curre ntly ope n port*/int serial_lock = 0; /*/ serial ISR semaphore so the buffer*/*/
28、 is n't altered will it is being writte n*/*/ to by the ISR*/*写串口 */void in terrupt far Serial_Isr(_CPPARGS)serial_lock = 1;ser_ch = in p(ope n_port + SER_RBF);if (+ser_e nd > SERIAL_BUFF_SIZE-1)ser_e nd = 0;ser_bufferser_e nd = ser_ch;+char_ready; outp(PIC_ICR,0x20);serial_lock = 0;int Ready
29、_Serial()retur n( char_ready);/*读串口 */int Serial_Read()int ch;while(serial_lock) if (ser_e nd != ser_start)if (+ser_start > SERIAL_BUFF_SIZE-1)ser_start = 0;ch = ser_bufferser_start;prin tf("%x",ch);if (char_ready > 0)-char_ready;return(ch);elsereturn(0);/*写串口 */Serial_Write(char ch)
30、while(!(i np(open_port + SER_LSR) & 0x20) asm clioutp(open_port + SER_THR, ch);asm sti /*初始化串口 */Open_Serial(int port_base, int baud, int configuration) ope n_port = port_base;disable。;outp(port_base + SER_LCR, SER_DIV_LATCH_ON);outp(port_base + SER_DLL, baud);outp(port_base + SER_DLH, 0);outp(p
31、ort_base + SER_LCR, con figurati on);outp(port_base + SER_MCR, SER_GP02);outp(port_base + SER_IER, 1);if (port_base = COM_1 | port_base=COM_3)Oldsr = _dos_getvect(INT_SER_PORT_0);_dos_setvect(INT_SER_PORT_0, Serial_Isr);printf("nOpening Communications Channel Com Port #1/3n"); elseOldsr =
32、_dos_getvect(INT_SER_PORT_1);_dos_setvect(INT_SER_PORT_1, Serial_Isr);prin tf("nOpe ning Communi cati ons Channel Com Port #2/4n");old_i nt_mask = in p(PIC_IMR);outp(PIC_IMR, (port_base=COM_1) ? (old_i nt_mask & OxEF): (old_i nt_mask & 0xF7 ); en able();/*关闭串口 */Close_Serial( int p
33、ort_base)outp(port_base + SER_MCR, 0);outp(port_base + SER_IER, 0);outp(PIC_IMR, old_i nt_mask );if (port_base = COM_1)_dos_setvect(INT_SER_PORT_0, Old_Isr);prin tf("nClos ing Commun icati ons Channel Com Port #1.n"); else_dos_setvect(INT_SER_PORT_1, Old_Isr);printf("nClosing Communic
34、ations Channel Com Port #2.n");/*发送应用*/void main (i nt argc,char *argv)char ch,press;int don e=0;FILE *fp;argc=2;/argv1="c:comfile.c"if(argc<2)prin tf("nU sage:display file name.wav!");/ exit(1);if(fp=fope n(argv1,"r+b")=NULL)prin tf("ca nnot ope n the filen");/ exit(0);SER_BITS_8 |fseek(fp, 0, SEEK_SET);Open_Serial(COM_1,SER_BAUD_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 泰山护理职业学院《计算机电路基础》2023-2024学年第二学期期末试卷
- 张家口职业技术学院《接口自动化》2023-2024学年第二学期期末试卷
- 贵州铜仁数据职业学院《桥梁结构非线性》2023-2024学年第一学期期末试卷
- 山东英才学院《儿童文学(小教)》2023-2024学年第二学期期末试卷
- 郑州经贸学院《钢琴弹唱》2023-2024学年第一学期期末试卷
- 湖南师范大学《公共健康与预防医学》2023-2024学年第二学期期末试卷
- 反担保保证抵押借款合同
- 抵押物品的合同
- 手房买卖合同独家合同
- 畜牧产品产销对接与供应链保障合同
- 前列腺增生患者的护理查房课件
- 2023年四川农信(农商行)招聘笔试真题
- 呼兰河传(2022年黑龙江牡丹江中考语文试卷记叙文阅读题及答案)
- 小学英语“教学评一体化”实施
- 危险化学品出入库管理制度
- 人教版道德与法治三年级下册全册课件(完整版)
- 医学课件新生儿黄疸5
- 2024年中考英语作文热点主题:人工智能满分范文10篇精彩表达25句
- 2025年呼和浩特市重点中学中考领航2020大二轮复习数学试题模拟含解析
- 水泥搅拌桩施工记录-自动计算
- 全国大学生网络安全知识竞赛题库及答案
评论
0/150
提交评论