Sub RunScript(ByVal StepNumber As Integer) Select Case StepNumber Case 0 OpenPort() Print("Port has been opened") Case 1 'Print(StoredValue) Print(CInt(Val(StoredValue))) 'A = StoredValue Case 2 ClosePort() Print("Port has been closed") End Select End Sub#Region "Additional methods and Type declarations" ' I wrapped this in a class, but you would need to work it into the grasshopper class Private WithEvents CPort As New IO.Ports.SerialPort 'port with events Private TempBuffer As String = String.Empty 'holds the input between events until we get a new line Private Delegate Sub HandleComPortDelegate() 'allows com port to run in a background thread without blocking Private StoredValue As String = String.Empty 'holds value from port until you call for it Sub OpenPort() 'called early in the app, before the port is ever needed. This attaches the port, and opens it to listen. Try If CPort.IsOpen = False Then CPort = My.Computer.Ports.OpenSerialPort("COM3", 9600) End If Catch ex As Exception 'MessageBox.Show("no port") MessageBox.show(ex.tostring) End Try End Sub 'this would be better as a property, but I don't know how Grasshopper handles properties Function GetValue() As String Return StoredValue End Function 'this is fired by the port when it has data Private Sub CPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CPort.DataReceived Dim HndlComPort As New HandleComPortDelegate(AddressOf HandleComPort) 'declare thread HndlComPort.Invoke() ' invoke a new delegate to digest the events End Sub Private Sub HandleComPort() 'background handler for com port TempBuffer &= CPort.ReadExisting 'append into tempbuffer If (Strings.Right(TempBuffer, 2) = vbCrLf) Then 'if end of item 'this may need to be changed, since Arduino's println may use cr or lf only. I can't remember at this point. StoredValue = TempBuffer 'offload TempBuffer = String.Empty 'reset End If End Sub 'should be called when the port is no longer needed. Private Sub ClosePort() If CPort IsNot Nothing Then If CPort.IsOpen = True Then CPort.Close() End If CPort.Dispose() End If End Sub#End Region
Please enter a valid email to subscribe
We need to confirm your email address.
To complete the subscription, please click the link in the
email we just sent you.
Thank you for subscribing!
via Egeo 16