www.pudn.com > CSharpSerial.rar > Form1.cs, change:2006-04-22,size:23807b


using System; 
using System.Drawing; 
using System.Collections; 
using System.Windows.Forms; 
using System.Data; 
using System.Runtime.InteropServices;  
using System.Threading; 
 
namespace SerialAPI  
{  
	/// <summary>  
	/// SerialPort 的摘要说明。  
	/// </summary>  
	public class SerialPort  
	{  
		#region 申明要引用的和串口调用有关的API  
		//win32 api constants  
		private const uint GENERIC_READ = 0x80000000;  
		private const uint GENERIC_WRITE = 0x40000000;  
		private const int OPEN_EXISTING = 3;  
		private const int INVALID_HANDLE_VALUE = -1;  
		private const int MAXBLOCK = 4096;  
 
		private const uint PURGE_TXABORT = 0x0001; // Kill the pending/current writes to the comm port.  
		private const uint PURGE_RXABORT = 0x0002; // Kill the pending/current reads to the comm port.  
		private const uint PURGE_TXCLEAR = 0x0004; // Kill the transmit queue if there.  
		private const uint PURGE_RXCLEAR = 0x0008; // Kill the typeahead buffer if there.  
 
		[StructLayout(LayoutKind.Sequential)]  
			private struct DCB  
		{  
			//taken from c struct in platform sdk  
			public int DCBlength; // sizeof(DCB)  
			public int BaudRate; // current baud rate  
			public int fBinary; // binary mode, no EOF check  
			public int fParity; // enable parity checking  
			public int fOutxCtsFlow; // CTS output flow control  
			public int fOutxDsrFlow; // DSR output flow control  
			public int fDtrControl; // DTR flow control type  
			public int fDsrSensitivity; // DSR sensitivity  
			public int fTXContinueOnXoff; // XOFF continues Tx  
			public int fOutX; // XON/XOFF out flow control  
			public int fInX; // XON/XOFF in flow control  
			public int fErrorChar; // enable error replacement  
			public int fNull; // enable null stripping  
			public int fRtsControl; // RTS flow control  
			public int fAbortOnError; // abort on error  
			public int fDummy2; // reserved  
			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  
		}  
 
		[StructLayout(LayoutKind.Sequential)]  
			private struct COMMTIMEOUTS  
		{  
			public int ReadIntervalTimeout;  
			public int ReadTotalTimeoutMultiplier;  
			public int ReadTotalTimeoutConstant;  
			public int WriteTotalTimeoutMultiplier;  
			public int WriteTotalTimeoutConstant;  
		}  
 
		[StructLayout(LayoutKind.Sequential)]  
			private struct OVERLAPPED  
		{  
			public int Internal;  
			public int InternalHigh;  
			public int Offset;  
			public int OffsetHigh;  
			public int hEvent;  
		}  
 
		[StructLayout(LayoutKind.Sequential)]  
			private struct COMSTAT  
		{  
			/*public int fCtsHold;  
			public int fDsrHold;  
			public int fRlsdHold;  
			public int fXoffHold;  
			public int fXoffSent;  
			public int fEof;  
			public int fTxim;  
			public int fReserved;  
			public int cbInQue;  
			public int cbOutQue;*/  
			// Should have a reverse, i don't know why!!!!!  
			public int cbOutQue;  
			public int cbInQue;  
			public int fReserved;  
			public int fTxim;  
			public int fEof;  
			public int fXoffSent;  
			public int fXoffHold;  
			public int fRlsdHold;  
			public int fDsrHold;  
			public int fCtsHold;  
		}  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
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  
);  
#else  
		[DllImport("coredll")]  
		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  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool GetCommState(  
int hFile, // handle to communications device  
ref DCB lpDCB // device-control block  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool GetCommState(  
			int hFile, // handle to communications device  
			ref DCB lpDCB // device-control block  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool BuildCommDCB(  
string lpDef, // device-control string  
ref DCB lpDCB // device-control block  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool BuildCommDCB(  
			string lpDef, // device-control string  
			ref DCB lpDCB // device-control block  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool SetCommState(  
int hFile, // handle to communications device  
ref DCB lpDCB // device-control block  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool SetCommState(  
			int hFile, // handle to communications device  
			ref DCB lpDCB // device-control block  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool GetCommTimeouts(  
int hFile, // handle to comm device  
ref COMMTIMEOUTS lpCommTimeouts // time-out values  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool GetCommTimeouts(  
			int hFile, // handle to comm device  
			ref COMMTIMEOUTS lpCommTimeouts // time-out values  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool SetCommTimeouts(  
int hFile, // handle to comm device  
ref COMMTIMEOUTS lpCommTimeouts // time-out values  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool SetCommTimeouts(  
			int hFile, // handle to comm device  
			ref COMMTIMEOUTS lpCommTimeouts // time-out values  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
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  
);  
#else  
		[DllImport("coredll")]  
		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  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
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  
);  
#else  
		[DllImport("coredll")]  
		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  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool CloseHandle(  
int hObject // handle to object  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool CloseHandle(  
			int hObject // handle to object  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool ClearCommError(  
int hFile, // handle to file  
ref int lpErrors,  
ref COMSTAT lpStat  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool ClearCommError(  
			int hFile, // handle to file  
			ref int lpErrors,  
			ref COMSTAT lpStat  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool PurgeComm(  
int hFile, // handle to file  
uint dwFlags  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool PurgeComm(  
			int hFile, // handle to file  
			uint dwFlags  
			);  
#endif  
#if FULLFRAMEWORK  
[DllImport("kernel32")]  
private static extern bool SetupComm(  
int hFile,  
int dwInQueue,  
int dwOutQueue  
);  
#else  
		[DllImport("coredll")]  
		private static extern bool SetupComm(  
			int hFile,  
			int dwInQueue,  
			int dwOutQueue  
			);  
#endif  
		#endregion  
 
		// SerialPort的成员变量  
		private int hComm = INVALID_HANDLE_VALUE;  
		private bool bOpened = false;  
 
		public bool Opened  
		{  
			get  
			{  
				return bOpened;  
			}  
		}  
 
		/// <summary>  
		///串口的初始化函数  
		///lpFileName 端口名  
		///baudRate 波特率  
		///parity 校验位  
		///byteSize 数据位  
		///stopBits 停止位  
		/// <summary>  
		public bool OpenPort(string lpFileName,int baudRate,byte parity, byte byteSize, byte stopBits)  
		{  
			// OPEN THE COMM PORT.  
			hComm = CreateFile(lpFileName ,GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);  
			// IF THE PORT CANNOT BE OPENED, BAIL OUT.  
			if(hComm == INVALID_HANDLE_VALUE)  
			{  
				return false;  
			}  
 
			SetupComm(hComm, MAXBLOCK, MAXBLOCK);  
 
			// SET THE COMM TIMEOUTS.  
			COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();  
			GetCommTimeouts(hComm,ref ctoCommPort);  
			ctoCommPort.ReadIntervalTimeout = Int32.MaxValue;  
			ctoCommPort.ReadTotalTimeoutConstant = 0;  
			ctoCommPort.ReadTotalTimeoutMultiplier = 0;  
			ctoCommPort.WriteTotalTimeoutMultiplier = 10;  
			ctoCommPort.WriteTotalTimeoutConstant = 1000;  
			SetCommTimeouts(hComm,ref ctoCommPort);  
 
			// SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.  
			// THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST.  
			// IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER  
			// THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING.  
			// ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING.  
			DCB dcbCommPort = new DCB();  
			dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort);  
			GetCommState(hComm, ref dcbCommPort);  
			dcbCommPort.BaudRate = baudRate;  
			dcbCommPort.Parity = parity;  
			dcbCommPort.ByteSize = byteSize;  
			dcbCommPort.StopBits = stopBits;  
			SetCommState(hComm, ref dcbCommPort);  
 
			PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT);  
			PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT);  
 
			bOpened = true;  
			return true;  
		}  
 
		// 关闭串口  
		public bool ClosePort()  
		{  
			if (hComm == INVALID_HANDLE_VALUE)  
			{  
				return false;  
			}  
 
			if (CloseHandle(hComm))  
			{  
				hComm = INVALID_HANDLE_VALUE;  
				bOpened = false;  
				return true;  
			}  
			else  
			{  
				return false;  
			}  
		}  
 
		// 往串口写数据  
		public bool WritePort(byte[] WriteBytes)  
		{  
			if (hComm == INVALID_HANDLE_VALUE)  
			{  
				return false;  
			}  
 
			COMSTAT ComStat = new COMSTAT();  
			int dwErrorFlags = 0;  
 
			ClearCommError(hComm, ref dwErrorFlags, ref ComStat);  
			if (dwErrorFlags != 0)  
				PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT);  
 
			OVERLAPPED ovlCommPort = new OVERLAPPED();  
			int BytesWritten = 0;  
			return WriteFile(hComm, WriteBytes, WriteBytes.Length, ref BytesWritten, ref ovlCommPort);  
		}  
 
		// 从串口读数据  
		public int ReadPort(int NumBytes, byte[] commRead)  
		{  
			if (hComm == INVALID_HANDLE_VALUE)  
			{  
				return 0;  
			}  
 
			COMSTAT ComStat = new COMSTAT();  
			int dwErrorFlags = 0;  
 
			ClearCommError(hComm, ref dwErrorFlags, ref ComStat);  
			if (dwErrorFlags != 0)  
			{ 
				PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT);  
			} 
 
			if (ComStat.cbInQue > 0)  
			{  
				OVERLAPPED ovlCommPort = new OVERLAPPED();  
				int BytesRead = 0;  
				ReadFile(hComm, commRead, NumBytes, ref BytesRead, ref ovlCommPort);  
				return BytesRead; 
			}  
			else  
			{  
				return 0;  
			}  
		}  
	}  
}  
 
