关于VB与单片机通信Timer控件和TXET控件的问题

mx_try 2016-03-18 06:27:11
我做的是VB关于超声波的上位机,我设置了一个文本框 显示超声波测得距离,但是我发现那个文本框控件中显示的距离并不能实时显示,只有关闭串口,再打开串口,才能显示出数字,而且如果实际测量距离有所改变,也得关闭再打开串口才能再显示,我有些不解,要怎么弄才可以实时显示。请求支援!!!!
下面这个是我上位机的大概部分:主体意思是我点击check控件,向单片机发送一个9( buff(0) = &H9);Timer控件设置的时间间隔是250,也试过其他的值,发现这并不能改变什么。
Private Sub Timer1_Timer()
If MSComm1.InBufferCount = 2 Then
y = Val(MSComm1.Input)
Text1.Text = y
End If
End Sub

Private Sub Check9_Click()
If Check9.Value = 0 Then
Check9.Caption = "关闭"
Else
Check9.Caption = "打开"
buff(0) = &H9
MSComm1.Output = buff
End If
End Sub

下面的是我下位机的主体程序部分:
void Send(uint dat)
{
EA=0;
SBUF=(dat/10)+48;
while(!TI);
TI=0;
SBUF=(dat%10)+48;
while(!TI);
TI=0;
EA=1;
}
/*------------------------------------------------
测量距离
------------------------------------------------*/
uint celiang(void)
{
uint S; //距离变量
TIM0init(); //初始化定时器0

TRIG=1; //触发信号是高电平脉冲,宽度大于10us
DelayUs2x(10);
TRIG=0;
while(!ECHO); //等待高电平
TR0=1;
while(ECHO); //等待低电平
TR0=0;
S=TH0*256+TL0;//取出定时器值高8位和低8位合并
S=S/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
TH0=0;
TL0=0; //清除定时器0寄存器中的值

DelayMs(250); //延时决定采样速度

return S;

}

这个是发送测量数据给单片机的,主要是讲单片机超声波测得的距离发送给单片机,用LCD1602显示并没有错,距离显示正确,用串口助手调试,串口助手能显示接收到的距离数据,所以感觉总体就是与上位机的通信除了问题,无法实时显示,真的是很头疼。
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-21
  • 打赏
  • 举报
回复
先注释掉所有的On Error Resume语句,然后在IDE中运行。
赵4老师 2016-03-21
  • 打赏
  • 举报
回复
ReDim buff(0) buff(0) = &H9 MSComm1.Output = buff
一笑拔剑 2016-03-20
  • 打赏
  • 举报
回复
引用 5 楼 mx_try 的回复:
回复bakw: 我波特率是4800,在Comm事件里来处理接收到的数据,我刚学VB,本想着Timer简单,就用这个,但是我觉得并没有什么出错,用Comm事件来处理,还没精通。当一个timer里有多个字节接收时就会失灵,这个我不太明白,不是当MSComm1.InBufferCount = 2 ,就处理数据吗?
这个明显不对的 因为不是每一次timer刚好数字就等于2的. 有可能发过来两次,那就是4,然后就你继续不下去了.
mx_try 2016-03-20
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
TextBox1.Refresh
我添加了这句话以后,也是要打开串口,再关闭串口,再打开串口,重复几次后,才会有显示数据,但是会出现一个错误:“实时错误424,要求对象”。
mx_try 2016-03-20
  • 打赏
  • 举报
回复
引用 1 楼 aspower_ 的回复:
两个问题 我不知道你这个下位机怎么返回的? 定时返回的?还是需要你发送 buff(0) = &H9 他才返回 如果是要你发送buff(0) = &H9才会返回 那你这边TIMER里没有发送数据出去,下位机当然没有数据返回了 第二 如果是下位机是自动返回的 那么你timer会不会有重复运行的可能,因为timer再循环中是不管你前一个循环有没有结束,时间到了第二个循环就要开始的. 如果需要获得接收缓冲区的所有内容,就必须将 InputLen 属性设置为 0。这可以在设计时或运行时设置。 数据判断也不能太死板 代码建议如下

