This is my Class 1
using
System;using
System.Runtime.InteropServices;using
System.IO;using
System.Text;using
System.Globalization;using
System.Threading;
namespace
yong{
public class port{
/*-- Definition of variables by Programmer --*/ /*-- Setting win32 API constants --*/ private const uint GENERIC_READ = 0x80000000; private const uint GENERIC_WRITE = 0x40000000; private const int CREATE_ALWAYS = 2; private const int INVALID_HANDLE_VALUE = -1; /*-- End ofSetting win32 API constants --*/ public int PortNum = 1; //-------------Delaring of Port number to 1 public int BaudRate = 9600; //---------Set BaudRate to 9600 public byte ByteSize = 8; //-----------Set ByteSize to 8 public byte Parity = 0; //-------------0-4 = no,odd,even,mark,space public byte StopBits = 0; //-----------0,1,2 = 1, 1.5, 2 public int ReadTimeout = 1500; //------Set TimeOut to 1500 private int hComm = -1; //-------------Declaring of comm port win32 file handle public bool Opened = false; //---------Declaring of Opened and set to false /*-- End of Definition of variables by Programmer --*/[StructLayout(LayoutKind.Sequential)]
public struct DCB{
/*-- taken from c struct in platform sdk --*/ public int DCBlength; //-----------Sizeof(DCB) public int BaudRate; //------------Current baud rate public uint flags; //--------------Flags public ushort wReserved; //--------Not currently used public ushort XonLim; //-----------Transmit XON threshold public ushort XoffLim; //----------Transmit XOFF threshold public byte ByteSize; //-----------Number of bits/byte, 4-8 public byte Parity; //-------------0-4 = no,odd,even,mark,space public byte StopBits; //-----------0,1,2 = 1, 1.5, 2 public char XonChar; //------------Tx and Rx XON character public char XoffChar; //-----------Tx and Rx XOFF character public char ErrorChar; //----------Error replacement character public char EofChar; //------------End of input character public char EvtChar; //------------Received event character public ushort wReserved1; //-------Reserved; Do not use}
/*-- End of StructLayout DCB --*/[StructLayout(LayoutKind.Sequential)]
private struct COMMTIMEOUTS{
public int ReadIntervalTimeout; public int ReadTotalTimeoutMultiplier; public int ReadTotalTimeoutConstant; public int WriteTotalTimeoutMultiplier; public int WriteTotalTimeoutConstant;}
/*-- End of StructLayout Commtimeout --*/[StructLayout(LayoutKind.Sequential)]
private struct OVERLAPPED{
public int Internal; public int InternalHigh; public int Offset; public int OffsetHigh; public int hEvent;}
/*-- End of StructLayout Overlapped --*/ /*-- Importing of Kernel32.dll --*/[DllImport("kernel32.dll")]
private static extern int CreateFile(
string lpFileName, //--------------File name uint dwDesiredAccess, //-----------Access mode int dwShareMode, //----------------Share mode int lpSecurityAttributes, //-------SD int dwCreationDisposition, //------How to create int dwFlagsAndAttributes, //-------File attributes int hTemplateFile //---------------Handle to template file);
[DllImport("kernel32.dll")]
private static extern bool GetCommState(
int hFile, //---------Handle to communications device ref DCB lpDCB //------Device-control block);
[DllImport("kernel32.dll")]
private static extern bool BuildCommDCB(
string lpDef, //------Device-control string ref DCB lpDCB //------Device-control block);
[DllImport("kernel32.dll")]
private static extern bool SetCommState(
int hFile, //---------Handle to communications device ref DCB lpDCB //------Device-control block);
[DllImport("kernel32.dll")]
private static extern bool GetCommTimeouts(
int hFile, //---------------------------Handle to comm device ref COMMTIMEOUTS lpCommTimeouts //------Time-out values);
[DllImport("kernel32.dll")]
private static extern bool SetCommTimeouts(
int hFile, //---------------------------Handle to comm device ref COMMTIMEOUTS lpCommTimeouts //------Time-out values);
[DllImport("kernel32.dll")]
private static extern bool ReadFile(
int hFile, //------------------------Handle to file byte[] lpBuffer, //------------------Data buffer int nNumberOfBytesToRead, //---------Number of bytes to read ref int lpNumberOfBytesRead, //------Number of bytes read ref OVERLAPPED lpOverlapped //-------Overlapped buffer);
[DllImport("kernel32.dll")]
private static extern bool WriteFile(
int hFile, //--------------------------Handle to file byte[] lpBuffer, //--------------------Data buffer int nNumberOfBytesToWrite, //----------Number of bytes to write ref int lpNumberOfBytesWritten, //-----Number of bytes written ref OVERLAPPED lpOverlapped //---------Overlapped buffer);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(
int hObject //-------Handle to object);
[DllImport("kernel32.dll")]
private static extern uint GetLastError(); /*-- End of Importing of Kernel32.dll --*//*-- Function Open --*/ /*-- To Open the connection between 2 ports via RS232 --*/ public void Open()
{
DCB dcbCommPort =
new DCB(); //------Declaring of DCBCOMMTIMEOUTS ctoCommPort =
new COMMTIMEOUTS(); //------Declaring of COMMTIMEOUTS /*-- Open Comm Port --*/hComm = CreateFile( "COM" + PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,CREATE_ALWAYS ,0,0 );
//------Open comm port by calling dll from kernel32 and get the handle /*-- Check port cannot be open --*/ if( hComm == INVALID_HANDLE_VALUE ){
throw(new ApplicationException("Comm Port Can Not Be Opened"));}
/*-- End of Check port cannot be open --*/ /*-- Set the Time out property --*/GetCommTimeouts(hComm,
ref ctoCommPort);ctoCommPort.ReadTotalTimeoutConstant = 0;
ctoCommPort.ReadTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm,
ref ctoCommPort); /*-- End of Set the Time out property --*/ /*-- Setting of Baud rate, Parity, Word size and Stop bits --*/GetCommState(hComm,
ref dcbCommPort); //------Get the status of current configurationdcbCommPort.BaudRate = BaudRate;
//------Setting of baud ratedcbCommPort.flags = 0;
//------Setting of Flags //dcbCommPort.flags = 1;//------Setting of Flags /*-- Check parity more than 0 --*/ if(Parity > 0){
dcbCommPort.flags = 2;
//------Setting of Flags}
/*-- End of Check parity more than 0 --*/dcbCommPort.Parity = Parity;
//------Setting of ParitydcbCommPort.ByteSize = ByteSize;
//------Setting of ByteSizedcbCommPort.StopBits = StopBits;
//------Setting of StopBits /*-- Set property and Check for error --*/ if( !SetCommState(hComm, ref dcbCommPort) ){
throw(new ApplicationException("Comm Port Can Not Be Opened"));}
/*-- End of Set property and Check for error --*/ /*-- End of Setting of Baud rate, Parity, Word size and Stop bits --*/ //Opened = true; //------Set Opened to trueOpened =
true;}
/*-- End of Function Open --*/ /*-- Function Close --*/ /*-- Closing of Comm port --*/ public void Close(){
/*-- Check Open handle is open --*/ if (hComm != INVALID_HANDLE_VALUE){
CloseHandle(hComm);
//------Close port}
/*-- End of Check Open handle is open --*/}
/*-- End of Function Close --*//*-- Function Read --*/ /*-- For receiving of data from other parties --*/ public MemoryStream Read(int bufSize)
{
byte[] BufBytes = new byte[bufSize];MemoryStream stream =
new MemoryStream(); /*-- Check Port is Open --*/ if( hComm != INVALID_HANDLE_VALUE ){
OVERLAPPED ovlCommPort =
new OVERLAPPED(); int BytesRead = 0; while(ReadFile(hComm, BufBytes, bufSize, ref BytesRead, ref ovlCommPort) != false /* or true (based on your interop declaration) */)stream.Read(BufBytes,0,BytesRead);
}
return stream;}
/*-- Function Write --*/ /*-- For transfering of data from other parties --*/ public void Write(byte[] WriteBytes)
{
/*-- Check Port is Open --*/ if( hComm != INVALID_HANDLE_VALUE ){
OVERLAPPED ovlCommPort =
new OVERLAPPED(); //------Declaring of ovlCommport int BytesWritten = 0; //------Declaring of BytesWritten and set to 0WriteFile(hComm, WriteBytes, WriteBytes.Length,
ref BytesWritten, ref ovlCommPort); //------Transfer data to RS232}
/*-- End of Check Port is Open --*/}
/*-- End of Function Write --*/}
/*-- End of class Port --*/}
This is my class 2
using
System;using
System.Text;using
System.Threading;namespace
yong{
public class Class2{
static void Main(string[] args){
port CommPort =
new port();CommPort.Open();
while(true){
/*call write function*/
// Convert string to byte array and send
//string x = Console.ReadLine(); //byte[] byteDateLine = Encoding.ASCII.GetBytes( x.ToCharArray() ); //CommPort.Write(byteDateLine);
/*call read function*/
//Convert Byte to String string sBuffer = Encoding.ASCII.GetString());Console.WriteLine( sBuffer.ToString() );
}
}
}
yongsim yongsimPosted Aug 30, 2005, 1:53 AM
Thanks!But i only allow using .NET Framework Version 1.1.Is that any idea how to call the read function to main at the source code above?Please help me..Thanks in advance!
Mike GoldPosted Aug 30, 2005, 12:52 AM
what you are doing .
There is a good article for using the serial port control in .NET framework 2.0 (see link below)
http://msmvps.com/coad/archive/2005/03/23/39466.aspx