c语言串口通信范例.docx
- 文档编号:18363512
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:14
- 大小:18.07KB
c语言串口通信范例.docx
《c语言串口通信范例.docx》由会员分享,可在线阅读,更多相关《c语言串口通信范例.docx(14页珍藏版)》请在冰点文库上搜索。
c语言串口通信范例
一个c语言的串口通信程序范例
标签:
c语言
串口通信
通信程序
it
分类:
技术笔记
最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触cc#,一些资料,找来做个记录,也许大家用的着
#include<>
#include<>
#include<>
#include<>
#defineCOM232 0x2f8
#defineCOMINT 0x0b
#defineMaxBufLen 500
#definePort8259 0x20
#defineEofInt 0x20
staticint comportaddr;
staticcharintvectnum;
staticunsignedcharmaskb;
staticunsignedcharBuffer[MaxBufLen];
staticint CharsInBuf,CircIn,CircOut;
staticvoid(interruptfar*OldAsyncInt)();
staticvoidinterruptfarAsyncInt(void);
voidInit_COM(intComPortAddr,unsignedcharIntVectNum,intBaud,
unsignedcharData,unsignedcharStop,unsignedcharParity)
{
unsignedcharHigh,Low;
intf;
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==2)Data=Data|0x18;
elseif(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);
elseoutp(Port8259+1,maskb&0xf7);
}
staticvoidinterruptfarAsyncInt(void)
{
disable();
if(CharsInBuf Buffer[CircIn]=inp(comportaddr); if(CircIn elseCircIn=0; if(CircIn==CircOut)CircOut++; elseCharsInBuf++; enable(); outp(Port8259,EofInt); } voidRestore(void) { setvect(intvectnum,OldAsyncInt); outp(Port8259+1,maskb); } intGetCharInBuf(unsignedchar*Char) { intFlag; Flag=-1; if(CharsInBuf>0) { (*Char)=Buffer[CircOut]; if(CircOut elseCircOut=0; CharsInBuf--; Flag=0; } returnFlag; } intSendChar(unsignedcharChar) { if((inp(comportaddr+5)&0x20)==0)return-1; outp(comportaddr,Char); return0; } main() { inti,c; unsignedcharInChar; Init_COM(COM232,COMINT,1200,8,1,0); while (1) { if(kbhit()) {if((InChar=getch())==27)break; elsewhile(SendChar(InChar)); } if(GetCharInBuf(&InChar)==0) printf("%c",InChar); } Restore(); } 接收程序: #include<> #include<> #include<> #include<> #include<> #include<> #defineRXD0.); voidputb(unsignedcharch).) { unsignedcharch; ch=inportb(portaddr+RXD); putb(ch); incount++;n"); exit (1); } else { printf("Theusedportis: COM%d\n",ComNum); }; Getportaddr(port);. #else #define__CPPARGS #endif #defineSER_RBF0 #defineSER_THR0 #defineSER_IER1 #defineSER_IIR2 #defineSER_LCR3 #defineSER_MCR4 #defineSER_LSR5 #defineSER_MSR6 #defineSER_DLL0 #defineSER_DLH1 #defineSER_BAUD_120096 #defineSER_BAUD_240048 #defineSER_BAUD_960012 #defineSER_BAUD_192006 #defineSER_GP028 #defineCOM_10x3F8 #defineCOM_20x2F8/*/baseportaddressofport1*/ #defineCOM_30x3E8 #defineCOM_40x2E8 #defineSER_STOP_10/*/1stopbitpercharacter*/ #defineSER_STOP_24/*/2stopbitspercharacter*/ #defineSER_BITS_50/*/send5bitcharacters*/ #defineSER_BITS_61/*/send6bitcharacters*/ #defineSER_BITS_72/*/send7bitcharacters*/ #defineSER_BITS_83/*/send8bitcharacters*/ #defineSER_PARITY_NONE0/*/noparity*/ #defineSER_PARITY_ODD8/*/oddparity*/ #defineSER_PARITY_EVEN24/*/evenparity*/ #defineSER_DIV_LATCH_ON128/*/usedtoturnreg0,1intodivisorlatch*/ #definePIC_IMR0x21/*/pic'sinterruptmaskreg.*/ #definePIC_ICR0x20/*/pic'sinteruptcontrolreg.*/ #defineINT_SER_PORT_00x0C/*/port0interruptcom1&3*/ #defineINT_SER_PORT_10x0B/*/port0interruptcom2&4*/ #defineSERIAL_BUFF_SIZE128/*/currentsizeofcirculatingreceivebuffer*/ voidinterruptfar(*Old_Isr)(__CPPARGS);/*/holdsoldcomportinterrupthandler*/ charser_buffer[SERIAL_BUFF_SIZE];/*/thereceivebuffer*/ intser_end=-1,ser_start=-1;/*/indexesintoreceivebuffer*/ intser_ch,char_ready=0;/*/currentcharacterandreadyflag*/ intold_int_mask;/*/theoldinterruptmaskonthePIC*/ intopen_port;/*/thecurrentlyopenport*/ intserial_lock=0;/*/serialISRsemaphoresothebuffer*/ /*/isn'talteredwillitisbeingwritten*/ /*/tobytheISR*/ /*-------------写串口-----------------*/ voidinterruptfarSerial_Isr(__CPPARGS) { serial_lock=1; ser_ch=inp(open_port+SER_RBF); if(++ser_end>SERIAL_BUFF_SIZE-1) ser_end=0; ser_buffer[ser_end]=ser_ch; ++char_ready; outp(PIC_ICR,0x20); serial_lock=0; } intReady_Serial() { return(char_ready); } /*--------------读串口--------------*/ intSerial_Read() { intch; while(serial_lock){} if(ser_end! =ser_start) { if(++ser_start>SERIAL_BUFF_SIZE-1) ser_start=0; ch=ser_buffer[ser_start]; printf("%x",ch); if(char_ready>0) --char_ready; return(ch); } else return(0); } /*--------------写串口-----------------*/ Serial_Write(charch) { while(! (inp(open_port+SER_LSR)&0x20)){} asmcli outp(open_port+SER_THR,ch); asmsti } /*-----------初始化串口---------------*/ Open_Serial(intport_base,intbaud,intconfiguration) { 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==COM_3) { Old_Isr=_dos_getvect(INT_SER_PORT_0); _dos_setvect(INT_SER_PORT_0,Serial_Isr); printf("\nOpeningCommunicationsChannelComPort#1/3...\n"); } else { Old_Isr=_dos_getvect(INT_SER_PORT_1); _dos_setvect(INT_SER_PORT_1,Serial_Isr); printf("\nOpeningCommunicationsChannelComPort#2/4...\n"); } old_int_mask=inp(PIC_IMR); outp(PIC_IMR,(port_base==COM_1)(old_int_mask&0xEF): (old_int_mask&0xF7)); enable(); } /*-------------关闭串口--------------*/ Close_Serial(intport_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("\nClosingCommunicationsChannelComPort#1.\n"); } else { _dos_setvect(INT_SER_PORT_1,Old_Isr); printf("\nClosingCommunicationsChannelComPort#2.\n"); } } /*-------------发送应用----------------*/ voidmain(intargc,char*argv[]) { charch,press; intdone=0; FILE*fp; argc=2; //argv[1]="c: \\"; if(argc<2) { printf("\nUsage: display! ! ! "); //exit (1); } if((fp=fopen(argv[1],"r+b"))==NULL) { printf("cannotopenthefile\n"); //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;stopbit: 1"); printf("pressanykeytobeginsending"); getch(); //Serial_Write('');//该语句可用于发送单个字符 while(! done&&ch! =EOF)//发送文件开始 { ch=fgetc(fp); //if(ch==EOF)Serial_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: CWnd: 窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。 CDocument文档,负责内存数据与磁盘的交互。 最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写) CView视图,负责内存数据与用户的交互。 包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。 最重要的是OnDraw(重画窗口),通常用CWnd: : Invalidate()来启动它。 另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。 CDialog对话框 CWinApp应用程序类。 似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。 最常用函数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)对(宽、高)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 串口 通信 范例