c语言串口通信典范文本.doc

上传人:一*** 文档编号:808879 上传时间:2019-07-16 格式:DOC 页数:13 大小:59.50KB
返回 下载 相关 举报
c语言串口通信典范文本.doc_第1页
第1页 / 共13页
c语言串口通信典范文本.doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《c语言串口通信典范文本.doc》由会员分享,可在线阅读,更多相关《c语言串口通信典范文本.doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、一个一个 c c 语言的串口通信程序范例语言的串口通信程序范例标签: 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 comportaddr; sta

2、tic 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, unsig

3、ned 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(Parity

4、=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,maskbelse outp(Port8259+1,maskb

5、static void interrupt far AsyncInt(void) disable();if(CharsInBuf0)(*Char)=BufferCircOut;if(CircOut#include #include #include #include #include #define RXD 0 /接收#define TXD 0 /发送#define LSB 0 /波特率调节低 8 位#define MSB 1 /波特率调节高 8 位#define IER 1 / 中断起用寄存器#define IIR 2 /中断标识寄存器#define LCR 3 /线路控制寄存器#defin

6、e MCR 4 /调制解调器控制寄存器#define LSR 5 /线路状态寄存器#define MSR 6 /调制解调器状态寄存器#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 /用于存储字符的数组的界#define ALTE 0X12#define ALTQ

7、 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 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 character

8、s*/#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*/int port;int ComNum;unsigned portaddr;unsigned portf;unsigned int baudtable

9、=0x180,0xc0,0x60,0x30,0x18,0x0c,0x06;unsigned char 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 将中断得到的数据写 到缓冲区int temp;temp=buffin

10、;if(+buffin=BUFFLEN)buffin=0;if(buffin!=buffout)bufferbuffin=ch;/ printf(“bufferin%d=%c“,bufferbuffin);/ getch();elsebuffin=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);els

11、ereturn(0xff);/*unsigned char sender( unsigned char ch)outportb(portaddr2+TXD,ch);printf(“nsender outportdata=%cn“,ch);outcount+;return(1);*/void interrupt receiver(.)unsigned char ch;ch=inportb(portaddr+RXD);putb(ch);incount+; /记录接收了多少个数据。outportb(ICREG,EOI);void SerInit(int baud,int configuration)

12、disable();outportb(portaddr+LCR,0x80);outportb(portaddr+LSB,baud);outportb(portaddr+MSB,0x00);outportb(portaddr+LCR,configuration);enable();void SerOpen(void)vect_com=getvect(portf+8);disable();inportb(portaddr+RXD);inportb(portaddr+MSR);inportb(portaddr+LSR);inportb(portaddr+IIR);outportb(portaddr+

13、IER,IERV);outportb(portaddr+MCR,OUT2|ERTS|EDTR);outportb(IMASKREG,inportb(IMASKREG)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 .#else#define _CPPARGS#end

14、if#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_19200 6#define SER_GP02 8 #d

15、efine 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_BITS_6 1 /*/ send 6 bit char

16、acters*/#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 turn reg 0,1 into divisor lat

17、ch*/#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 /*/ holds old com port interrupt handler*/char ser_bufferSERIAL_BUFF_SIZE; /*/ the receive buffer*/int ser_end = -1,ser_start=-1; /*/ ind

18、exes 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*/*/ isnt altered will it is being written*/*/ to

19、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 = 0; int Ready_Serial()return(char_ready); /*-读串口-*/int Serial_Read()int ch;

20、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); elsereturn(0); /*-写串口-*/Serial_Write(char ch)while(!(inp(open_port + SER_LSR) asm sti/*-初始化串口-*/Open_Serial(int port_base, int

21、baud, int configuration)open_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(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

22、=COM_3)Old_Isr = _dos_getvect(INT_SER_PORT_0);_dos_setvect(INT_SER_PORT_0, Serial_Isr);printf(“nOpening Communications Channel Com Port #1/3.n“);elseOld_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

23、= inp(PIC_IMR);outp(PIC_IMR, (port_base=COM_1) ? (old_int_mask 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

24、Port #1.n“);else_dos_setvect(INT_SER_PORT_1, Old_Isr);printf(“nClosing Communications Channel Com Port #2.n“); /*-发送应用-*/void main(int argc,char *argv)char ch,press;int done=0;FILE *fp;argc=2;/argv1=“c:comfile.c“;if(argc2)printf(“nUsage:display filename.wav!“);/ exit(1);if(fp=fopen(argv1,“r+b“)=NULL

25、)printf(“cannot open the filen“);/ exit(0);fseek(fp, 0, SEEK_SET);Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1);printf(“com:1;bps:9600;parity:even;bits:8;stop bit:1“);printf(“press any key to begin sending“);getch();/Serial_Write(); /该语句可用于发送单个字符while(!done/if(ch=EOF) Ser

26、ial_Write(27);Serial_Write(ch);delay(30);if (kbhit()press=getch();if (press=27)Serial_Write(27);done=1; Close_Serial(COM_1);fclose(fp);下面介绍最重要的下面介绍最重要的 MFC:MFC:CWnd:窗口,它是大多数“看得见的东西”的父类(Windows 里几乎所有看得见的东西都 是一个窗口,大窗口里有许多小窗口),比如视图 CView、框架窗口 CFrameWnd、工具条 CToolBar、对话框 CDialog、按钮 CButton,etc;一个例外是菜单(CM

27、enu)不是从窗口派 生的。 CDocument 文档,负责内存数据与磁盘的交互。最重要的是 OnOpenDocument(读入), OnSaveDocument(写盘),Serialize(读写) CView 视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的 选取、鼠标的响应)。最重要的是 OnDraw(重画窗口),通常用 CWnd:Invalidate()来启动 它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。 CDialog 对话框 CWinApp 应用程序类。似于 C 中的 main 函数,是程序执行的入口和管理者,负责程序建立、 消灭,主窗口

28、和文档模板的建立。最常用函数 InitInstance():初始化。 CGdiObject 及子类,用于向设备文本画图。它们都需要在使用前选进 DC。 CPen 笔,画线 CBrush 刷子,填充 CFont 字体,控制文字输出的字体 CBitmap 位图 CPalette 调色板 CRgn 区域,指定一块区域可以用于做特殊处理。 CFile 文件。最重要的不外是 Open(打开),Read(读入),Write(写) CString 字符串。封装了 C 中的字符数组,非常实用。 CPoint 点,就是(x,y)对 CRect 矩形,就是(left,top,right,bottom) CSize 大小,就是(cx,cy)对(宽、高)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com