标题:程序停留等待的问题
只看楼主
woshiaokeman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:123
注 册:2011-4-5
结帖率:100%
已结贴  问题点数:40 回复次数:4 
程序停留等待的问题
这个问题已经困扰我差不多一个月都解决不了,希望大家一起讨论讨论,所以在VB和都发帖寻求大家帮助!

我用的是serialport这个控件,类似于MSComm这个控件。

问题:
按下按键test之后,发送 ATE0回车 收到OK之后 发送AT回车 收到OK之后 发送AT+CSQ回车 收到OK之后结束。

先贴上接收的函数:
程序代码:
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As ) Handles SerialPort1.DataReceived
        strReceive = String.Empty

        strReceive = SerialPort1.ReadExisting.ToString

    End Sub
strReceive这个是接收的字符串(全局变量)
这段函数没有问题,我测试过能接收到一串字符串,而不是单个字符,希望大家放心。

这个按键的功能就是这样。
首先使用SerialPort1.Write("ATE0" & vbCrLf)给串口发送数据
如果是在单片机里面编程等待收到OK是这样吧!
while(当收到数据不等于OK); //等收到数据等于OK就退出循环
如果在VB使用这种方法那么程序会出现卡死状态(未响应)

然后我我就想使用两个线程解决这个问题!
但是又遇到了麻烦。
首先贴上判断接收到的函数:
程序代码:
    Private Sub Hand(ByVal dat As Object)
        While Regex.IsMatch(strReceive, "OK") = False
            Thread.Sleep(1000)
        End While

        Select Case dat
            Case "test"
                ThreadTest.Resume()
            Case "start"
                ThreadStart.Resume()
            Case "send"
                ThreadSend.Resume()
        End Select

        ThreadHand.Abort()
    End Sub
当收到OK之后推出循环,恢复原来的线程

下面这里就是我按下test之后启动的函数,也是当线程处理:
程序代码:
    Private Sub Test()
        SerialPort1.Write("ATE0" & vbCrLf)
        ThreadHand.Start("test")
        ThreadTest.Suspend()

        SerialPort1.Write("AT" & vbCrLf)
        ThreadHand.Start("test")
        ThreadTest.Suspend()

        SerialPort1.Write("AT+CSQ" & vbCrLf)
        ThreadHand.Start("test")
        ThreadTest.Suspend()

    End Sub
同过这些函数其实意思很明了,就是 发送数据-等待接收-挂起本线程-接收OK后恢复线程-继续发送。。。
但是结果就是实现不了,希望大家帮帮我。


搜索更多相关主题的帖子: color 
2013-04-13 20:45
woshiaokeman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:123
注 册:2011-4-5
得分:0 
没人帮帮我么 - -! 好纠结
2013-04-14 11:06
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
得分:40 
貌似不需要再开启一个线程
程序代码:
 Private Sub Hand(ByVal dat As Object)
100:
        While Regex.IsMatch(strReceive, "OK") = False
            Application.DoEvents()
            GoTo 100
            Exit Sub
        End While

        Select Case dat
            Case "test"
                ThreadTest.Resume()
            Case "start"
                ThreadStart.Resume()
            Case "send"
                ThreadSend.Resume()
        End Select

        ThreadHand.Abort()
    End Sub

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2013-04-14 11:28
woshiaokeman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:123
注 册:2011-4-5
得分:0 
回复 3楼 不说也罢
其实我这个思路是不对的。。。
ThreadHand.Abort()
这句话也错了 - -!
2013-04-15 15:40
woshiaokeman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:123
注 册:2011-4-5
得分:0 
回复 3楼 不说也罢
虽然这个方法解决不了,但是自己想到了一个好方法。。
感谢回答
2013-04-17 17:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-404111-1-1.html




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

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