
VB的mscomm控件与51单片机的通信问题
各位大神,我刚刚接触mscomm控件,有个程序不成功,请各位大神指导一下。我想达的目的如下:单片机控制一个LED灯闪烁,单片机启动时,不闪烁,当我在vb的text1中输入...
各位大神,我刚刚接触mscomm控件,有个程序不成功,请各位大神指导一下。我想达的目的如下:单片机控制一个LED灯闪烁,单片机启动时,不闪烁,当我在vb的text1中输入0后,点击command后,通过mscomm控件发送出去,单片机接到这个0后,开始闪烁。程序如下:上位机:
Private Sub Command1_Click()
MSComm1.Output = Text1.Text
End Sub
Private Sub Form_Load()
MSComm1.Settings = "9600,N,8,1" '波特率9600,无校验,8位数据,1位停止位
MSComm1.CommPort = 5 '端口5
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.RThreshold = 1 '设置并返回发生oncomm事件的字符数
MSComm1.InputLen = 0 '为0读取整个缓冲区
MSComm1.InputMode = comInputModeText '以文本方式接收
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True '打开串口
MSComm1.InBufferCount = 0 '清空接受缓存区
MSComm1.OutBufferCount = 0 '清空传输缓存区
End Sub
下位机:
#include<reg52.h>
sbit LED=P1^0;
unsigned char k;
void delay()
{
unsigned char i,j;
for (i=0;i<255;i++)
for(j=0;j<255;j++);
}
void init()
{
TMOD=0x20;//工作方式2
TH1=0xfd; //装入初值
TL1=0xfd;
TR1=1; //启动定时器1
REN=1; //启动串口中断
SM0=0; //设定串口工作方案1
SM1=1;
EA=1; //开总中断
ES=1; //开串口中断
}
void main()
{
init();
while(1)
{
if(k==0)
{
LED=0;
delay();
LED=1;
delay();
}
}
}
void ser() interrupt 4
{
RI=0;
k=SBUF;
}
这是上位机和下位机的程序情况,程序很简单。遇到的问题是,我在text中输入0点击command发送出去后,单片机的灯依旧没有反应,程序肯定是有问题,但是我一时又找不出来,请各位指点一下吧,小弟谢谢了。 展开
Private Sub Command1_Click()
MSComm1.Output = Text1.Text
End Sub
Private Sub Form_Load()
MSComm1.Settings = "9600,N,8,1" '波特率9600,无校验,8位数据,1位停止位
MSComm1.CommPort = 5 '端口5
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.RThreshold = 1 '设置并返回发生oncomm事件的字符数
MSComm1.InputLen = 0 '为0读取整个缓冲区
MSComm1.InputMode = comInputModeText '以文本方式接收
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True '打开串口
MSComm1.InBufferCount = 0 '清空接受缓存区
MSComm1.OutBufferCount = 0 '清空传输缓存区
End Sub
下位机:
#include<reg52.h>
sbit LED=P1^0;
unsigned char k;
void delay()
{
unsigned char i,j;
for (i=0;i<255;i++)
for(j=0;j<255;j++);
}
void init()
{
TMOD=0x20;//工作方式2
TH1=0xfd; //装入初值
TL1=0xfd;
TR1=1; //启动定时器1
REN=1; //启动串口中断
SM0=0; //设定串口工作方案1
SM1=1;
EA=1; //开总中断
ES=1; //开串口中断
}
void main()
{
init();
while(1)
{
if(k==0)
{
LED=0;
delay();
LED=1;
delay();
}
}
}
void ser() interrupt 4
{
RI=0;
k=SBUF;
}
这是上位机和下位机的程序情况,程序很简单。遇到的问题是,我在text中输入0点击command发送出去后,单片机的灯依旧没有反应,程序肯定是有问题,但是我一时又找不出来,请各位指点一下吧,小弟谢谢了。 展开
4个回答
展开全部
在你的vb程序中(MSComm1.Output = Text1.Text)直接将0发出去,单片机应接收48啊,以文本形式发送单片机就是以ASCII码接收,你可以改单片机的代码把k=0改为48试试,或者在vb中将ASCII码改为十进制试试。在你的单片机程序中,k的值满足LED闪烁一次吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-02-13 · 知道合伙人教育行家
关注

展开全部
建议你VB发送的数换一个,或者是在下位机的初始化时候给k‘赋非零值,不然k默认是0啊,上位机发不发送下位机都应该是满足if的,下位机在接收中断中最好是先读取数据再清零标志位。具体的调试方法1楼正解。先确定是上位机问题还是下位机问题。上位机中在发送的时候把text1的字符转换为数值类型再发送。
参考资料: 个人理解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先确定是上面问题还是通讯线问题还是下面问题。
做一根自环线,自发自收测试一下先。
做一根自环线,自发自收测试一下先。
更多追问追答
追问
能否具体说一下呢?多谢了啊
追答
我说的不具体吗?三选一了~
你做一根自环线(不会去问度娘),自发自收测试一下,上位机问题基本就可以确认或者排除了。
同理,下位机写一小段程序自环一下,加个断点应该能收到数据才对。
至于通讯线的问题…… 一个万用表就能解决了嘛。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-02-13
展开全部
买的程序吧?自己写的能不会?
追问
大哥,这么简单的程序买啊?有钱没地方花啊??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询