亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? winstream.cs

?? C#串口通訊開發實例一個基于C#開發的串口通訊實例
?? CS
字號:
using System;
using System.IO;
using System.Collections;
using System.Runtime.InteropServices;
using OpenNETCF.IO.Ports;

namespace OpenNETCF.IO.Ports.Streams
{
	public class WinStream : Stream, ISerialStreamCtrl
	{
		internal OpenNETCF.IO.Serial.Port _port;

		public class Consts
		{
			public const int Win32Err_ERROR_INSUFFICIENT_BUFFER = 122;
			public const uint PortEnum_InitBufSize				= 8 * 1024;
			public const uint PortEnum_MaxBufSize				= 100 * 1024;
		}

		#region Construction and Disposing
		internal WinStream(
			int			baudRate,
			int			dataBits,
			bool		discardNull,
			bool		dtrEnable,
			Handshake	handshake,
			Parity		parity,
			byte		parityReplace,
			string		portName,
			int			readBufferSize,
			int			readTimeout,
			int			receivedBytesThreshold,
			bool		rtsEnable,
			StopBits	stopBits,
			int			writeBufferSize,
			int			writeTimeout )
		{
			_port = new OpenNETCF.IO.Serial.Port( portName, readBufferSize, writeBufferSize );
			
			BaudRate				= baudRate;
			DataBits				= dataBits;
			DiscardNull				= discardNull;
			DtrEnable				= dtrEnable;
			Handshake				= handshake;
			Parity					= parity;
			ParityReplace			= parityReplace;
// TODO:	ReadTimeout				= readTimeout;
			ReceivedBytesThreshold	= receivedBytesThreshold;
			RtsEnable				= rtsEnable;
			StopBits				= stopBits;
// TODO:	WriteTimeout			= writeTimeout;

			_port.DataReceived		+= new OpenNETCF.IO.Serial.Port.CommEvent(_port_DataReceived);
			_port.OnError			+= new OpenNETCF.IO.Serial.Port.CommErrorEvent(_port_OnError);
			_port.RingChange		+= new OpenNETCF.IO.Serial.Port.CommChangeEvent(_port_RingChange);
			_port.RLSDChange		+= new OpenNETCF.IO.Serial.Port.CommChangeEvent(_port_RLSDChange);

			if( !_port.Open() )
				throw new UnauthorizedAccessException();
		}

		protected void AssertOpenPort()
		{
			if( !_port.IsOpen )
				throw new InvalidOperationException("Serial Port is not open");
		}

		protected bool GetCommStatusFlag( OpenNETCF.IO.Serial.CommModemStatusFlags statusFlag )
		{
			AssertOpenPort();

			uint modemStatus = 0;
			_port.m_CommAPI.GetCommModemStatus( _port.hPort, ref modemStatus );
			
			return ( (uint)statusFlag & modemStatus ) != 0;
		}

		public void Dispose()
		{
			_port.Dispose();
		}

		#endregion

		#region Stream Implementation

		public override bool CanRead	{ get { return _port.IsOpen; }}
		public override bool CanWrite	{ get { return _port.IsOpen; }}
		public override bool CanSeek	{ get { return false; }}
		public override long Length		{ get { throw new NotSupportedException(); }}

		public override long Position
		{
			get { throw new NotSupportedException(); }
			set { throw new NotSupportedException(); }
		}


		public override void Close()
		{
			base.Close ();
			Dispose();
		}

		public override void Flush()
		{
			AssertOpenPort();

			if( _port.OutBufferCount > 0 )
			{
				int oldSThreshold = _port.SThreshold;
				_port.SThreshold = -1; // force even empty buffer to be written out
				_port.Output = new byte[0];
				_port.SThreshold = oldSThreshold;
			}

			// Flush OS buffer
			if( !_port.m_CommAPI.FlushFileBuffers(_port.hPort) )
				throw new InvalidOperationException( string.Format( "Error flushing buffer: {0}", Marshal.GetLastWin32Error() ));
		}

		public override int  Read( byte[] buffer, int offset, int count )
		{
			AssertOpenPort();

			if( buffer == null )
				throw new ArgumentException( "null", "buffer" );

			if( offset < 0 )
				throw new ArgumentException( "<0", "offset" );

			if( count < 0 )
				throw new ArgumentException( "<0", "count" );
			else if( count == 0 )
				return 0;

			//
			// modified from original Port.Input
			//
			// lock the rx FIFO while reading
			_port.rxBufferBusy.WaitOne();

			// how much data are we *actually* going to return from the call?
			int dequeueLength = (count < _port.rxFIFO.Count) ? count : _port.rxFIFO.Count;

			// dequeue the data
			for(int p = offset ; p < offset + dequeueLength ; p++)
				buffer[p] = (byte)_port.rxFIFO.Dequeue();

			// release the mutex so the Rx thread can continue
			_port.rxBufferBusy.ReleaseMutex();

			return dequeueLength;
		}