Private Sub Timer1_Timer()
   Timer1.Enabled = False '关闭定时器
  s= MSComm1.InBufferCount
 If MSComm1.InBufferCount = 2 Then
        y = Val(MSComm1.Input)
        Text1.Text = y        
    End If
  Timer1.Enabled = true '重新开启定时器
End Sub
你可以把断点 设在 s= MSComm1.InBufferCount 然后跟踪看一下,这个值对不对.
发送 buff(0) = &H9,这个语句是我上位机发送给下位机的一个数据,下位再根据这个接收到的数据点亮对应的LED。我本来有点怀疑是否是不是不能上位机发送数据给下位机的时候,下位机发送数据给上位机,但是我在下位机的发送给上位机的函数void Send(uint dat)中有添加EA=0;EA=1;这两句。所以应该不会引起冲突。用串口助手都能一直接收到下位机发送的数据,而且利用串口助手发送数据给下位机,下位机也能准确接收。 我有按你的代码修改过了, InputLen 也试着改成,但发现情况跟之前的一样,我也跟踪了一下这个值,发现S这个值要么是空值,要么是0。 会不会是Timer的Interval的值设置有问题?
一笑拔剑 2016-03-19
  • 打赏
  • 举报
回复
两个问题 我不知道你这个下位机怎么返回的? 定时返回的?还是需要你发送 buff(0) = &H9 他才返回 如果是要你发送buff(0) = &H9才会返回 那你这边TIMER里没有发送数据出去,下位机当然没有数据返回了 第二 如果是下位机是自动返回的 那么你timer会不会有重复运行的可能,因为timer再循环中是不管你前一个循环有没有结束,时间到了第二个循环就要开始的. 如果需要获得接收缓冲区的所有内容,就必须将 InputLen 属性设置为 0。这可以在设计时或运行时设置。 数据判断也不能太死板 代码建议如下

Private Sub Timer1_Timer()
   Timer1.Enabled = False '关闭定时器
  s= MSComm1.InBufferCount
 If MSComm1.InBufferCount = 2 Then
        y = Val(MSComm1.Input)
        Text1.Text = y        
    End If
  Timer1.Enabled = true '重新开启定时器
End Sub
你可以把断点 设在 s= MSComm1.InBufferCount 然后跟踪看一下,这个值对不对.
赵4老师 2016-03-19
  • 打赏
  • 举报
回复
TextBox1.Refresh
笨狗先飞 2016-03-19
  • 打赏
  • 举报
回复
If MSComm1.InBufferCount = 2 Then 可能会导致当一个timer里有多个字节接收时就会失灵 因为总不会这么巧这次正好是两个,除非你单片机发送频度比较低 最好还是在Comm事件里来处理接收到的数据,同时还要处理MSComm1.InBufferCount 小于1或者大于2的情况。
mx_try 2016-03-19
  • 打赏
  • 举报
回复
回复bakw: 我波特率是4800,在Comm事件里来处理接收到的数据,我刚学VB,本想着Timer简单,就用这个,但是我觉得并没有什么出错,用Comm事件来处理,还没精通。当一个timer里有多个字节接收时就会失灵,这个我不太明白,不是当MSComm1.InBufferCount = 2 ,就处理数据吗?
mx_try 2016-03-19
  • 打赏
  • 举报
回复
回复zhao4zhong1: 我添加了这句话以后,也是要打开串口,再关闭串口,再打开串口,重复几次后,才会有显示数据,但是会出现一个错误:“实时错误424,要求对象”。
mx_try 2016-03-19
  • 打赏
  • 举报
回复
回复aspower_: 发送 buff(0) = &H9,这个语句是我上位机发送给下位机的一个数据,下位再根据这个接收到的数据点亮对应的LED。我本来有点怀疑是否是不是不能上位机发送数据给下位机的时候,下位机发送数据给上位机,但是我在下位机的发送给上位机的函数void Send(uint dat)中有添加EA=0;EA=1;这两句。所以应该不会引起冲突。用串口助手都能一直接收到下位机发送的数据,而且利用串口助手发送数据给下位机,下位机也能准确接收。 我有按你的代码修改过了, InputLen 也试着改成,但发现情况跟之前的一样,我也跟踪了一下这个值,发现S这个值要么是空值,要么是0。 会不会是Timer的Interval的值设置有问题?

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