namespace CSharpSerialPort 
{ 
	/// <summary> 
	/// Form1 的摘要说明。 
	/// </summary> 
	public class Form1 : System.Windows.Forms.Form 
	{ 
		private System.Windows.Forms.MenuItem menuItem1; 
		private System.Windows.Forms.MenuItem menuItem2; 
		private System.Windows.Forms.Button button1; 
		private System.Windows.Forms.MainMenu mainMenu1; 
		private System.Windows.Forms.TextBox textBoxReceive; 
		private System.Windows.Forms.Button button2; 
 
		private SerialAPI.SerialPort Serial=new SerialAPI.SerialPort(); 
 
		bool PortOpen=false; 
		private System.Windows.Forms.TextBox textBoxSend; 
		private System.Windows.Forms.Label label1; 
		private Microsoft.WindowsCE.Forms.InputPanel inputPanel1; 
		private System.Windows.Forms.Label label2; 
		private System.Windows.Forms.CheckBox checkBox1; 
		bool Receive=false; 
		private System.Windows.Forms.Timer timer1; 
		private char last_key; 
		private System.Windows.Forms.MenuItem menuItem3; 
		private System.Windows.Forms.Label label4; 
		private int loopnum; 
		private System.Windows.Forms.Label label5; 
		private int baudRate; 
		private System.Windows.Forms.Label label6; 
		private System.Windows.Forms.Label returnnum; 
		private System.Windows.Forms.Button button3; 
		private System.Windows.Forms.Button button4; 
		private int delay; 
 