		public override long Seek( long offset, SeekOrigin origin )
		{
			throw new NotSupportedException();
		}

		public override void SetLength( long value )
		{
			throw new NotSupportedException();
		}

		public override void Write( byte[] buffer, int offset, int count )
		{
			AssertOpenPort();

			if( buffer == null )
				throw new ArgumentException( "null", "buffer" );

			if( offset < 0 )
				throw new ArgumentException( "<0", "offset" );

			if( count < 0 )
				throw new ArgumentException( "<0", "count" );
			else if( count == 0 )
				return;

			byte[] buf = new byte[ count ];
			Buffer.BlockCopy( buffer, offset, buf, 0, count );

			_port.Output = buf;
		}
		#endregion

		#region	  ISerialStreamCtrl Members
		public int			BaudRate
		{
			get { return (int) _port.Settings.BaudRate; }
			set { _port.Settings.BaudRate = (OpenNETCF.IO.Serial.BaudRates) value; }
		}

		public bool			BreakState
		{
			get { return _port.Break; }
			set { _port.Break = value; }
		}

		public int			BytesToRead
		{
			get { return _port.InBufferCount; }
		}

		public int			BytesToWrite
		{
			get { return _port.OutBufferCount; }
		}

		public bool			CDHolding
		{
			get { return GetCommStatusFlag( OpenNETCF.IO.Serial.CommModemStatusFlags.MS_RLSD_ON ); }
		}

		public bool			CtsHolding
		{
			get { return GetCommStatusFlag( OpenNETCF.IO.Serial.CommModemStatusFlags.MS_CTS_ON ); }
		}

		public int			DataBits
		{
			get { return _port.Settings.ByteSize; }
			set { _port.Settings.ByteSize = (byte)value; }
		}

		public bool			DiscardNull
		{
			get { return _port.DetailedSettings.DiscardNulls; }
			set { _port.DetailedSettings.DiscardNulls = value; }
		}

		public bool			DsrHolding
		{
			get { return GetCommStatusFlag( OpenNETCF.IO.Serial.CommModemStatusFlags.MS_DSR_ON ); }
		}

		public bool			DtrEnable
		{
			get { return _port.DTREnable; }
			set { _port.DTREnable = value; }
		}


		public static string[] GetPortNames()
		{
			string	buffer;
			uint	bufferSize = Consts.PortEnum_InitBufSize;
			uint	res;
			int		error;
			
			ArrayList comPorts = new ArrayList();
	
			do 
			{
				buffer = new String( '\0', (int) bufferSize );

				// TODO: two strange bugs (features?):
				//	 GetLastError() does not reset once err# 122 occurs - fixed with SetLastError
				//   if initial buffer has enough space, err# 127 occurs.

				SetLastError(0);
				res = QueryDosDevice( null, buffer, (uint) buffer.Length );
				error = Marshal.GetLastWin32Error();

				if( res == 0 )
				{
					// QueryDosDevice failed
					if( error == Consts.Win32Err_ERROR_INSUFFICIENT_BUFFER )
					{
						// no clue how much we need, double the buffer size
						bufferSize *= 2;
					}
					else
						throw new InvalidOperationException("QueryDosDevice error #" + error.ToString());
				}
				else if( res > bufferSize )
				{
					// TODO: specs are vague for Win2000 & WinNT - needs testing

					// QueryDosDevice failed with non-zero res
					if( error == Consts.Win32Err_ERROR_INSUFFICIENT_BUFFER )
					{
						// this platform knows what it needs
						bufferSize = res;
					}
					else
						throw new InvalidOperationException("QueryDosDevice error #" + error.ToString());
				}
				else if( error == 0 && res == 0 )
				{
					// sanity check
					throw new InvalidOperationException("Internal error");
				}
				else
					break;

			} while( bufferSize <= Consts.PortEnum_MaxBufSize );

			if( bufferSize > Consts.PortEnum_MaxBufSize )
				throw new InvalidOperationException("Maximum buffer size exceeded");

			buffer = buffer.Substring( 0, (int)res );
			foreach( string device in buffer.Split( '\0' ))
			{
				// Assumptions: serial port must be a string that begins with "COM#",
				// where # is a 1 to 3 digit number

				if( device.Length >= 4 && device.Length <= 6 &&
					device.StartsWith("COM") && 
					Char.IsDigit( device, 3 ) && 
					(device.Length < 5 || Char.IsDigit( device, 4 )) &&
					(device.Length < 6 || Char.IsDigit( device, 5 )) )
				{
					comPorts.Add( string.Copy( device ));	// avoid locking the original buffer string
				}
			}
			
			return (string[]) comPorts.ToArray( typeof(string) );
		}
		

