| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4988 人关注过本帖
标题:单片机RS232与VB通信
只看楼主 加入收藏
cmx
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-11-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:9 
单片机RS232与VB通信
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#define COUNT 10                 // 定义接收缓冲区大小
unsigned char buffer[COUNT];     //定义接收缓冲区
unsigned char point;             //定义接收数据个数指示变量
void UART_init();                //串口初始化函数
void COM_send(void);             //串口接收函数
unsigned char CLU_checkdata(void);//计算校验位函数
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//             串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x58;           //选择串口工作方式,打开接收允许
TMOD =0x21;           //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd;            //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1;               //启动定时器T1
ET1 =0;
ES=1;                 //允许串行口中断
PS=1;                 //设计串行口中断优先级
EA =1;                //单片机中断允许
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位’S’在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI)                                 //处理接收中断
{
RI=0;                                 //清除中断标志位
RECEIVR_buffer=SBUF;                   //接收串口数据
if(point==0)                          //如果还没有接收到起始位
{
if(RECEIVR_buffer==’S’)        //判断是否起始标志位
point++;                  //是准备接收下一位
else
point=0;                  //不是,继续等待起始位
}
else if(point>0&&point<10)                  //判断是否接收够十位数据
buffer[point++]=RECEIVR_buffer;      //不够,把接收到的数据放入接收缓存区
else point=0;                             //缓冲区已满,清除缓存区内数据重新接收
}
If(TI)                                   //处理发送中断
{
TI=0;
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的十位数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
for(point=0;point<=10,TI=1;point++)          //连续发送十位数据
//把缓存区的数据都发送到串口
{
SBUF=buffer[point];
TI=0;
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: CLU_checkdata()计算校验位函数
// 输入变量: 无
// 输出变量: checkdata,包括起始位在内的前九位数据的校验和
// 函数功能: 计算校验和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{                                          //计算校验位
unsigned char checkdata=0;
for(point=0;point<9,TI=1;point++)
{
checkdata=checkdata|buffer[point];
}
return(checkdata);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
void main(void)
{
unsigned char checkdata;
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:设置或返回接收缓冲区的大小,缺省值为l 024字节。
InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm事件的程序编写。     
程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开始。然后紧接着又发送9个字符,其中最后一个字符是前面9个字符(包括’S’)的校验和。单片机正确接收到10个字符后,把10个字符从新又送回来。
//---------------------------------------初始化串口设计-----------------------------   
Private Sub Form_Load()
Comm1.Setting="9600,n,8,1,"   ’设置波特率和发送字符格式
=1          ’设置通讯串口
Comm1.InputLen=0          ’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据
Comm1.InBuffersize=512
Comm1.InBufferCount=0
Comm1.OutBufferCount=0
Comm1.Rthreshold=1
Comm1.PortOpen=True
End Sub                      ’打开串口
//--------------------------------------给单片机发送’S’,开始通信-----------------------------   
Private Sub Command1_C1ick()
Timer1.Enabled=True
End Sub
Private Sub Command2_C1ick()
Varbuffet=“S”                    
Comm1.Ouput=varbuffe
Timer2.Enabled=True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Comm1.PortOpen=False
End Sub
//---------------------------------------向单片机发送数据-----------------------------   
Private Sub Timer2_ Timer()
Outputsignal=Str(Text2.text)                           ’向单片机发送数据
Temp(1)=Cbyte(outputsignal)
Varbuffer=temp
Comml.Output=varbuffer
Timer2.Enabled=False
End Sub
//---------------------------------------接收单片机发送的数据,并显示-----------------------------   
Private Sub Comm1_OnComm()
Select Case           ’设置oncomm事件,读取片机内存的值
Case comEvReceive
Inputsignal=comm1.Input
Text1.Text=Asc(Inputsignal)               ’单片机内存的值用textbox显示出
Case Else
End select
End Sub
搜索更多相关主题的帖子: 单片机 通信 
2009-11-17 09:07
xslslx
Rank: 2
等 级:论坛游民
帖 子:58
专家分:65
注 册:2009-11-10
收藏
得分:2 
上边那一段怎么感觉不像VB6的代码哦……

老师的学生,学生的老师
2009-11-17 09:28
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:2 
本来就不是。
2009-11-17 12:03
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:2 
上边那一段怎么感觉不像VB6的代码哦……

是 C for C51 单片机的代码.

授人于鱼,不如授人于渔
早已停用QQ了
2009-11-17 14:36
haigecnpeng
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:261
专家分:510
注 册:2008-10-6
收藏
得分:2 
楼主有没有试过发比较多的数据啊,看代码中好像没有流控的代码啊,就是透明串口中的CTS/RTS啊!

都说到了.net年代,VB与C#都是一样的!
但为什么招聘的都是C#呢?
2009-11-17 23:00
hlmzrdongdong
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖北武汉
等 级:版主
威 望:1
帖 子:99
专家分:145
注 册:2008-10-24
收藏
得分:2 
楼主贴错地方了吧,应该贴到单片机论坛去

京畿明月
2009-11-19 13:14
zhongxuelian
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2009-11-22
收藏
得分:2 
这个好啊,这是个  51单片机的接发C程序     VB的串口接发可视化编程,哈哈,我一直做这个不能发送数组,有了这个程序对我很有用的,谢谢了
2009-11-22 23:15
weixieyang
Rank: 1
等 级:新手上路
帖 子:4
专家分:9
注 册:2007-4-30
收藏
得分:2 
嗯。上面是单片机上的,下面才是VB的。
2009-11-23 13:37
火烈鸟
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-6-27
收藏
得分:0 
精彩,,MCU+VB
2010-01-19 00:36
jingzheng2
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-8-2
收藏
得分:0 
精彩,,MCU+VB
2010-08-02 10:17
快速回复:单片机RS232与VB通信
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019243 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved