Hello I am able to handle a particular event in VB.NET but I am unable to do so in C#.
This is what I'm doing in VB.NET
=====================================================================
Public Class Form2
Inherits System.Windows.Forms.Form
Private WithEvents moRS232 As Rs232
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents Button2 As System.Windows.Forms.Button
Private Sub InitializeComponent()
Me.Label1 = New System.Windows.Forms.Label
Me.Button1 = New System.Windows.Forms.Button
Me.Button2 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 56)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(224, 192)
Me.Label1.TabIndex = 0
Me.Label1.Text = "Label1"
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(216, 8)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 1
Me.Button1.Text = "stop"
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(112, 8)
Me.Button2.Name = "Button2"
Me.Button2.TabIndex = 2
Me.Button2.Text = "start"
'
'Form2
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.Label1)
Me.Name = "Form2"
Me.Text = "Form2"
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
moRS232 = New Rs232
moRS232.BaudRate = 9600
moRS232.Port = 1
moRS232.DataBit = 8
moRS232.StopBit = Rs232.DataStopBit.StopBit_1
moRS232.Parity = Rs232.DataParity.Parity_None
moRS232.Timeout = 1500
moRS232.BufferSize = 128
moRS232.RxBufferThreshold = 128
moRS232.Open()
moRS232.Write("}Cw,d:GCW,b:07,f:1!" + vbLf)
moRS232.EnableEvents()
End Sub
Private Sub moRS232_CommEvent(ByVal source As Rs232, ByVal Mask As Rs232.EventMasks) Handles moRS232.CommEvent
Label1.Text = Label1.Text & " hello"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
moRS232.Write("}Cw,d:GCW,b:0,f:1!" + vbLf)
Label1.Text = ""
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
moRS232.Write("}Cw,d:GCW,b:07,f:1!" + vbLf)
End Sub
End Class
==================================================================
I am having trouble doing this in C#
==================================================================
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Text;
using ClassLibrary1;
namespace WindowsApplication7
{
///
/// Summary description for Form1.
///
public class Form1 : System.Windows.Forms.Form
{
public ClassLibrary1.Rs232 rs232 = new Rs232();
public delegate void CommEventHandler(Rs232 source, Rs232.EventMasks mask);
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
rs232.CommEvent += new CommEventHandler(this.moRS232_CommEvent); //Improper Syntax
//
// TODO: Add any constructor code after InitializeComponent call
//
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(160, 168);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "stop";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.Location = new System.Drawing.Point(48, 48);
this.label1.Name = "label1";
this.label1.TabIndex = 1;
this.label1.Text = "label1";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
rs232.BaudRate = 9600;
rs232.Port = 1;
rs232.DataBit = 8;
rs232.StopBit = Rs232.DataStopBit.StopBit_1;
rs232.Parity = Rs232.DataParity.Parity_None;
rs232.Timeout = 1500;
rs232.BufferSize = 128;
rs232.RxBufferThreshold = 128;
rs232.Open();
rs232.Write("}Cw,d:GCW,b:07,f:1!\r");
rs232.EnableEvents();
//OnAction(rs232, rs232.meMask);
//Would like Handler to start checking for events here
}
private void button1_Click(object sender, System.EventArgs e)
{
rs232.Write("}Cw,d:GCW,b:0,f:1!\r");
}
private void moRS232_CommEvent(Rs232 source, Rs232.EventMasks Mask)
{
label1.Text = label1.Text + " hello";
Application.DoEvents();
} }
}
===================================================================
For VB.NET
I'm using this class for RS232 objects.
For C# I am referencing a (compiled) assembly of this class file.
====================================================================
Imports System.Runtime.InteropServices
Imports System.Text
Imports System.Threading
Imports System.ComponentModel
Imports System.IO
#Region "RS232"
Public Class Rs232 : Implements IDisposable
'===================================================
'
' Module : Rs232
' Description : Class for handling RS232 comunication with VB.Net
' Created : 10/08/2001 - 8:45:25
' Author : Corrado Cavalli ([email protected])
'WebSite : www.codeworks.it/net/index.htm
'
' Notes :
'-----------------------------------------------------------------------------------------------
' * Revisions *
'
' 02/12/2000 First internal alpha version built on framework beta1
'
' 1st Public release Beta2 (10/08/2001)
'
' Rev.1 (28.02.2002)
' 1. Added ResetDev, SetBreak and ClearBreak to the EscapeCommFunction constants
' 2. Added the overloaded Open routine.
' 3. Added the modem status routines, properties and enum.
' 4. If a read times out, it now returns a EndOfStreamException (instead of a simple Exception).
' 5.Compiled with VS.Net final
' Rev.2 (01.03.2002)
' Added Async support
'
' Rev.3 (07.04.2002)
' Minor bugs fixed
'
' Rev.3 (05/05/2002)
' Fixed BuildCommmDCB problem
'
' Rev.4 (24/05/2002)
' Fixed problem with ASCII Encoding truncating 8th bit
'
' Rev.5 (27/05/2002)
' Added IDisposable / Finalize implementation
'
' Rev.6 (14/03/2003)
' Fixed problem on DCB fields Initialization
'
' Rev.7 (26/03/2003)
' Added XON/XOFF support
'
' Rev.8 (12/07/2003)
' Added support to COM port number greater than 4
'
' Rev.9 (15/07/2003)
' Added CommEvent to detect incoming chars/events
' Updated both Tx/Rx method from Non-Ovelapped to Overlapped mode
' Removed unused Async methods and other stuff.
'
' Rev.10 (21/07/2003)
' Fixed incorrect character handling when using EnableEvents()
'
' Rev.11 (12/08/2003)
' Fixed some bugs signaled by users
'
' Rev.12 (01/09/2003)
' Removed AutoReset of internal buffers and added PurgeBuffer() method
'
' Rev.13 (02/09/2003)
' Removed GetLastErrorUse in favour of Win32Exception()
'
' Rev.14 (14/09/2003)
' Added IsPortAvailable() function
' Revised some API declaration
' Fixed problem with Win98/Me OS
'
' Rev.15 (24/09/2003)
' Fixed bug introduced on Rev.14
'
' Rev.16 (12/10/2003)
' Added SetBreak/ClearBreak() methods
'
' Rev.17 (02/11/2003)
' Fixed field on COMMCONFIG
'
' Rev.18 (03/03/2004)
' Fixed bug: Testing mhRS for <>0 is not correct
'
' Rev.19 (08/04/2004)
' Fixed bug: Fixed bug on DTR property
'
' Rev.20 (12/07/2004)
' CommEvent is no more raised on a secondary thread
' pEventsWatcher now uses a background thread
'
' Rev.21 (24/10/2004)
' EscapeCommFunction declaration fixed
' Pariti enum fixed to Parity
'
' Rev. 22 (05/03/2005)
' Fixed memory leak problem causing program closing
' without any message on some systems.
' Thanks to Ralf Gedrat for testing this scenario
'
' Rev.23 (05/04/2005)
' Fixed bug DisableEvents not working bug
'
' Rev.24 (20/04/2005)
' Fixed memory leak on Read method
' Added InBufferCount property
' IsPortAvailable method is now shared
' Thanks to Jean-Pierre ZANIER for the feedback
'===================================================
'// Class Members
Private mhRS As IntPtr = New IntPtr(0) '// Handle to Com Port
Private miPort As Integer = 1 '// Default is COM1
Private miTimeout As Int32 = 70 '// Timeout in ms
Private miBaudRate As Int32 = 9600
Private meParity As DataParity = 0
Private meStopBit As DataStopBit = 0
Private miDataBit As Int32 = 8
Private miBufferSize As Int32 = 512 '// Buffers size default to 512 bytes
Private mabtRxBuf As Byte() '// Receive buffer
Private meMode As Mode '// Class working mode
Private moThreadTx As Thread
Private moThreadRx As Thread
Private moEvents As Thread
Private miTmpBytes2Read As Int32
Private meMask As EventMasks
Private mbDisposed As Boolean
Private mbUseXonXoff As Boolean
Private mbEnableEvents As Boolean
Private miBufThreshold As Int32 = 1
Private muOvlE As OVERLAPPED
Private muOvlW As OVERLAPPED
Private muOvlR As OVERLAPPED
Private mHE As GCHandle
Private mHR As GCHandle
Private mHW As GCHandle
'----------------------------------------------------------------------------------------
#Region "Enums"
'// Parity Data
Public Enum DataParity
Parity_None = 0
Parity_Odd
Parity_Even
Parity_Mark
End Enum
'// StopBit Data
Public Enum DataStopBit
StopBit_1 = 1
StopBit_2
End Enum
Public Enum PurgeBuffers
RXAbort = &H2
RXClear = &H8
TxAbort = &H1
TxClear = &H4
End Enum
Private Enum Lines
SetRts = 3
ClearRts = 4
SetDtr = 5
ClearDtr = 6
ResetDev = 7 ' // Reset device if possible
SetBreak = 8 ' // Set the device break line.
ClearBreak = 9 ' // Clear the device break line.
End Enum
'// Modem Status
Public Enum ModemStatusBits
ClearToSendOn = &H10
DataSetReadyOn = &H20
RingIndicatorOn = &H40
CarrierDetect = &H80
End Enum
'// Working mode
Public Enum Mode
NonOverlapped
Overlapped
End Enum
'// Comm Masks
Public Enum EventMasks
RxChar = &H1
RXFlag = &H2
TxBufferEmpty = &H4
ClearToSend = &H8
DataSetReady = &H10
CarrierDetect = &H20
Break = &H40
StatusError = &H80
Ring = &H100
End Enum
#End Region
#Region "Structures"
Private Structure DCB
Public DCBlength As Int32
Public BaudRate As Int32
Public Bits1 As Int32
Public wReserved As Int16
Public XonLim As Int16
Public XoffLim As Int16
Public ByteSize As Byte
Public Parity As Byte
Public StopBits As Byte
Public XonChar As Char
Public XoffChar As Char
Public ErrorChar As Char
Public EofChar As Char
Public EvtChar As Char
Public wReserved2 As Int16
End Structure
Private Structure COMMTIMEOUTS
Public ReadIntervalTimeout As Int32
Public ReadTotalTimeoutMultiplier As Int32
Public ReadTotalTimeoutConstant As Int32
Public WriteTotalTimeoutMultiplier As Int32
Public WriteTotalTimeoutConstant As Int32
End Structure
Private Structure COMMCONFIG
Public dwSize As Int32
Public wVersion As Int16
Public wReserved As Int16
Public dcbx As DCB
Public dwProviderSubType As Int32
Public dwProviderOffset As Int32
Public dwProviderSize As Int32
Public wcProviderData As Int16
End Structure
Public Structure OVERLAPPED
Public Internal As Int32
Public InternalHigh As Int32
Public Offset As Int32
Public OffsetHigh As Int32
Public hEvent As IntPtr
End Structure
Private Structure COMSTAT
Dim fBitFields As Int32
Dim cbInQue As Int32
Dim cbOutQue As Int32
End Structure
#End Region
#Region "Constants"
Private Const PURGE_RXABORT As Integer = &H2
Private Const PURGE_RXCLEAR As Integer = &H8
Private Const PURGE_TXABORT As Integer = &H1
Private Const PURGE_TXCLEAR As Integer = &H4
Private Const GENERIC_READ As Integer = &H80000000
Private Const GENERIC_WRITE As Integer = &H40000000
Private Const OPEN_EXISTING As Integer = 3
Private Const INVALID_HANDLE_VALUE As Integer = -1
Private Const IO_BUFFER_SIZE As Integer = 1024
Private Const FILE_FLAG_OVERLAPPED As Int32 = &H40000000
Private Const ERROR_IO_PENDING As Int32 = 997
Private Const WAIT_OBJECT_0 As Int32 = 0
Private Const ERROR_IO_INCOMPLETE As Int32 = 996
Private Const WAIT_TIMEOUT As Int32 = &H102&
Private Const INFINITE As Int32 = &HFFFFFFFF
#End Region
#Region "Win32API"
'// Win32 API
Private Shared Function SetCommState(ByVal hCommDev As IntPtr, ByRef lpDCB As DCB) As Int32
End Function
Private Shared Function GetCommState(ByVal hCommDev As IntPtr, ByRef lpDCB As DCB) As Int32
End Function
Private Shared Function BuildCommDCB(ByVal lpDef As String, ByRef lpDCB As DCB) As Int32
End Function
Private Shared Function SetupComm(ByVal hFile As IntPtr, ByVal dwInQueue As Int32, ByVal dwOutQueue As Int32) As Int32
End Function
Private Shared Function SetCommTimeouts(ByVal hFile As IntPtr, ByRef lpCommTimeouts As COMMTIMEOUTS) As Int32
End Function
Private Shared Function GetCommTimeouts(ByVal hFile As IntPtr, ByRef lpCommTimeouts As COMMTIMEOUTS) As Int32
End Function
Private Shared Function ClearCommError(ByVal hFile As IntPtr, ByRef lpErrors As Int32, ByRef lpComStat As COMSTAT) As Int32
End Function
Private Shared Function PurgeComm(ByVal hFile As IntPtr, ByVal dwFlags As Int32) As Int32
End Function
Private Shared Function EscapeCommFunction(ByVal hFile As IntPtr, ByVal ifunc As Int32) As Boolean
End Function
Private Shared Function WaitCommEvent(ByVal hFile As IntPtr, ByRef Mask As EventMasks, ByRef lpOverlap As OVERLAPPED) As Int32
End Function
Private Shared Function WriteFile(ByVal hFile As IntPtr, ByVal Buffer As Byte(), ByVal nNumberOfBytesToWrite As Integer, ByRef lpNumberOfBytesWritten As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer
End Function
Private Shared Function ReadFile(ByVal hFile As IntPtr, ByVal Buffer As Byte(), ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer
End Function
Private Shared Function CreateFile(ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As IntPtr
End Function
Private Shared Function CloseHandle(ByVal hObject As IntPtr) As Boolean
End Function
Public Shared Function GetCommModemStatus(ByVal hFile As IntPtr, ByRef lpModemStatus As Int32) As Boolean
End Function
Private Shared Function SetEvent(ByVal hEvent As IntPtr) As Boolean
End Function
Private Shared Function CreateEvent(ByVal lpEventAttributes As IntPtr, ByVal bManualReset As Int32, ByVal bInitialState As Int32, ByVal lpName As String) As IntPtr
End Function
Private Shared Function WaitForSingleObject(ByVal hHandle As IntPtr, ByVal dwMilliseconds As Int32) As Int32
End Function
Private Shared Function GetOverlappedResult(ByVal hFile As IntPtr, ByRef lpOverlapped As OVERLAPPED, ByRef lpNumberOfBytesTransferred As Int32, ByVal bWait As Int32) As Int32
End Function
Private Shared Function SetCommMask(ByVal hFile As IntPtr, ByVal lpEvtMask As Int32) As Int32
End Function
Private Shared Function GetDefaultCommConfig(ByVal lpszName As String, ByRef lpCC As COMMCONFIG, ByRef lpdwSize As Integer) As Boolean
End Function
Private Shared Function SetCommBreak(ByVal hFile As IntPtr) As Boolean
End Function
Private Shared Function ClearCommBreak(ByVal hFile As IntPtr) As Boolean
End Function
#End Region
#Region "Events"
Public Event CommEvent As CommEventHandler
#End Region
#Region "Delegates"
Public Delegate Sub CommEventHandler(ByVal source As Rs232, ByVal Mask As EventMasks)
#End Region
Public Property Port() As Integer
'===================================================
'
' Description : Comunication Port
' Created : 21/09/2001 - 11:25:49
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return miPort
End Get
Set(ByVal Value As Integer)
miPort = Value
End Set
End Property
Public Sub PurgeBuffer(ByVal Mode As PurgeBuffers)
'===================================================
' ©2003 ALSTOM FIR S.p.A All rights reserved
'
' Description : Purge Communication Buffer
' Created : 01/09/03 - 10:37:39
' Author : Corrado Cavalli
'
' *Parameters Info*
'
' Notes : This method will clear any character into buffer, use TxAbort/RxAbort
' to terminate any pending overlapped Tx/Rx operation.
'===================================================
If (mhRS.ToInt32 > 0) Then PurgeComm(mhRS, Mode)
End Sub
Public Overridable Property Timeout() As Integer
'===================================================
'
' Description: Comunication timeout in seconds
' Created : 21/09/2001 - 11:26:50
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return miTimeout
End Get
Set(ByVal Value As Integer)
miTimeout = CInt(IIf(Value = 0, 500, Value))
'// If Port is open updates it on the fly
pSetTimeout()
End Set
End Property
Public Property Parity() As DataParity
'===================================================
'
' Description : Comunication parity
' Created : 21/09/2001 - 11:27:15
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return meParity
End Get
Set(ByVal Value As DataParity)
meParity = Value
End Set
End Property
Public Property StopBit() As DataStopBit
'===================================================
'
' Description: Comunication StopBit
' Created : 21/09/2001 - 11:27:37
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return meStopBit
End Get
Set(ByVal Value As DataStopBit)
meStopBit = Value
End Set
End Property
Public Property BaudRate() As Integer
'===================================================
'
' Description: Comunication BaudRate
' Created : 21/09/2001 - 11:28:00
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return miBaudRate
End Get
Set(ByVal Value As Integer)
miBaudRate = Value
End Set
End Property
Public Property DataBit() As Integer
'===================================================
'
' Description : Comunication DataBit
' Created : 21/09/2001 - 11:28:20
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return miDataBit
End Get
Set(ByVal Value As Integer)
miDataBit = Value
End Set
End Property
Public Property BufferSize() As Integer
'===================================================
'
' Description : Receive Buffer size
' Created : 21/09/2001 - 11:33:05
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return miBufferSize
End Get
Set(ByVal Value As Integer)
miBufferSize = Value
End Set
End Property
Public Overloads Sub Open()
'===================================================
'
' Description : Initializes and Opens comunication port
' Created : 21/09/2001 - 11:33:40
'
' *Parameters Info*
'
' Notes :
'===================================================
'// Get Dcb block,Update with current data
Dim uDcb As DCB, iRc As Int32
'// Set working mode
meMode = Mode.Overlapped
Dim iMode As Int32 = Convert.ToInt32(IIf(meMode = Mode.Overlapped, FILE_FLAG_OVERLAPPED, 0))
'// Initializes Com Port
If miPort > 0 Then
Try
'// Creates a COM Port stream handle
mhRS = CreateFile("\\.\COM" & miPort.ToString, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, iMode, 0)
If (mhRS.ToInt32 > 0) Then
'// Clear all comunication errors
Dim lpErrCode As Int32
iRc = ClearCommError(mhRS, lpErrCode, New COMSTAT)
'// Clears I/O buffers
iRc = PurgeComm(mhRS, PurgeBuffers.RXClear Or PurgeBuffers.TxClear)
'// Gets COM Settings
iRc = GetCommState(mhRS, uDcb)
'// Updates COM Settings
Dim sParity As String = "NOEM"
sParity = sParity.Substring(meParity, 1)
'// Set DCB State
Dim sDCBState As String = String.Format("baud={0} parity={1} data={2} stop={3}", miBaudRate, sParity, miDataBit, CInt(meStopBit))
iRc = BuildCommDCB(sDCBState, uDcb)
uDcb.Parity = CByte(meParity)
'// Set Xon/Xoff State
If mbUseXonXoff Then
uDcb.Bits1 = 768
Else
uDcb.Bits1 = 0
End If
iRc = SetCommState(mhRS, uDcb)
If iRc = 0 Then
Dim sErrTxt As String = New Win32Exception().Message
Throw New CIOChannelException("Unable to set COM state " & sErrTxt)
End If
'// Setup Buffers (Rx,Tx)
iRc = SetupComm(mhRS, miBufferSize, miBufferSize)
'// Set Timeouts
pSetTimeout()
'//Enables events if required
If mbEnableEvents Then Me.EnableEvents()
Else
'// Raise Initialization problems
Dim sErrTxt As String = New Win32Exception().Message
Throw New CIOChannelException("Unable to open COM" + miPort.ToString + ControlChars.CrLf + sErrTxt)
End If
Catch Ex As Exception
'// Generica error
Throw New CIOChannelException(Ex.Message, Ex)
End Try
Else
'// Port not defined, cannot open
Throw New ApplicationException("COM Port not defined,use Port property to set it before invoking InitPort")
End If
End Sub
Public Overloads Sub Open(ByVal Port As Integer, ByVal BaudRate As Integer, ByVal DataBit As Integer, ByVal Parity As DataParity, ByVal StopBit As DataStopBit, ByVal BufferSize As Integer)
'===================================================
'
' Description: Opens comunication port (Overloaded method)
' Created : 21/09/2001 - 11:33:40
'
' *Parameters Info*
'
' Notes :
'===================================================
Me.Port = Port
Me.BaudRate = BaudRate
Me.DataBit = DataBit
Me.Parity = Parity
Me.StopBit = StopBit
Me.BufferSize = BufferSize
Open()
End Sub
Public Sub Close()
'===================================================
'
' Description: Close comunication channel
' Created : 21/09/2001 - 11:38:00
'
' *Parameters Info*
'
' Notes :
'===================================================
If mhRS.ToInt32 > 0 Then
If mbEnableEvents = True Then
Me.DisableEvents()
End If
Dim ret As Boolean = CloseHandle(mhRS)
If Not ret Then Throw New Win32Exception
mhRS = New IntPtr(0)
End If
End Sub
ReadOnly Property IsOpen() As Boolean
'===================================================
'
' Description: Returns Port Status
' Created : 21/09/2001 - 11:38:51
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return CBool(mhRS.ToInt32 > 0)
End Get
End Property
Public Overloads Sub Write(ByVal Buffer As Byte())
'===================================================
'
' Description: Transmit a stream
' Created : 21/09/2001 - 11:39:51
'
' *Parameters Info*
' Buffer : Array of Byte() to write
' Notes :
'===================================================
Dim iRc, iBytesWritten As Integer, hOvl As GCHandle
'-----------------------------------------------------------------
muOvlW = New Overlapped
If mhRS.ToInt32 <= 0 Then
Throw New ApplicationException("Please initialize and open port before using this method")
Else
'// Creates Event
Try
hOvl = GCHandle.Alloc(muOvlW, GCHandleType.Pinned)
muOvlW.hEvent = CreateEvent(Nothing, 1, 0, Nothing)
If muOvlW.hEvent.ToInt32 = 0 Then Throw New ApplicationException("Error creating event for overlapped writing")
'// Clears IO buffers and sends data
iRc = WriteFile(mhRS, Buffer, Buffer.Length, 0, muOvlW)
If iRc = 0 Then
If Marshal.GetLastWin32Error <> ERROR_IO_PENDING Then
Throw New ApplicationException("Write command error")
Else
'// Check Tx results
If GetOverlappedResult(mhRS, muOvlW, iBytesWritten, 1) = 0 Then
Throw New ApplicationException("Write pending error")
Else
'// All bytes sent?
If iBytesWritten <> Buffer.Length Then Throw New ApplicationException("Write Error - Bytes Written " & iBytesWritten.ToString & " of " & Buffer.Length.ToString)
End If
End If
End If
Finally
'//Closes handle
CloseHandle(muOvlW.hEvent)
If (hOvl.IsAllocated = True) Then hOvl.Free()
End Try
End If
End Sub
Public Overloads Sub Write(ByVal Buffer As String)
'===================================================
'
' Description : Writes a string to RS232
' Created : 04/02/2002 - 8:46:42
'
' *Parameters Info*
'
' Notes : 24/05/2002 Fixed problem with ASCII Encoding
'===================================================
Dim oEncoder As New System.Text.ASCIIEncoding
Dim oEnc As Encoding = oEncoder.GetEncoding(1252)
'-------------------------------------------------------------
Dim aByte() As Byte = oEnc.GetBytes(Buffer)
Me.Write(aByte)
End Sub
Public Function Read(ByVal Bytes2Read As Integer) As Integer
'===================================================
'
' Description: Read Bytes from Port
' Created : 21/09/2001 - 11:41:17
'
' *Parameters Info*
' Bytes2Read : Bytes to read from port
' Returns : Number of readed chars
'
' Notes :
'===================================================
Dim iReadChars, iRc As Integer, bReading As Boolean, hOvl As GCHandle
'--------------------------------------------------------------
'// If Bytes2Read not specified uses Buffersize
If Bytes2Read = 0 Then Bytes2Read = miBufferSize
muOvlR = New Overlapped
If mhRS.ToInt32 <= 0 Then
Throw New ApplicationException("Please initialize and open port before using this method")
Else
'// Get bytes from port
Try
hOvl = GCHandle.Alloc(muOvlR, GCHandleType.Pinned)
muOvlR.hEvent = CreateEvent(Nothing, 1, 0, Nothing)
If muOvlR.hEvent.ToInt32 = 0 Then Throw New ApplicationException("Error creating event for overlapped reading")
'// Clears IO buffers and reads data
ReDim mabtRxBuf(Bytes2Read - 1)
iRc = ReadFile(mhRS, mabtRxBuf, Bytes2Read, iReadChars, muOvlR)
If iRc = 0 Then
If Marshal.GetLastWin32Error() <> ERROR_IO_PENDING Then
Throw New ApplicationException("Read pending error")
Else
'// Wait for characters
iRc = WaitForSingleObject(muOvlR.hEvent, miTimeout)
Select Case iRc
Case WAIT_OBJECT_0
'// Some data received...
If GetOverlappedResult(mhRS, muOvlR, iReadChars, 0) = 0 Then
Throw New ApplicationException("Read pending error.")
Else
Return iReadChars
End If
Case WAIT_TIMEOUT
Throw New IOTimeoutException("Read Timeout.")
Case Else
Throw New ApplicationException("General read error.")
End Select
End If
Else
Return (iReadChars)
End If
Finally
'//Closes handle
CloseHandle(muOvlR.hEvent)
If (hOvl.IsAllocated) Then hOvl.Free()
End Try
End If
End Function
Overridable ReadOnly Property InputStream() As Byte()
'===================================================
'
' Description: Returns received data as Byte()
' Created : 21/09/2001 - 11:45:06
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return mabtRxBuf
End Get
End Property
Overridable ReadOnly Property InputStreamString() As String
'===================================================
'
' Description : Return a string containing received data
' Created : 04/02/2002 - 8:49:55
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Dim oEncoder As New System.Text.ASCIIEncoding
Dim oEnc As Encoding = oEncoder.GetEncoding(1252)
'-------------------------------------------------------------
If Not Me.InputStream Is Nothing Then Return oEnc.GetString(Me.InputStream)
End Get
End Property
Public Sub ClearInputBuffer()
'===================================================
'
' Description: Clears Input buffer
' Created : 21/09/2001 - 11:45:34
'
' *Parameters Info*
'
' Notes : Gets all character until end of buffer
'===================================================
If mhRS.ToInt32 > 0 Then
PurgeComm(mhRS, PURGE_RXCLEAR)
End If
End Sub
Public WriteOnly Property Rts() As Boolean
'===================================================
'
' Description: Set/Resets RTS Line
' Created : 21/09/2001 - 11:45:34
'
' *Parameters Info*
'
' Notes :
'===================================================
Set(ByVal Value As Boolean)
If mhRS.ToInt32 > 0 Then
If Value Then
EscapeCommFunction(mhRS, Lines.SetRts)
Else
EscapeCommFunction(mhRS, Lines.ClearRts)
End If
End If
End Set
End Property
Public WriteOnly Property Dtr() As Boolean
'===================================================
'
' Description: Set/Resets DTR Line
' Created : 21/09/2001 - 11:45:34
'
' *Parameters Info*
'
' Notes :
'===================================================
Set(ByVal Value As Boolean)
If mhRS.ToInt32 > 0 Then
If Value Then
EscapeCommFunction(mhRS, Lines.SetDtr)
Else
EscapeCommFunction(mhRS, Lines.ClearDtr)
End If
End If
End Set
End Property
Public ReadOnly Property ModemStatus() As ModemStatusBits
'===================================================
'
' Description : Gets Modem status
' Created : 28/02/2002 - 8:58:04
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
If mhRS.ToInt32 <= 0 Then
Throw New ApplicationException("Please initialize and open port before using this method")
Else
'// Retrieve modem status
Dim lpModemStatus As Int32
If Not GetCommModemStatus(mhRS, lpModemStatus) Then
Throw New ApplicationException("Unable to get modem status")
Else
Return CType(lpModemStatus, ModemStatusBits)
End If
End If
End Get
End Property
Public Function CheckLineStatus(ByVal Line As ModemStatusBits) As Boolean
'===================================================
'
' Description : Check status of a Modem Line
' Created : 28/02/2002 - 10:25:17
'
' *Parameters Info*
'
' Notes :
'===================================================
Return Convert.ToBoolean(ModemStatus And Line)
End Function
Public Property UseXonXoff() As Boolean
'===================================================
'
' Description : Set XON/XOFF mode
' Created : 26/05/2003 - 21:16:18
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return mbUseXonXoff
End Get
Set(ByVal Value As Boolean)
mbUseXonXoff = Value
End Set
End Property
Public Sub EnableEvents()
'===================================================
'
' Description : Enables monitoring of incoming events
' Created : 15/07/2003 - 12:00:56
'
' *Parameters Info*
'
' Notes :
'===================================================
If mhRS.ToInt32 <= 0 Then
Throw New ApplicationException("Please initialize and open port before using this method")
Else
If moEvents Is Nothing Then
mbEnableEvents = True
moEvents = New Thread(AddressOf pEventsWatcher)
moEvents.IsBackground = True
moEvents.Start()
End If
End If
End Sub
Public Sub DisableEvents()
'===================================================
'
' Description : Disables monitoring of incoming events
' Created : 15/07/2003 - 12:00:56
'
' *Parameters Info*
'
' Notes :
'===================================================
If mbEnableEvents = True Then
SyncLock Me
mbEnableEvents = False '// This should kill the thread
End SyncLock
'// Let WaitCommEvent exit...
If muOvlE.hEvent.ToInt32 <> 0 Then SetEvent(muOvlE.hEvent)
moEvents = Nothing
End If
End Sub
Public Property RxBufferThreshold() As Int32
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Numer of characters into input buffer
' Created : 16/07/03 - 9:00:57
' Author : Corrado Cavalli
'
' *Parameters Info*
'
' Notes :
'===================================================
Get
Return miBufThreshold
End Get
Set(ByVal Value As Int32)
miBufThreshold = Value
End Set
End Property
Public Shared Function IsPortAvailable(ByVal portNumber As Int32) As Boolean
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Returns true if a specific port number is supported by the system
' Created : 14/09/03 - 17:00:57
' Author : Corrado Cavalli
'
' *Parameters Info*
' portNumber : port number to check
'
' Notes :
'===================================================
If portNumber <= 0 Then
Return False
Else
Dim cfg As COMMCONFIG
Dim cfgsize As Int32 = Marshal.SizeOf(cfg)
cfg.dwSize = cfgsize
Dim ret As Boolean = GetDefaultCommConfig("COM" + portNumber.ToString, cfg, cfgsize)
Return ret
End If
End Function
Public Sub SetBreak()
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Set COM in break modem
' Created : 12/10/03 - 10:00:57
' Author : Corrado Cavalli
'
' *Parameters Info*
'
'
' Notes :
'===================================================
If mhRS.ToInt32 > 0 Then
If SetCommBreak(mhRS) = False Then Throw New Win32Exception
End If
End Sub
Public Sub ClearBreak()
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Clear COM break mode
' Created : 12/10/03 - 10:02:57
' Author : Corrado Cavalli
'
' *Parameters Info*
'
'
' Notes :
'===================================================
If mhRS.ToInt32 > 0 Then
If ClearCommBreak(mhRS) = False Then Throw New Win32Exception
End If
End Sub
Public ReadOnly Property InBufferCount() As Int32
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Returns the number of bytes inside Rx buffer
' Created : 20/04/05 - 10:02:57
' Author : Corrado Cavalli/Jean-Pierre ZANIER
'
'
'===================================================
Get
Dim comStat As COMSTAT
Dim lpErrCode As Int32
Dim iRc As Int32
comStat.cbInQue = 0
If mhRS.ToInt32 > 0 Then
iRc = ClearCommError(mhRS, lpErrCode, comStat)
Return comStat.cbInQue
End If
Return 0
End Get
End Property
#Region "Finalize"
Protected Overrides Sub Finalize()
'===================================================
'
' Description : Closes COM port if object is garbage collected and still owns
' COM port reosurces
'
' Created : 27/05/2002 - 19:05:56
'
' *Parameters Info*
'
' Notes :
'===================================================
Try
If Not mbDisposed Then
If mbEnableEvents Then Me.DisableEvents()
Close()
End If
Finally
MyBase.Finalize()
End Try
End Sub
#End Region
#Region "Private Routines"
Private Sub pSetTimeout()
'===================================================
'
' Description: Set comunication timeouts
' Created : 21/09/2001 - 11:46:40
'
' *Parameters Info*
'
' Notes :
'===================================================
Dim uCtm As COMMTIMEOUTS
'// Set ComTimeout
If mhRS.ToInt32 <= 0 Then
Exit Sub
Else
'// Changes setup on the fly
With uCtm
.ReadIntervalTimeout = 0
.ReadTotalTimeoutMultiplier = 0
.ReadTotalTimeoutConstant = miTimeout
.WriteTotalTimeoutMultiplier = 10
.WriteTotalTimeoutConstant = 100
End With
SetCommTimeouts(mhRS, uCtm)
End If
End Sub
Private Sub pDispose() Implements IDisposable.Dispose
'===================================================
'
' Description : Handles correct class disposing Write
' Created : 27/05/2002 - 19:03:06
'
' *Parameters Info*
'
' Notes :
'===================================================
If (Not mbDisposed AndAlso (mhRS.ToInt32 > 0)) Then
'// Closes Com Port releasing resources
Try
Me.Close()
Finally
mbDisposed = True
'// Suppress unnecessary Finalize overhead
GC.SuppressFinalize(Me)
End Try
End If
End Sub
Private Sub pEventsWatcher()
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Watches for all events raising events when they arrive to the port
' Created : 15/07/03 - 11:45:13
' Author : Corrado Cavalli
'
' *Parameters Info*
'
' Notes :
'===================================================
'// Events to watch
Dim lMask As EventMasks = EventMasks.Break Or EventMasks.CarrierDetect Or EventMasks.ClearToSend Or _
EventMasks.DataSetReady Or EventMasks.Ring Or EventMasks.RxChar Or EventMasks.RXFlag Or _
EventMasks.StatusError
Dim lRetMask As EventMasks, iBytesRead, iTotBytes, iErrMask As Int32, iRc As Int32, aBuf As New ArrayList
Dim uComStat As COMSTAT
'-----------------------------------
'// Creates Event
muOvlE = New Overlapped
Dim hOvlE As GCHandle = GCHandle.Alloc(muOvlE, GCHandleType.Pinned)
muOvlE.hEvent = CreateEvent(Nothing, 1, 0, Nothing)
If muOvlE.hEvent.ToInt32 = 0 Then Throw New ApplicationException("Error creating event for overlapped reading")
'// Set mask
SetCommMask(mhRS, lMask)
'// Looks for RxChar
While mbEnableEvents = True
WaitCommEvent(mhRS, lMask, muOvlE)
Select Case WaitForSingleObject(muOvlE.hEvent, INFINITE)
Case WAIT_OBJECT_0
'// Event (or abort) detected
If mbEnableEvents = False Then Exit While
If (lMask And EventMasks.RxChar) > 0 Then
'// Read incoming data
ClearCommError(mhRS, iErrMask, uComStat)
If iErrMask = 0 Then
Dim ovl As New Overlapped
Dim hOvl As GCHandle = GCHandle.Alloc(ovl, GCHandleType.Pinned)
ReDim mabtRxBuf(uComStat.cbInQue - 1)
If ReadFile(mhRS, mabtRxBuf, uComStat.cbInQue, iBytesRead, ovl) > 0 Then
If iBytesRead > 0 Then
'// Some bytes read, fills temporary buffer
If iTotBytes < miBufThreshold Then
aBuf.AddRange(mabtRxBuf)
iTotBytes += iBytesRead
End If
'// Threshold reached?, raises event
If iTotBytes >= miBufThreshold Then
'//Copies temp buffer into Rx buffer
ReDim mabtRxBuf(iTotBytes - 1)
aBuf.CopyTo(mabtRxBuf)
'// Raises event
Try
Me.OnCommEventReceived(Me, lMask)
Finally
iTotBytes = 0
aBuf.Clear()
End Try
End If
End If
End If
If (hOvl.IsAllocated) Then hOvl.Free()
End If
Else
'// Simply raises OnCommEventHandler event
Me.OnCommEventReceived(Me, lMask)
End If
Case Else
Dim sErr As String = New Win32Exception().Message
Throw New ApplicationException(sErr)
End Select
End While
'// Release Event Handle
CloseHandle(muOvlE.hEvent)
muOvlE.hEvent = IntPtr.Zero
If (hOvlE.IsAllocated) Then hOvlE.Free()
muOvlE = Nothing
End Sub
#End Region
#Region "Protected Routines"
Protected Sub OnCommEventReceived(ByVal source As Rs232, ByVal mask As EventMasks)
'===================================================
' ©2003 www.codeworks.it All rights reserved
'
' Description : Raises CommEvent
' Created : 15/07/03 - 15:09:50
' Author : Corrado Cavalli
'
' *Parameters Info*
'
' Notes :
'===================================================
Dim del As CommEventHandler = Me.CommEventEvent
If (Not del Is Nothing) Then
Dim SafeInvoker As ISynchronizeInvoke
Try
SafeInvoker = DirectCast(del.Target, ISynchronizeInvoke)
Catch
End Try
If (Not SafeInvoker Is Nothing) Then
SafeInvoker.Invoke(del, New Object() {source, mask})
Else
del.Invoke(source, mask)
End If
End If
End Sub
#End Region
End Class
#End Region
#Region "Exceptions"
Public Class CIOChannelException : Inherits ApplicationException
'===================================================
'
' Module : CChannellException
' Description: Customized Channell Exception
' Created : 17/10/2001 - 10:32:37
'
' Notes : This exception is raised when NACK error found
'===================================================
Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub
Sub New(ByVal Message As String, ByVal InnerException As Exception)
MyBase.New(Message, InnerException)
End Sub
End Class
Public Class IOTimeoutException : Inherits CIOChannelException
'===================================================
'
' Description : Timeout customized exception
' Created : 28/02/2002 - 10:43:43
'
' *Parameters Info*
'
' Notes :
'===================================================
Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub
Sub New(ByVal Message As String, ByVal InnerException As Exception)
MyBase.New(Message, InnerException)
End Sub
End Class
#End Region
====================================================================
Can Anyone Help me Out?