在PowerPoint幻灯片放映期间,SerialPort.DataReceived事件停止

时间:2014-11-22 03:53:23

标签: vb.net serial-port powerpoint add-in

使用VS2012(.NET)我正在为PowerPoint(2010)开发一个功能区样式加载项,我希望传入的串行端口值通过算法传递,并根据输出执行诸如下一张幻灯片或上一张幻灯我正在使用SerialPort.DataReceived事件处理程序。

使用迭代变量 j 解释我的问题更简单,每次调用SerialPort.DataReceived事件处理程序时,该变量值增加1。我将在代码之后更详细地解决问题,但简而言之,一旦我的代码被调用, j 在幻灯片演示开始之前就会增加值幻灯片演示30秒左右。处于演示模式约30秒后, j 停止迭代。我正在使用Breakpoint When Hit和调试Output窗口观察 j 的值。

在一个类(class2)中,与通过单击功能区按钮启动的表单相关联,单击所述表单中的按钮设置SerialPort.DataReceived处理程序并打开串行端口(缩写相关代码):

Public Class class2 'called by clicking ribbon button
    Public sp As New SerialPort
    Public Baud As Integer = 9600
    Public Port As String
    Public c1 As class1

    Public Sub New(oParent As class1) 'get reference to parent class
        c1= oParent
        InitializeComponent()
    End Sub
    ....

    Public Sub btn1_Click(sender As Object, e As EventArgs) _
        Handles btn1.Click
        Port = lbCom.SelectedItem 'Port selected from form listbox
        Try
            With sp
                .BaudRate = Baud
                .PortName = Port
                .ReadTimeout = 5000   'Give serial port 5sto open
                .RtsEnable = True
            End With

            c1.mySP = sp
            AddHandler sp.DataReceived, AddressOf c1.spDataReceivedHandler
            sp.Open()
            Me.Hide()
        Catch ex As Exception
            MsgBox("Error", vbOKOnly, "Connection Error")
        End Try
    End Sub
End Class

在主类(class1)中,我有DataReceived Handler和迭代变量 j (再次,缩写相关代码):

Public Class class1
    ...
    Public Sub spDataReceivedHandler(ByVal sender As Object, _ 
        e As SerialDataReceivedEventArgs)
        j = j + 1 ' value monitored using Breakpoint When Hit
    End Sub
End Class

有关此问题的更多详细信息。一旦我开始我的代码,如果我没有开始幻灯片演示 j 将迭代没有任何问题(5 +分钟)。如果我开始幻灯片演示,但立即按下alt + tab以将焦点放在另一个应用程序上,比如说VS, j 将迭代而没有任何问题(PowerPoint仍然处于演示模式)。如果我开始幻灯片演示并让它具有焦点 j 将在~30秒后停止迭代,无论我在开始幻灯片演示之前让 j 迭代多久。

我也尝试使用后台工作程序而不是串口事件处理程序,我使用do循环从串口获取数据,但我遇到了同样的问题;按预期工作,直到幻灯片演示已运行约30秒。

我已经使用相同的串口参数和相同的设备编写了两个单独的Windows窗体样式应用程序,它们工作正常。据我所知,这个问题是幻灯片演示有焦点(我猜测资源可用性?)。

我将尝试使用任务并行库,但如果有人对上述令人抓狂的问题存在的原因有任何见解请赐教(注意:相对新手程序员,所以如果有一个明显的错误我的方法也请让我知道)。感谢。

1 个答案:

答案 0 :(得分:0)

好吧,所以不知道为什么这个程序的表现如此,但是解决方法确实是打开并监控"串行端口代码到ThisAddIn类的子类中,并在适当时将其称为新任务(单击按钮)。

单击我的自定义功能区上的按钮:

Public Class myribbon    
    Private Sub btn_Click(sender As Object, e As RibbonControlEventArgs) _
        Handles btn.Click
        ' Define new task spTask (sub located in ThisAddIn)
        Dim spTask = New Task(Sub() Globals.ThisAddIn.readToSP())   
    End Sub
End Class

Public Class ThisAddIn
    ...' other stuff
    Dim mySP As New SerialPort
    Public Sub readToSP()
        ...' serial port params
        Try
            mySP.Open()
            While (mySP.IsOpen)
                Dim analogV As String = mySP.ReadTo(delimStr)
                ...' do something with analogV
            End While
        Catch ex as Exception 'appropriate catches...
        End Try
    End Sub
End Class