		public Form1() 
		{ 
			// 
			// Windows 窗体设计器支持所必需的 
			// 
			InitializeComponent(); 
 
			// 
			// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 
			// 
		} 
		/// <summary> 
		/// 清理所有正在使用的资源。 
		/// </summary> 
		protected override void Dispose( bool disposing ) 
		{ 
			base.Dispose( disposing ); 
		} 
		#region Windows 窗体设计器生成的代码 
		/// <summary> 
		/// 设计器支持所需的方法 - 不要使用代码编辑器修改 
		/// 此方法的内容。 
		/// </summary> 
		private void InitializeComponent() 
		{ 
			this.mainMenu1 = new System.Windows.Forms.MainMenu(); 
			this.menuItem1 = new System.Windows.Forms.MenuItem(); 
			this.menuItem2 = new System.Windows.Forms.MenuItem(); 
			this.menuItem3 = new System.Windows.Forms.MenuItem(); 
			this.button1 = new System.Windows.Forms.Button(); 
			this.textBoxReceive = new System.Windows.Forms.TextBox(); 
			this.button2 = new System.Windows.Forms.Button(); 
			this.textBoxSend = new System.Windows.Forms.TextBox(); 
			this.label1 = new System.Windows.Forms.Label(); 
			this.inputPanel1 = new Microsoft.WindowsCE.Forms.InputPanel(); 
			this.label2 = new System.Windows.Forms.Label(); 
			this.returnnum = new System.Windows.Forms.Label(); 
			this.checkBox1 = new System.Windows.Forms.CheckBox(); 
			this.timer1 = new System.Windows.Forms.Timer(); 
			this.label4 = new System.Windows.Forms.Label(); 
			this.label5 = new System.Windows.Forms.Label(); 
			this.label6 = new System.Windows.Forms.Label(); 
			this.button3 = new System.Windows.Forms.Button(); 
			this.button4 = new System.Windows.Forms.Button(); 
			//  
			// mainMenu1 
			//  
			this.mainMenu1.MenuItems.Add(this.menuItem1); 
			//  
			// menuItem1 
			//  
			this.menuItem1.MenuItems.Add(this.menuItem2); 
			this.menuItem1.MenuItems.Add(this.menuItem3); 
			this.menuItem1.Text = "操作"; 
			//  
			// menuItem2 
			//  
			this.menuItem2.Text = "退出"; 
			this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click); 
			//  
			// menuItem3 
			//  
			this.menuItem3.Text = "设置串口"; 
			this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click); 
			//  
			// button1 
			//  
			this.button1.Location = new System.Drawing.Point(88, 184); 
			this.button1.Size = new System.Drawing.Size(56, 24); 
			this.button1.Text = "发送"; 
			this.button1.Click += new System.EventHandler(this.button1_Click); 
			//  
			// textBoxReceive 
			//  
			this.textBoxReceive.Location = new System.Drawing.Point(24, 22); 
			this.textBoxReceive.Multiline = true; 
			this.textBoxReceive.Size = new System.Drawing.Size(192, 98); 
			this.textBoxReceive.Text = ""; 
			//  
			// button2 
			//  
			this.button2.Location = new System.Drawing.Point(8, 184); 
			this.button2.Size = new System.Drawing.Size(64, 24); 
			this.button2.Text = "打开"; 
			this.button2.Click += new System.EventHandler(this.button2_Click); 
			//  
			// textBoxSend 
			//  
			this.textBoxSend.Location = new System.Drawing.Point(24, 152); 
			this.textBoxSend.Size = new System.Drawing.Size(192, 21); 
			this.textBoxSend.Text = "01 01 02 06 05 01 09 00 00 25 08 00 00 01 10 66 66 66 66 FF "; 
			this.textBoxSend.TextChanged += new System.EventHandler(this.textBoxSend_TextChanged); 
			//  
			// label1 
			//  
			this.label1.Location = new System.Drawing.Point(23, 4); 
			this.label1.Size = new System.Drawing.Size(72, 16); 
			this.label1.Text = "接收区"; 
			//  
			// label2 
			//  
			this.label2.Location = new System.Drawing.Point(24, 128); 
			this.label2.Size = new System.Drawing.Size(64, 16); 
			this.label2.Text = "发送区"; 
			//  
			// returnnum 
			//  
			this.returnnum.Location = new System.Drawing.Point(88, 216); 
			this.returnnum.Size = new System.Drawing.Size(48, 16); 
			this.returnnum.Text = "0"; 
			//  
			// checkBox1 
			//  
			this.checkBox1.Location = new System.Drawing.Point(88, 128); 
			this.checkBox1.Size = new System.Drawing.Size(80, 16); 
			this.checkBox1.Text = "十六进制"; 
			//  
			// timer1 
			//  
			this.timer1.Interval = 1500; 
			this.timer1.Tick += new System.EventHandler(this.timer1_Tick); 
			//  
			// label4 
			//  
			this.label4.Location = new System.Drawing.Point(136, 216); 
			this.label4.Size = new System.Drawing.Size(48, 16); 
			this.label4.Text = "label4"; 
			//  
			// label5 
			//  
			this.label5.Location = new System.Drawing.Point(184, 216); 
			this.label5.Size = new System.Drawing.Size(48, 16); 
			this.label5.Text = "label5"; 
			//  
			// label6 
			//  
			this.label6.Location = new System.Drawing.Point(40, 216); 
			this.label6.Size = new System.Drawing.Size(48, 16); 
			this.label6.Text = "label6"; 
			//  
			// button3 
			//  
			this.button3.Location = new System.Drawing.Point(0, 128); 
			this.button3.Size = new System.Drawing.Size(24, 16); 
			this.button3.Text = "button3"; 
			this.button3.Click += new System.EventHandler(this.button3_Click); 
			//  
			// button4 
			//  
			this.button4.Location = new System.Drawing.Point(152, 184); 
			this.button4.Size = new System.Drawing.Size(72, 24); 
			this.button4.Text = "更改设置"; 
			this.button4.Click += new System.EventHandler(this.button4_Click); 
			//  
			// Form1 
			//  
			this.ClientSize = new System.Drawing.Size(234, 232); 
			this.Controls.Add(this.button4); 
			this.Controls.Add(this.button3); 
			this.Controls.Add(this.label6); 
			this.Controls.Add(this.label5); 
			this.Controls.Add(this.label4); 
			this.Controls.Add(this.checkBox1); 
			this.Controls.Add(this.returnnum); 
			this.Controls.Add(this.label2); 
			this.Controls.Add(this.label1); 
			this.Controls.Add(this.textBoxSend); 
			this.Controls.Add(this.button2); 
			this.Controls.Add(this.textBoxReceive); 
			this.Controls.Add(this.button1); 
			this.Menu = this.mainMenu1; 
			this.MinimizeBox = false; 
			this.Text = "Form1"; 
			this.Load += new System.EventHandler(this.Form1_Load); 
 
		} 
		#endregion 
 
		/// <summary> 
		/// 应用程序的主入口点。 
		/// </summary> 
 
		static void Main()  
		{ 
			Application.Run(new Form1()); 
		} 
 
		private void menuItem2_Click(object sender, System.EventArgs e) 
		{ 
			Receive=false; 
			Serial.ClosePort(); 
 
			this.Close(); 
		} 
 
		private void SendCmd() 
		{ 
			byte[] buf; 
			textBoxReceive.Text =""; 
			if(textBoxSend.TextLength==0) 
			{ 
				return; 
			} 
 
			if(checkBox1.Checked ==true) 
			{ 
				buf = new byte[(textBoxSend.Text.Length/3)]; 
 
				for ( int i=0 ; i< (textBoxSend.Text.Length/3); i++) 
				{ 
					buf[i] = byte.Parse( textBoxSend.Text.Substring(i*3 ,2) ,System.Globalization.NumberStyles.AllowHexSpecifier); 
				} 
 
				//com.Output = buf; 
			} 
			else 
			{ 
				buf=new byte [textBoxSend.TextLength]; 
				for(int i=0;i<textBoxSend.TextLength;i++) 
				{ 
					buf[i]=Convert.ToByte(textBoxSend.Text[i]); 
				} 
				//			byte[] buf=new byte[4];  
				//			buf[0]=200;  
				//			buf[1]=0; 
				//			buf[2]=0; 
				//			buf[3]=200;	 
			} 
			Serial.WritePort(buf); 
		} 
 
		private void button1_Click(object sender, System.EventArgs e) 
		{ 
//			for(int i=0;i<5;i++) 
//			{ 
//				SendCmd(); 
//				Sleep(500); 
//			} 
			loopnum=0; 
			timer1.Enabled =true; 
			timer1.Interval=delay; 
		} 
 
		private void timer1_Tick(object sender, System.EventArgs e) 
		{ 
			loopnum=loopnum+1; 
			label6.Text =loopnum.ToString(); 
			if(int.Parse(returnnum.Text)<10 && loopnum<300) //int.Parse(returnnum.Text)<4 &&  
			{ 
				SendCmd(); 
			} 
			else 
			{ 
				returnnum.Text ="0"; 
				timer1.Enabled =false; 
			}		 
		} 
 
		private void button2_Click(object sender, System.EventArgs e) 
		{ 
			if(!PortOpen) 
			{ 
				if(Serial.OpenPort("COM1:",baudRate,0,8,1)) 
				{ 
					 
					PortOpen=true; 
					Receive=true; 
					ThreadPool.QueueUserWorkItem(new WaitCallback(SerialReceive),0);  
					button2.Text="关闭"; 
				} 
			} 
			else 
			{ 
				Receive=false; 
				Serial.ClosePort(); 
				PortOpen=false; 
				button2.Text="打开"; 
			} 
		 
		} 
 
		public void SerialReceive(Object a) 
		{ 
			byte [] buf; 
			buf=new byte [1]; 
			int bytesRead=0; 
			int i; 
 
			while(Receive) 
			{ 
				if(Serial.Opened) 
				{ 
					bytesRead=Serial.ReadPort(1,buf); 
					if(bytesRead>0) 
					{ 
						for(i=0;i<bytesRead;i++) 
						{ 
//							textBoxReceive.Text+=Convert.ToChar(buf[i]).ToString(); 
							textBoxReceive.Text+= buf[i].ToString("X2")+ " "; 
						} 
						returnnum.Text = textBoxReceive.Text.Length.ToString(); 
					} 
					//Application.DoEvents(); 
					 
				} 
			} 
			//Thread.Sleep(0); 
		} 
 
		private void textBoxSend_TextChanged(object sender, System.EventArgs e) 
		{ 
			// 
			// Hex格式发送数据区输入数据整理:自动用空格间隔每字节的数据 
			// 
 
			// 转换为大写 
			textBoxSend.Text = textBoxSend.Text.ToUpper(); 
 
			if ( (textBoxSend.Text.Length % 3) == 2 ) 
			{ 
				if(last_key=='\b') 
					textBoxSend.Text = textBoxSend.Text.Remove( textBoxSend.Text.Length-1 ,1 ); 
				else 
					textBoxSend.Text += " "; 
			} 
            
			// 设置插入点到最后面 
			textBoxSend.SelectionStart = textBoxSend.Text.Length; 
		} 
 
		private void menuItem3_Click(object sender, System.EventArgs e) 
		{ 
			cResult r = new cResult(); 
			r.TextChanged += new TextChangedHandler(this.EventResultChanged); 
			frmComSet fc = new frmComSet(r); 
			fc.ShowDialog(); 
			label4.Text = r.Result1;// + "\r\n" + r.Result2; 
			baudRate=int.Parse(r.Result1); 
			label5.Text = r.Result2; 
			delay=int.Parse(r.Result2); 
		} 
 
		private void EventResultChanged(string s) 
		{ 
			label4.Text = s; 
		} 
 
		private void Form1_Load(object sender, System.EventArgs e) 
		{ 
			baudRate=9600; 
			delay=1500; 
			label4.Text = baudRate.ToString(); 
			label5.Text =delay.ToString(); 
		} 
 
		private void button3_Click(object sender, System.EventArgs e) 
		{ 
//			ADOCE.Connection connection; 
//            Set connection = CreateObject("ADOCE.Connection.3.1") 
//            connection.ConnectionString = "Data Source=\MyDatabase.cdb" 
//            connection.Open 
		} 
 
		private void button4_Click(object sender, System.EventArgs e) 
		{ 
			SendCmd(); 
		} 
 
		 
 
 
	} 
}