您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机与RS-232的串口通信+VB程序
单片机与RS-232的串口通信+VB程序单片机部分程序采用C语言编写(C51)//-----------------------函数声明,变量定义--------------------------------------------------------#includereg51.h#defineCOUNT10//定义接收缓冲区大小unsignedcharbuffer[COUNT];//定义接收缓冲区unsignedcharpoint;//定义接收数据个数指示变量voidUART_init();//串口初始化函数voidCOM_send(void);//串口接收函数unsignedcharCLU_checkdata(void);//计算校验位函数//--------------------------------------------------------------------------------------------------//函数名称:UART_init()串口初始化函数//函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s//串口接收中断允许,发送中断禁止//--------------------------------------------------------------------------------------------------voidUART_init(){//初始化串行口和波特率发生器SCON=0x58;//选择串口工作方式,打开接收允许TMOD=0x21;//定时器1工作在方式2,定时器0工作在方式1TH1=0xfd;//实现波特率9600(系统时钟11.0592MHZ)TR1=1;//启动定时器T1ET1=0;ES=1;//允许串行口中断PS=1;//设计串行口中断优先级EA=1;//单片机中断允许}//--------------------------------------------------------------------------------------------------//函数名称:com_interrup()串口接收中断处理函数//函数功能:接收包括起始位’S’在内的十位数据到数据缓冲区//--------------------------------------------------------------------------------------------------com_interrupt(void)interrupt4using3{unsignedcharRECEIVR_buffer;if(RI)//处理接收中断{RI=0;//清除中断标志位RECEIVR_buffer=SBUF;//接收串口数据if(point==0)//如果还没有接收到起始位{if(RECEIVR_buffer==’S’)//判断是否起始标志位point++;//是准备接收下一位elsepoint=0;//不是,继续等待起始位}elseif(point0&&point10)//判断是否接收够十位数据buffer[point++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区elsepoint=0;//缓冲区已满,清除缓存区内数据重新接收}If(TI)//处理发送中断{TI=0;}}//--------------------------------------------------------------------------------------------------//函数名称:COM_send()串口发送函数//函数功能:把数据缓冲区的十位数据发送出去//--------------------------------------------------------------------------------------------------voidCOM_send(void){for(point=0;point=10,TI=1;point++)//连续发送十位数据//把缓存区的数据都发送到串口{SBUF=buffer[point];TI=0;}}//--------------------------------------------------------------------------------------------------//函数名称:CLU_checkdata()计算校验位函数//输入变量:无//输出变量:checkdata,包括起始位在内的前九位数据的校验和//函数功能:计算校验和//--------------------------------------------------------------------------------------------------unsignedcharCLU_checkdata(void){//计算校验位unsignedcharcheckdata=0;for(point=0;point9,TI=1;point++){checkdata=checkdata|buffer[point];}return(checkdata);}//------------------------------------------------------------------------------------------//函数名称:主函数//函数功能:调度个子函数,完成通信过程//--------------------------------------------------------------------------------------------------voidmain(void){unsignedcharcheckdata;do{UART_init();//初始化串口if(point==10)//判断数据是否接收完成checkdata=CLU_checkdata;//调用求校验和函数if(checkdata==buffer[9])//判断校验和是否正确COM_send();//正确则调用发送程序point=0;}while(1);}VB部分程序//---------------------------------------SComm控件的常用属性和方法-----------------------------Commport;设置或返回串口号。SettingS:以字符串的形式设置或返回串口通信参数。Portopen:设置或返回串口状态。InputMode:设置或返回接收数据的类型。Inputlen:设置或返回一次从接收缓冲区中读取字节数。InBufferSize:设置或返回接收缓冲区的大小,缺省值为l024字节。InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm事件的程序编写。程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开始。然后紧接着又发送9个字符,其中最后一个字符是前面9个字符(包括’S’)的校验和。单片机正确接收到10个字符后,把10个字符从新又送回来。//---------------------------------------初始化串口设计-----------------------------PrivateSubForm_Load()Comm1.Setting=9600,n,8,1,’设置波特率和发送字符格式Comm1.CommPort=1’设置通讯串口Comm1.InputLen=0’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据Comm1.InBuffersize=512Comm1.InBufferCount=0Comm1.OutBufferCount=0Comm1.Rthreshold=1Comm1.PortOpen=TrueEndSub’打开串口//--------------------------------------给单片机发送’S’,开始通信-----------------------------PrivateSubCommand1_C1ick()Timer1.Enabled=TrueEndSubPrivateSubCommand2_C1ick()Varbuffet=“S”Comm1.Ouput=varbuffeTimer2.Enabled=TrueEndSubPrivateSubForm_Unload(CancelAsInteger)Comm1.PortOpen=FalseEndSub//---------------------------------------向单片机发送数据-----------------------------PrivateSubTimer2_Timer()Outputsignal=Str(Text2.text)’向单片机发送数据Temp(1)=Cbyte(outputsignal)Varbuffer=tempComml.Output=varbufferTimer2.Enabled=FalseEndSub//---------------------------------------接收单片机发送的数据,并显示-----------------------------PrivateSubComm1_OnComm()SelectCaseComm1.CommEvent’设置oncomm事件,读取片机内存的值CasecomEvReceiveInputsignal=comm1.InputText1.Text=Asc(Inputsignal)’单片机内存的值用textbox显示出CaseElseEndselectEndSub
本文标题:单片机与RS-232的串口通信+VB程序
链接地址:https://www.777doc.com/doc-5754701 .html