		public Handshake	Handshake
		{
			get
			{
				if( _port.DetailedSettings is OpenNETCF.IO.Serial.HandshakeNone )
					return Handshake.None;
				else if( _port.DetailedSettings is OpenNETCF.IO.Serial.HandshakeCtsRts )
					return Handshake.RequestToSend;
				else if( _port.DetailedSettings is OpenNETCF.IO.Serial.HandshakeXonXoff )
					return Handshake.XOnXOff;
				else if( _port.DetailedSettings is OpenNETCF.IO.Serial.HandshakeDsrDtr )
					return Handshake.RequestToSendXOnXOff;
				else
					throw new NotImplementedException();
			}
			set
			{
				// Creating a new Handshaking object resets BasicSettings parameters.
				OpenNETCF.IO.Serial.BasicPortSettings tempPortSettings = _port.DetailedSettings.BasicSettings;

				switch( value )
				{
					case OpenNETCF.IO.Ports.Handshake.None:
						_port.DetailedSettings = new OpenNETCF.IO.Serial.HandshakeNone();
						break;
					case OpenNETCF.IO.Ports.Handshake.RequestToSend:
						_port.DetailedSettings = new OpenNETCF.IO.Serial.HandshakeCtsRts();
						break;
					case OpenNETCF.IO.Ports.Handshake.XOnXOff:
						_port.DetailedSettings = new OpenNETCF.IO.Serial.HandshakeXonXoff();
						break;
					case OpenNETCF.IO.Ports.Handshake.RequestToSendXOnXOff:
						_port.DetailedSettings = new OpenNETCF.IO.Serial.HandshakeDsrDtr();
						break;
					default:
						throw new NotImplementedException();
				}

				_port.DetailedSettings.BasicSettings = tempPortSettings;
			}
		}

		public bool			IsOpen
		{
			get { return _port.IsOpen; }
		}

		public Parity		Parity
		{
			get { return (Parity) Convert.ToInt32(_port.Settings.Parity); }
			set { _port.Settings.Parity = (OpenNETCF.IO.Serial.Parity) Convert.ToInt32(value); }
		}

		public byte			ParityReplace
		{
			get
			{
				return _port.DetailedSettings.ReplaceErrorChar ? (byte)_port.DetailedSettings.ErrorChar : (byte)0;
			}
			set
			{
				if( value == 0 )
					_port.DetailedSettings.ReplaceErrorChar = false;
				else
				{
					_port.DetailedSettings.ErrorChar		= (char) value;
					_port.DetailedSettings.ReplaceErrorChar	= true;
				}
			}
		}

		public int			ReadBufferSize
		{
			get { return _port.rxBufferSize; }
			set { throw new InvalidOperationException("Only available during port initialization"); }
		}

		public int			ReadTimeout
		{
			get { throw new NotImplementedException(); }
			set { throw new NotImplementedException(); }
		}

		public int			ReceivedBytesThreshold
		{
			get { return _port.RThreshold; }
			set { _port.RThreshold = value; }
		}

		public bool			RtsEnable
		{
			get { return _port.RTSEnable; }
			set { _port.RTSEnable = value; }
		}

		public StopBits		StopBits
		{
			get
			{
				switch( _port.Settings.StopBits )
				{
					default:
						throw new InvalidOperationException();
					case OpenNETCF.IO.Serial.StopBits.one:
						return StopBits.One;
					case OpenNETCF.IO.Serial.StopBits.onePointFive:
						return StopBits.OnePointFive;
					case OpenNETCF.IO.Serial.StopBits.two:
						return StopBits.Two;
				}
			}
			set
			{
				switch( value )
				{
					case StopBits.One:
						_port.Settings.StopBits = OpenNETCF.IO.Serial.StopBits.one;
						break;
					case StopBits.OnePointFive:
						_port.Settings.StopBits = OpenNETCF.IO.Serial.StopBits.onePointFive;
						break;
					case StopBits.Two:
						_port.Settings.StopBits = OpenNETCF.IO.Serial.StopBits.two;
						break;
				}
			}
		}

		public int			WriteBufferSize
		{
			get { return _port.txBufferSize; }
			set { throw new InvalidOperationException("Only available during port initialization"); }
		}

