【问题标题】:SerialPort.DataReceived Event stops during PowerPoint SlideshowSerialPort.DataReceived 事件在 PowerPoint 幻灯片放映期间停止
【发布时间】:2014-12-12 01:40:41
【问题描述】:

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

使用迭代变量 j 可以更简单地解释我的问题,每次调用 SerialPort.DataReceived 事件处理程序时,该变量的值都会增加 1。我将在代码之后详细说明问题,但简而言之,一旦我的代码被调用 j,在幻灯片演示开始之前,价值就会按预期增加 30 秒左右的幻灯片演示。处于演示模式大约 30 秒后,j 停止迭代。我正在使用 Breakpoint When Hit 和调试输出窗口查看 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 窗体样式应用程序,它们工作正常。据我所知,问题在于幻灯片演示具有焦点(我猜资源可用性?)。

我将使用 Task Parallel 库来试试运气,但如果有人对为什么存在上述令人抓狂的问题有任何见解,请赐教(注意:相对新手程序员,所以如果出现明显的错误我的方法也请告诉我)。谢谢。

【问题讨论】:

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


    【解决方案1】:

    好的,所以不知道为什么程序会这样,但解决方法确实是将“打开和监视”串行端口代码放入 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2014-07-14
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多