2014-11-22 57 views
0

使用VS2012(.NET)我正在开发一个适用于PowerPoint(2010)的功能区栏样式外接程序,我希望传入的串行端口值可以通过算法传递,输出,执行诸如下一张幻灯片或上一张幻灯片之类的动作。我正在使用SerialPort.DataReceived事件处理程序。SerialPort.DataReceived事件在PowerPoint幻灯片放映中停止

我的问题更简单地使用迭代变量j来解释,每次调用SerialPort.DataReceived事件处理函数时,它的值增加1。我将在代码后更详细地说明问题,但总而言之,一旦我的代码被称为j在幻灯片展示的前30秒左右幻灯片展示开始前的预期值增加。在演示模式下约30秒后,停止迭代。我正在使用“点击时断点”和“调试输出”窗口观察值j

在一个类(等级2),通过单击功能区按钮推出了表单关联,点击一个按钮在上述的形式设置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 

在主类(1类)我有DataReceived处理器和迭代变量Ĵ(再次,缩写相关的代码):

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 +选项卡将焦点放到另一个应用程序上,比如说VS,j将无任何问题地迭代(PowerPoint仍处于演示模式)。如果我开始幻灯片演示并让其具有焦点j将在约30秒后停止迭代,无论我在开始幻灯片演示之前多长时间迭代一次。

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

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

我要使用任务并行库来尝试我的运气,但如果任何人有任何洞察力,为什么存在上述疯狂的问题请开导我(注意:相对新手程序员,所以如果有一个明显的错误在我的方法中,请让我知道)。谢谢。

回答

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