		public int			WriteTimeout
		{
			get { throw new NotImplementedException(); }
			set { throw new NotImplementedException(); }
		}


		public event SerialErrorEventHandler		ErrorEvent;
		public event SerialReceivedEventHandler		ReceivedEvent;
		public event SerialPinChangedEventHandler	PinChangedEvent;

		public void DiscardInBuffer()
		{
			// lock the rx FIFO while reading
			_port.rxBufferBusy.WaitOne();

			// Empty buffer
			_port.rxFIFO.Clear();

			// release the mutex so the Rx thread can continue
			_port.rxBufferBusy.ReleaseMutex();
		}

		public void DiscardOutBuffer()
		{
			_port.ptxBuffer = 0;
		}

		#endregion

		#region Internal Events Forwarding
		private void _port_DataReceived()
		{
			if( ReceivedEvent != null )
				ReceivedEvent(this, new SerialReceivedEventArgs(SerialReceived.ReceivedChars));
		}

		private void _port_OnError(string Description)
		{
			if( ErrorEvent != null )
			{
				SerialErrors err = (SerialErrors) 0;

				if( Description.IndexOf("Framing") >= 0 )
					err |= SerialErrors.Frame;
				if( Description.IndexOf("Overrun") >= 0 )
					err |= SerialErrors.Overrun;
				if( Description.IndexOf("Receive Overflow") >= 0 )
					err |= SerialErrors.RxOver;
				if( Description.IndexOf("Parity") >= 0 )
					err |= SerialErrors.RxParity;
				if( Description.IndexOf("Transmit Overflow") >= 0 )
					err |= SerialErrors.TxFull;

				ErrorEvent( this, new SerialErrorEventArgs(err) );
			}
		}

		private void _port_RingChange(bool NewState)
		{
			if( PinChangedEvent != null )
				PinChangedEvent(this, new SerialPinChangedEventArgs(SerialPinChanges.Ring));
		}

		private void _port_RLSDChange(bool NewState)
		{
			if( PinChangedEvent != null )
				PinChangedEvent(this, new SerialPinChangedEventArgs(SerialPinChanges.CDChanged));
		}

		#endregion

		#region Extern code declarations
		
		[DllImport("kernel32.dll")]
		static extern void SetLastError(uint dwErrCode);

		[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
		private extern static uint QueryDosDevice(
			[MarshalAs(UnmanagedType.LPTStr)]
			string lpDeviceName,
			[MarshalAs(UnmanagedType.LPTStr)]
			string lpTargetPath,
			uint ucchMax);
		
		#endregion
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人综合网站| 欧美性生活久久| av爱爱亚洲一区| 欧美性一二三区| 国产精品三级电影| 日韩电影免费一区| 成人激情动漫在线观看| 欧美一区二区三区系列电影| 国产精品欧美经典| 极品美女销魂一区二区三区| eeuss鲁片一区二区三区在线观看| 欧美精品第1页| 亚洲视频在线一区观看| 国产成人精品亚洲777人妖| 欧美一二三四在线| 一区二区成人在线| 国产一区二区电影| 欧美sm极限捆绑bd| 日日夜夜免费精品| 欧美色偷偷大香| 亚洲免费av在线| 成人午夜免费视频| 久久久一区二区三区| 久久se这里有精品| 欧美一区二区三区在线| 偷拍日韩校园综合在线| 欧美日韩在线播放三区四区| 亚洲精品视频观看| 在线看国产日韩| 一区二区三区欧美久久| 成人理论电影网| 国产精品萝li| 92国产精品观看| 亚洲视频你懂的| 成人av电影在线网| 91精品国产综合久久精品图片| 一区二区国产盗摄色噜噜| 91麻豆6部合集magnet| 国产精品久久久久久久久免费相片 | 一级特黄大欧美久久久| av亚洲精华国产精华| 亚洲欧洲日本在线| 国产精品影视在线观看| 国产日韩欧美a| 成人开心网精品视频| 亚洲三级小视频| 97精品超碰一区二区三区| 亚洲色大成网站www久久九九| 色婷婷国产精品久久包臀 | 日韩欧美美女一区二区三区| 美日韩黄色大片| 337p日本欧洲亚洲大胆精品| 国产在线一区二区| 国产欧美一二三区| 99久久久精品| 午夜欧美电影在线观看| 日韩精品一区二区三区四区视频 | 久久影院视频免费| 国产一区二区伦理| 国产农村妇女毛片精品久久麻豆| 国产成人精品免费| 亚洲码国产岛国毛片在线| 在线观看一区二区精品视频| 性久久久久久久| www欧美成人18+| 豆国产96在线|亚洲| 亚洲欧美视频在线观看| 欧美群妇大交群的观看方式| 蜜臀av性久久久久蜜臀av麻豆| 精品不卡在线视频| 色综合欧美在线| 亚洲成人av福利| 国产亚洲欧美在线| 欧洲一区二区三区在线| 七七婷婷婷婷精品国产| 欧美国产禁国产网站cc| 欧美日韩色一区| 成人午夜av影视| 亚洲韩国精品一区| 国产无一区二区| 欧美日韩高清影院| www.久久精品| 国产麻豆午夜三级精品| 亚洲高清在线精品| 国产精品久久久久一区二区三区| 4hu四虎永久在线影院成人| 国产精品夜夜爽| 秋霞国产午夜精品免费视频| 亚洲精品国产无天堂网2021 | 亚洲精品中文在线影院| 久久久久久久免费视频了| 欧美伦理影视网| 91片在线免费观看| 成人国产精品免费| 国产精品一级在线| 美女性感视频久久| 婷婷国产在线综合| 一区二区三区四区亚洲| 国产精品剧情在线亚洲| 精品国产凹凸成av人导航| 欧美精品亚洲二区| 欧美亚洲一区二区在线观看| aaa欧美日韩| 成人一二三区视频| 国产在线不卡一区| 久久91精品国产91久久小草| 日韩一区精品视频| 日本亚洲最大的色成网站www| 国产91精品一区二区麻豆网站| 日本午夜精品一区二区三区电影| 亚洲国产毛片aaaaa无费看| 综合电影一区二区三区| 中文字幕一区二区三区蜜月| www.日韩精品| 婷婷国产v国产偷v亚洲高清| 亚洲激情中文1区| 国产精品久久久久久久久快鸭| 欧美国产亚洲另类动漫| 日本一区二区三区四区| 国产精品视频一二三| 国产精品理伦片| 亚洲精品日韩一| 亚洲国产综合视频在线观看| 午夜精品福利在线| 奇米色777欧美一区二区| 毛片基地黄久久久久久天堂| 久久国产精品99久久人人澡| 国内精品国产成人| 风间由美一区二区三区在线观看| 国产成人精品综合在线观看| 99综合电影在线视频| 91成人国产精品| 91精品蜜臀在线一区尤物| 精品日韩欧美在线| 中文字幕av不卡| 亚洲免费电影在线| 奇米影视一区二区三区| 国产一区二区精品在线观看| 成人av资源站| 亚洲午夜久久久久久久久久久 | 美女视频黄免费的久久| 欧美极品少妇xxxxⅹ高跟鞋| 日韩一级精品视频在线观看| 欧美成人猛片aaaaaaa| 日本一二三四高清不卡| 一个色综合av| 乱中年女人伦av一区二区| 国产成人免费视频一区| 日本久久精品电影| 欧美成人在线直播| 亚洲男女毛片无遮挡| 日产国产欧美视频一区精品| 高清视频一区二区| 欧美日韩国产片| 国产日韩精品一区二区浪潮av| 亚洲欧洲中文日韩久久av乱码| 日本视频中文字幕一区二区三区| 国产精品一品二品| 欧美日韩在线播放三区四区| 中文字幕精品在线不卡| 日韩成人精品在线观看| 懂色av中文一区二区三区| 欧美日韩一级二级| 亚洲一区在线播放| 日本一区中文字幕| 91在线精品一区二区| 欧美第一区第二区| 伊人性伊人情综合网| 激情文学综合网| 欧美日韩成人综合| 亚洲美腿欧美偷拍| 国产精品1区2区| 日韩一区二区精品葵司在线| 一区二区不卡在线播放| 不卡区在线中文字幕| 久久综合五月天婷婷伊人| 亚洲成av人片一区二区| 91免费版在线| 国产精品国产三级国产普通话蜜臀| 欧美a级一区二区| 欧美久久久久久蜜桃| 亚洲免费在线看| 不卡高清视频专区| 亚洲国产精品99久久久久久久久| 久久爱www久久做| 日韩午夜小视频| 丝袜美腿亚洲色图| 欧美日韩精品欧美日韩精品| 一区二区三区四区精品在线视频| 懂色av噜噜一区二区三区av| 久久婷婷国产综合精品青草| 精品一区中文字幕| 欧美放荡的少妇| 最新热久久免费视频| 成人美女视频在线看| 国产欧美一区二区三区在线老狼| 久久99久久精品欧美| 精品国产精品一区二区夜夜嗨| 蜜臂av日日欢夜夜爽一区| 88在线观看91蜜桃国自产|