C#ºÍ232´®¿ÚͨÐÅ·½·¨£¨SerialPort¿Ø¼þ£© ÏÂÔØ±¾ÎÄ

±¾Àý³ÌÖ÷Òª½²½âʹÓÃC#£¬ÊµÏÖÓë232´®¿ÚͨÐÅ¡£´ïµ½²É¼¯´®¿ÚÊý¾Ý£¬¼à¿Ø£¬¿ÉÊÓ»¯´¦ÀíµÈ¡£

Ò»£®¸ÅÊö

ÔÚVisual Studio 6.0Öбàд´®¿ÚͨѶ³ÌÐò£¬Ò»°ã¶¼Ê¹ÓÃ

Microsoft Communication Control£¨¼ò³ÆMSComm£©µÄͨѶ¿Ø¼þ£¬Ö»ÒªÍ¨ ¹ý¶Ô´Ë¿Ø¼þµÄÊôÐÔºÍʼþ½øÐÐÏàÓ¦±à³Ì²Ù×÷£¬¾Í¿ÉÒÔÇáËɵØÊµÏÖ´®¿ÚͨѶ¡£µ«ÔÚMicrosoft.Net¼¼Êõ¹ã·ºÓ¦ÓõĽñÌ죬Visual Studio.NetûÓн«´Ë¿Ø¼þ¼ÓÈë¿Ø¼þ¿â£¬ËùÒÔÈËÃDzÉÓÃÁËÐí¶à·½·¨ÔÚVisual Studio.NetÀ´±àд´®¿ÚͨѶ³ÌÐò£ºµÚÒ»ÖÖ·½·¨ÊÇͨ¹ý²ÉÓÃVisual Studio 6.0ÖÐÔ­À´µÄMSComm¿Ø¼þÕâÊÇ×î¼òµ¥µÄ£¬×î·½±ãµÄ·½·¨£¬µ«ÐèҪע²á£»µÚ¶þÖÖ·½·¨ÊDzÉÓÃ΢ÈíÔÚ.NETÍÆ³öÁËÒ»¸ö´®¿Ú¿Ø¼þ£¬»ùÓÚ.NETµÄP/Invokeµ÷Ó÷½·¨ÊµÏÖ£»µÚÈýÖÖ·½·¨ÊÇ×Ô¼ºÓÃAPIд´®¿ÚͨÐÅ£¬ËäÈ»ÄѶȸߣ¬µ«¿ÉÒÔ·½±ãʵÏÖ×Ô¼ºÏëÒªµÄ¸÷ÖÖ¹¦ÄÜ¡£

ÏÖÔÚ΢ÈíÍÆ³öÁË×îа汾µÄVisual Studio 2005¿ª·¢¹¤¾ß£¬¿ÉÒÔ²»ÔÙ²ÉÓõÚÈý·½¿Ø¼þµÄ·½·¨À´Éè¼Æ´®¿ÚͨѶ³ÌÐò¡£NET Framework 2.0 Àà¿â°üº¬ÁËSerialPort Àà,·½±ãµØÊµÏÖÁËËùÐèÒª´®¿ÚͨѶµÄ¶àÖÖ¹¦ÄÜ£¬ÎªÁËʹMSComm±à³Ì·½·¨¿ìËÙת»»µ½ÒÔSerialPortÀàΪºËÐĵĴ®¿ÚͨѶµÄÉè¼Æ·½·¨£¬±¾ÎÄ×ÅÖØÌÖÂÛÁËVisual Studio 6.0µÄMSComm¿Ø¼þºÍSerialPort ÀàÉè¼Æ·½·¨µÄÒìͬµã¡£

¶þ£®SerialPort³£ÓÃÊôÐÔ¡¢·½·¨ºÍʼþ

1£®ÃüÃû¿Õ¼ä

System.IO.PortsÃüÃû¿Õ¼ä°üº¬ÁË¿ØÖÆ´®¿ÚÖØÒªµÄSerialPortÀ࣬¸ÃÀàÌṩÁËͬ²½ I/O ºÍʼþÇý¶¯µÄ I/O¡¢¶Ô¹Ü½ÅºÍÖжÏ״̬µÄ·ÃÎÊÒÔ¼°¶Ô´®ÐÐÇý¶¯³ÌÐòÊôÐԵķÃÎÊ£¬ËùÒÔÔÚ³ÌÐò´úÂëÆðʼλÖÃÐè¼ÓÈëUsing System.IO.Ports¡£

2£®´®¿ÚµÄͨѶ²ÎÊý

´®¿ÚͨѶ×î³£ÓõIJÎÊý¾ÍÊÇͨѶ¶Ë¿ÚºÅ¼°Í¨Ñ¶¸ñʽ(²¨ÌØÂÊ¡¢Êý¾Ýλ¡¢Í£Ö¹Î»ºÍУÑéλ)£¬ÔÚMSCommÖÐÏà¹ØµÄÊôÐÔÊÇCommPortºÍSettings¡£SerialPortÀàÓëMSCommÓÐÒ»Ð©Çø±ð:

a.ͨѶ¶Ë¿ÚºÅ

[PortName]ÊôÐÔ»ñÈ¡»òÉèÖÃͨÐŶ˿ڣ¬°üÀ¨µ«²»ÏÞÓÚËùÓпÉÓÃµÄ COM ¶Ë¿Ú£¬Çë×¢Òâ¸ÃÊôÐÔ·µ»ØÀàÐÍΪString£¬²»ÊÇMscomm.CommPortµÄshortÀàÐÍ¡£Í¨³£Çé¿öÏ£¬PortNameÕý³£·µ»ØµÄֵΪCOM1¡¢COM2¡­¡­£¬SerialPortÀà×î´óÖ§³ÖµÄ¶Ë¿ÚÊýÍ»ÆÆÁËCommPort¿Ø¼þÖÐCommPortÊôÐÔ²»Äܳ¬¹ý16µÄÏÞÖ¹£¬´ó´ó·½±ãÁËÓû§´®¿ÚÉ豸µÄÅäÖá£

b. ͨѶ¸ñʽ

SerialPortÀà¶Ô·Ö±ðÓÃ[BaudRate]¡¢[Parity]¡¢[DataBits]¡¢[StopBits]ÊôÐÔÉèÖÃͨѶ¸ñʽÖеIJ¨ÌØÂÊ¡¢Êý¾Ýλ¡¢Í£Ö¹Î»ºÍУÑé룬ÆäÖÐ[Parity]ºÍ[StopBits]·Ö±ðÊÇö¾ÙÀàÐÍParity¡¢StopBits£¬ParityÀàÐÍÖÐö¾ÙÁËOdd(Ææ)¡¢Even(ż)¡¢Mark¡¢None¡¢Space£¬Parityö¾ÙÁËNone¡¢One¡¢OnePointFive¡¢Two¡£

SerialPortÀàÌṩÁËÆß¸öÖØÔØµÄ¹¹Ô캯Êý£¬¼È¿ÉÒÔ¶ÔÒѾ­ÊµÀý»¯µÄSerialPort¶ÔÏóÉèÖÃÉÏÊöÏà¹ØÊôÐÔµÄÖµ£¬Ò²¿ÉÒÔʹÓÃÖ¸¶¨µÄ¶Ë¿ÚÃû³Æ¡¢²¨ÌØÂÊºÍÆæÅ¼Ð£ÑéλÊý¾ÝλºÍֹͣλֱ½Ó³õʼ»¯ SerialPort ÀàµÄÐÂʵÀý¡£

3£®´®¿ÚµÄ´ò¿ªºÍ¹Ø±Õ

SerialPortÀàûÓвÉÓÃMSComm.PortOpen=True/FalseÉèÖÃÊôÐÔÖµ´ò¿ª¹Ø±Õ´®¿Ú£¬ÏàÓ¦µÄÊǵ÷ÓÃÀàµÄOpen()ºÍClose()·½·¨¡£

4. Êý¾ÝµÄ·¢ËͺͶÁÈ¡

SerialÀàµ÷ÓÃÖØÔØµÄWriteºÍWriteLine·½·¨·¢ËÍÊý¾Ý£¬ÆäÖÐWriteLine¿É·¢ËÍ×Ö·û´®²¢ÔÚ×Ö·û´®Ä©Î²¼ÓÈë»»Ðзû£¬¶ÁÈ¡´®¿Ú»º³åÇøµÄ·½·¨ÓÐÐí¶à£¬ÆäÖгýÁËReadExistingºÍReadTo,ÆäÓàµÄ·½·¨¶¼ÊÇͬ²½µ÷Óã¬Ï̱߳»×èÈûÖ±µ½»º³åÇøÓÐÏàÓ¦µÄÊý¾Ý»ò´óÓÚReadTimeOutÊôÐÔÉ趨µÄʱ¼äÖµºó£¬Òý·¢ReadExistingÒì³£¡£

5.DataReceivedʼþ

¸ÃʼþÀàËÆÓÚMSComm¿Ø¼þÖеÄOnCommʼþ£¬DataReceivedʼþÔÚ½ÓÊÕµ½ÁË[ReceivedBytesThreshold]ÉèÖõÄ×Ö·û¸öÊý»ò½ÓÊÕµ½ÁËÎļþ½áÊø×Ö·û²¢½«Æä·ÅÈëÁËÊäÈ뻺³åÇøÊ±±»´¥·¢¡£ÆäÖÐ[ReceivedBytesThreshold]Ï൱ÓÚMSComm¿Ø¼þµÄ[Rthreshold]ÊôÐÔ£¬¸ÃʼþµÄÓ÷¨ÓëMsComm¿Ø¼þµÄ

OnCommʼþÔÚCommEventΪcomEvSendºÍcomEvEofʱÊÇÒ»Öµġ£

Èý£®SerialPortµÄʹÓÃ

¶ÔÓÚÊìϤMSComm¿Ø¼þµÄ³ÌÐòÉè¼ÆÕߣ¬SerialPortÀàÊÇÏ൱ÈÝÒ×ÉÏÊֵġ£ÔÚ½øÐд®¿ÚͨѶʱ£¬Ò»°ãµÄÁ÷³ÌÊÇÉèÖÃͨѶ¶Ë¿ÚºÅ¼°²¨ÌØÂÊ¡¢Êý¾Ýλ¡¢Í£Ö¹Î»ºÍУÑé룬ÔÙ´ò¿ª¶Ë¿ÚÁ¬½Ó£¬·¢ËÍÊý¾Ý£¬½ÓÊÕÊý¾Ý£¬×îºó¹Ø±Õ¶Ë¿ÚÁ¬½ÓÕâÑù¼¸¸ö²½Öè¡£

Êý¾Ý½ÓÊÕµÄÉè¼Æ·½·¨ÔÚÕâÀï±È½ÏÖØÒª£¬²ÉÓÃÂÖѯµÄ·½·¨±È½ÏÀË·Ñʱ¼ä£¬ÔÚVisual BasicÖеÄÑÓʱ·½·¨ÖÐÒ»°ã»áµ÷ÓÃAPI²¢ÓÃDOEvents·½·¨À´´¦Àí£¬µ«³ÌÐò²»Ò׿ØÖÆ£¬½¨Òé²ÉÓÃDataReceivedʼþ´¥·¢µÄ·½·¨£¬ºÏÀíµÄÉèÖÃReceivedBytesThresholdµÄÖµ£¬Èô½ÓÊÕµÄÊǶ¨³¤µÄÊý¾Ý£¬Ôò½«

ReceivedBytesThresholdÉèΪ½ÓÊÕÊý¾ÝµÄ³¤¶È£¬Èô½ÓÊÕÊý¾ÝµÄ½áβÊǹ̶¨µÄ×Ö·û»ò×Ö·û´®Ôò¿É²ÉÓÃReadToµÄ·½·¨»òÔÚDataReceivedʼþÖÐÅжϽÓÊÕµÄ×Ö·ûÊÇ·ñÂú×ãÌõ¼þ¡£

SerialPortÀà¶ÁÈ¡Êý¾ÝµÄÐí¶à·½·¨ÊÇͬ²½×èÈûµ÷Ó㬾¡Á¿±ÜÃâÔÚÖ÷Ïß³ÌÖе÷Ó㬿ÉÒÔʹÓÃÒì²½´¦Àí»òÏ̼߳䴦Àíµ÷ÓÃÕâЩ¶ÁÈ¡Êý¾ÝµÄ·½·¨¡£

ÓÉÓÚDataReceivedʼþÔÚ¸¨Ï̱߳»Òý·¢£¬µ±ÊÕµ½ÍêÕûµÄÒ»ÌõÊý¾Ý£¬·µ»ØÖ÷Ï̴߳¦Àí»òÔÚ´°ÌåÉÏÏÔʾʱ£¬Çë×¢Òâ¿çÏ̵߳Ĵ¦Àí£¬C#¿É²ÉÓÿؼþÒ첽ίÍеķ½·¨Control.BeginInvoke¼°Í¬²½Î¯Íеķ½·¨Invoke¡£

ËÄ£®½áÊøÓï

ÔÚ.NETƽ̨ÏÂÊìÁ·Ê¹ÓÃSerialPort À࣬¿ÉÒԺܺõؿª·¢³ö´®¿ÚͨѶÀà³ÌÐò£¬¶ÔÓÚ¹ýȥʹÓÃMSComm¿Ø¼þÉè¼ÆÁËһЩͨѶ³ÌÐò£¬Ò²¿ÉÒÔ½«MSComm¿Ø¼þÌæ»»ÎªSerialPortÀ࣬µ±È»ÎªÁ˱ÜÃâ¶ÔÒÔǰµÄÏîÄ¿×ö´óµÄ¸Ä¶¯£¬¿ÉÒÔʹÓÃSerialPortÀàÉè¼ÆÒ»Ð©ÓëMSComm¿Ø¼þ¾ßÓÐÏàͬ½Ó¿ÚµÄÀ࣬ÔÚ½ñºó¹¤Òµ¿ØÖÆÖУ¬SerialPortÀཫ¹ã·ºµØÓ¦ÓÃÓÚ´®¿ÚͨѶ³ÌÐòµÄÉè¼ÆÖУ¬·¢»Ó×ÅÓëMSComm¿Ø¼þÒ»ÑùµÄ×÷Óá£

C# SerialPortÔËÐз½Ê½

SerialPortÖд®¿ÚÊý¾ÝµÄ¶ÁÈ¡ÓëдÈëÓнϴóµÄ²»Í¬¡£ÓÉÓÚ´®¿Ú²»ÖªµÀÊý¾ÝºÎʱµ½´ï£¬Òò´ËÓÐÁ½ÖÖ·½·¨¿ÉÒÔʵÏÖ´®¿ÚÊý¾ÝµÄ¶ÁÈ¡¡£Ò»¡¢Ïß³Ìʵʱ¶Á´®¿Ú£»¶þ¡¢Ê¼þ´¥·¢·½Ê½ÊµÏÖ¡£

ÓÉÓÚÏß³Ìʵʱ¶Á´®¿ÚµÄЧÂʲ»ÊÇÊ®·Ö¸ßЧ£¬Òò´Ë±È½ÏºÃµÄ·½·¨ÊÇʼþ´¥·¢µÄ·½Ê½¡£ÔÚSerialPortÀàÖÐÓÐDataReceivedʼþ£¬µ±´®¿ÚµÄ¶Á»º´æÓÐÊý¾Ýµ½´ïʱÔò´¥·¢DataReceivedʼþ£¬ÆäÖÐSerialPort.ReceivedBytesThresholdÊôÐÔ¾ö¶¨Á˵±´®¿Ú¶Á»º´æÖÐÊý¾Ý¶àÉÙ¸öʱ²Å´¥·¢DataReceivedʼþ£¬Ä¬ÈÏΪ1¡£

ÁíÍ⣬SerialPort.DataReceivedʼþÔËÐбȽÏÌØÊ⣬ÆäÔËÐÐÔÚ¸¨Ị̈߳¬²»ÄÜÓëÖ÷Ïß³ÌÖеÄÏÔʾÊý¾Ý¿Ø¼þÖ±½Ó½øÐÐÊý¾Ý´«Ê䣬±ØÐëÓüä½ÓµÄ·½Ê½ÊµÏÖ¡£ÈçÏ£º

SerialPort spSend; //spSend,spReceiveÓÃÐéÄâ´®¿ÚÁ¬½Ó£¬ËüÃÇÖ®¼ä¿ÉÒÔÏ໥´«ÊäÊý¾Ý¡£spSend·¢ËÍÊý¾Ý

SerialPort spReceive; //spReceive½ÓÊÜÊý¾Ý TextBox txtSend; //·¢ËÍÇø TextBox txtReceive; //½ÓÊÜÇø Button btnSend; //Êý¾Ý·¢ËͰ´Å¥

delegate void HandleInterfaceUpdateDelegate(string text); //ίÍУ¬´ËÎªÖØµã HandleInterfaceUpdateDelegate interfaceUpdateHandle;

public void InitClient() //´°Ìå¿Ø¼þÒÑÔÚ³õʼ»¯ {

interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //ʵÀý»¯Î¯ÍжÔÏó

spSend.Open(); //SerialPort¶ÔÏóÔÚ³ÌÐò½áÊøÇ°±ØÐë¹Ø±Õ£¬ÔÚ´Ë˵Ã÷

spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);

spReceive.ReceivedBytesThreshold = 1; spReceive.Open(); }

public void btnSend_Click(object sender,EventArgs e) {

spSend.WriteLine(txtSend.Text); }

public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e) {

byte[] readBuffer = new byte[spReceive.ReadBufferSize]; spReceive.Read(readBuffer, 0, readBuffer.Length);

this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) }); }

private void UpdateTextBox(string text)

{

txtReceive.Text = text; }

µãÆÀ:Õâ¸öÀý×Ó°üÀ¨ÁËÕâ¸ö¿Ø¼þ¼¸ºõËùÓеIJÙ×÷,·Ç³£Óвο¼¼ÛÖµ.serialPortÊÇÔÚ.net framework2.0ÖвÅÓеĶ«Î÷,¸Ð¾õÕâ¸ö¶«Î÷ºÍMSCOMMºÜÏàËÆ.ÕâÀï¸ø³öµÄÀý×ÓÊÇ»ùÓÚvb.netºÍCSHAPE µÄ,ÏàÓ¦µÄ¿ÉÒÔÔÚCshapeºÍc++ÖÐʹÓÃ,»ù±¾É϶¼ÊÇÒ»ÑùµÄ.

Imports System

Imports System.IO.Ports Imports System.Threading

Public Class PortChat

Shared _continue As Boolean

Shared _serialPort As SerialPort

Public Shared Sub Main() Dim name As String Dim message As String

Dim sComparer As StringComparer = StringComparer.OrdinalIgnoreCase

Dim readThread As Thread = New Thread(AddressOf Read)

' Create a new SerialPort object with default settings.

_serialPort = New SerialPort()

' Allow the user to set the appropriate properties.

_serialPort.PortName = SetPortName(_serialPort.PortName)

_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate) _serialPort.Parity = SetPortParity(_serialPort.Parity)

_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits) _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits) _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake)

' Set the read/write timeouts _serialPort.ReadTimeout = 500 _serialPort.WriteTimeout = 500

_serialPort.Open() _continue = True readThread.Start()

Console.Write(\) name = Console.ReadLine()

Console.WriteLine(\)

While (_continue)

message = Console.ReadLine()

If sComparer.Equals(\, message) Then

_continue = False Else

_serialPort.WriteLine( _ String.Format(\{1}\, name, message))

End If end while

readThread.Join() _serialPort.Close() End Sub

Public Shared Sub Read() While (_continue) Try

Dim message As String = _serialPort.ReadLine()

Console.WriteLine(message) Catch ex As TimeoutException ' Do nothing End Try End While End Sub

Public Shared Function SetPortName(ByVal defaultPortName As String) As String

Dim newPortName As String

Console.WriteLine(\)

Dim s As String

For Each s In SerialPort.GetPortNames() Console.WriteLine(\, s) Next s

Console.Write(\, defaultPortName)

newPortName = Console.ReadLine()

If newPortName = \ Then

newPortName = defaultPortName End If

Return newPortName End Function

Public Shared Function SetPortBaudRate(ByVal defaultPortBaudRate As Integer) As Integer Dim newBaudRate As String

Console.Write(\, defaultPortBaudRate)

newBaudRate = Console.ReadLine()

If newBaudRate = \ Then newBaudRate = defaultPortBaudRate.ToString() End If

Return Integer.Parse(newBaudRate)

End Function

Public Shared Function SetPortParity(ByVal defaultPortParity As Parity) As Parity Dim newParity As String

Console.WriteLine(\options:\)

Dim s As String

For Each s In [Enum].GetNames(GetType(Parity)) Console.WriteLine(\, s) Next s

Console.Write(\, defaultPortParity.ToString())

newparity = Console.ReadLine()

If newparity = \ Then newparity = defaultPortParity.ToString() End If

Return CType([Enum].Parse(GetType(Parity), newParity), Parity) End Function

Public Shared Function SetPortDataBits(ByVal defaultPortDataBits As Integer) As Integer Dim newDataBits As String

Console.Write(\, defaultPortDataBits)

newDataBits = Console.ReadLine()

If newDataBits = \ Then newDataBits = defaultPortDataBits.ToString() End If

Return Integer.Parse(newDataBits) End Function

Public Shared Function SetPortStopBits(ByVal defaultPortStopBits As StopBits) As StopBits Dim newStopBits As String

Console.WriteLine(\options:\)

Dim s As String For Each s In [Enum].GetNames(GetType(StopBits))

Console.WriteLine(\, s) Next s

Console.Write(\, defaultPortStopBits.ToString())

newStopBits = Console.ReadLine()

If newStopBits = \ Then newStopBits = defaultPortStopBits.ToString() End If

Return

CType([Enum].Parse(GetType(StopBits), newStopBits), StopBits) End Function

Public Shared Function SetPortHandshake(ByVal defaultPortHandshake As Handshake) As Handshake Dim newHandshake As String

Console.WriteLine(\options:\)

Dim s As String For Each s In [Enum].GetNames(GetType(Handshake))

Console.WriteLine(\, s) Next s

Console.Write(\, defaultPortHandshake.ToString())

newHandshake = Console.ReadLine()

If newHandshake = \ Then newHandshake = defaultPortHandshake.ToString() End If

Return CType([Enum].Parse(GetType(Handshake), newHandshake), Handshake) End Function End Class using System; using System.IO.Ports; using System.Threading; public class PortChat { static bool _continue; static SerialPort _serialPort; public static void Main() { string name; string message; StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); // Allow the user to set the appropriate properties.

_serialPort.PortName = SetPortName(_serialPort.PortName); _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate); _serialPort.Parity = SetPortParity(_serialPort.Parity); _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits); _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits); _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);

// Set the read/write timeouts

_serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500;

_serialPort.Open(); _continue = true; readThread.Start();

Console.Write(\); name = Console.ReadLine();

Console.WriteLine(\);

while (_continue)

{

message = Console.ReadLine();

if (stringComparer.Equals(\, message))

{

_continue = false; } else {

_serialPort.WriteLine(

String.Format(\{1}\, name, message) ); } }

readThread.Join(); _serialPort.Close(); }

public static void Read() {

while (_continue) {

try {

string message = _serialPort.ReadLine();

Console.WriteLine(message);

}

catch (TimeoutException) { } } }

public static string SetPortName(string defaultPortName) {

string portName;

Console.WriteLine(\);

foreach (string s in SerialPort.GetPortNames()) {

Console.WriteLine(\, s); }

Console.Write(\, defaultPortName);

portName = Console.ReadLine();

if (portName == \) {

portName = defaultPortName; }

return portName; }

public static int SetPortBaudRate(int defaultPortBaudRate)

{

string baudRate;

Console.Write(\, defaultPortBaudRate);

baudRate = Console.ReadLine();

if (baudRate == \) {

baudRate = defaultPortBaudRate.ToString(); }

return int.Parse(baudRate); }

public static Parity SetPortParity(Parity defaultPortParity) {

string parity;

Console.WriteLine(\options:\);

foreach (string s in Enum.GetNames(typeof(Parity))) {

Console.WriteLine(\, s); }

Console.Write(\, defaultPortParity.ToString());

parity = Console.ReadLine();

if (parity == \) {

parity = defaultPortParity.ToString(); }

return (Parity)Enum.Parse(typeof(Parity), parity); }

public static int SetPortDataBits(int defaultPortDataBits) {

string dataBits;

Console.Write(\, defaultPortDataBits);

dataBits = Console.ReadLine();

if (dataBits == \) {

dataBits = defaultPortDataBits.ToString(); }

return int.Parse(dataBits);

}

public static StopBits SetPortStopBits(StopBits defaultPortStopBits) {

string stopBits;

Console.WriteLine(\options:\);

foreach (string s in Enum.GetNames(typeof(StopBits))) {

Console.WriteLine(\, s); }

Console.Write(\, defaultPortStopBits.ToString());

stopBits = Console.ReadLine();

if (stopBits == \) {

stopBits = defaultPortStopBits.ToString(); }

return (StopBits)Enum.Parse(typeof(StopBits), stopBits); }

public static Handshake SetPortHandshake(Handshake defaultPortHandshake) {

string handshake;

Console.WriteLine(\options:\);

foreach (string s in Enum.GetNames(typeof(Handshake))) {

Console.WriteLine(\, s); }

Console.Write(\, defaultPortHandshake.ToString());

handshake = Console.ReadLine();

if (handshake == \) {

handshake = defaultPortHandshake.ToString(); }

return

(Handshake)Enum.Parse(typeof(Handshake), handshake); } }

SerialPortÀàµÄÔ´´úÂëÒѾ­·ÅÔÚÏÂÃæ£¬SerialPortÀàÊÇÓÉRemon SpekreijseÌṩµÄÃâ·Ñ´®¿ÚÀà¡£ CSerialPortÖ§³ÖÏßÁ¬½ÓµÄ´®¿Ú±à³Ì£¬¶øÇÒÊÇ»ùÓÚ¶àÏ̵߳쬹¤×÷Á÷³Ì£º

1.ÉèÖô®¿Ú²ÎÊý¡£ º¯ÊýÔ­ÐÍ£º

BOOL CSerialPort::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message) UINT portnr, // portnumber (1..4) UINT baud, // baudrate char parity, // parity UINT databits, // databits UINT stopbits, // stopbits DWORD dwCommEvents, // EV_RXCHAR, EV_CTS etc UINT writebuffersize) // size to the writebuffer

2.´®¿Ú¼à²âÏ̡߳£

BOOL CSerialPort::StartMonitoring() BOOL CSerialPort::RestartMonitoring() BOOL CSerialPort::StopMonitoring() void CSerialPort::WriteChar(CSerialPort* port) void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat) void CSerialPort::WriteToPort(char* string) 3.¼à²âÏ߳̽ÓÊÕʼþÐÅÏ¢£¬ÔÙ½øÐÐÏûÏ¢´¦Àí¼´¿É¡£ SerialPortÀàµÄÓ¦ÓÃ

»ùÓÚ¶Ô»°¿òµÄ´®¿Ú³ÌÐò¿ª·¢£º

1.½«SerialPortÀàÌí¼Ó½ø¹¤³Ì£» 2.½øÐÐÏûÏ¢µÄÓ³É䣻

£¨×¢Ò⣺ÔÚSerialPortÀàµÄÍ·ÎļþÖеģº

#define WM_COMM_RXCHAR WM_USER+7 ÐèÒªÊÖ¶¯½øÐÐÓ³É䣩

ÔÚ¹¤³ÌµÄÖ÷¶Ô»°¿òÍ·ÎļþÖУ¬¸ñʽÈçÏ£º

afx_msg LONG OnComm(WPARAM ch,LPARAM port);

ÔÚ¹¤³ÌµÄÖ÷¶Ô»°¿òµÄCPPÎļþÖУ¬¸ñʽÈçÏ£º

BEGIN_MESSAGE_MAP(CMy20040889SerialPortTestDlg, CDialog)

//{{AFX_MSG_MAP(CMy20040889SerialPortTestDlg)

ON_MESSAGE(WM_COMM_RXCHAR,OnComm) ...

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

È»ºóÔÚCPPÖÐÌí¼ÓÏûÏ¢´¦Àíº¯Êý£¬±¾ÀýÖÐΪOnComm¡£ ÀýÈ磺

LONG CTestDlg::OnComm(WPARAM ch, LPARAM port) {

m_strEditReceiveMsg += ch;

UpdateData(FALSE); return 0; }

//m_strEditReceiveMsg ΪEDIT¿Ø¼þ£¨½ÓÊÕ¿ò£©µÄ±äÁ¿¡£

//ÏÂÃæµÄm_strEditSendMsgͬÑù´¦Àí¡£

3.ʵÏÖ´®¿ÚµÄ³õʼ»¯£¬´ò¿ª/¹Ø±Õ´®¿Ú°´Å¥µÄÏìÓ¦º¯Êý£¬×îºóÊÇ·¢ËÍÐÅÏ¢°´Å¥µÄº¯ÊýʵÏÖ¡£

void CTestDlg::OnButtonOpen() { int nPort=m_ctrlComboComPort.GetCurSel()+1;

if(m_SerialPort.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)) {

m_SerialPort.StartMonitoring();

m_bSerialPortOpened=TRUE; } else {

AfxMessageBox(\ûÓз¢ÏÖ´Ë´®¿Ú»ò±»Õ¼ÓÃ\

m_bSerialPortOpened=FALSE; }

GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);

GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened); }

void CTestDlg::OnButtonClose() {

m_SerialPort.ClosePort();

m_bSerialPortOpened=FALSE;

GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);

GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened); }

void CTestDlg::OnButtonSend() {

if(!m_bSerialPortOpened) return; UpdateData(TRUE); //¶ÁÈë±à¼­¿òÖеÄÊý¾Ý

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);//·¢ËÍÊý¾Ý }

´«¸ÐÆ÷(c#2.0)serialPort´®¿ÚͨѶ 2007Äê10ÔÂ12ÈÕ ÐÇÆÚÎå 15:44 using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Data.SqlClient; using System.Drawing; using System.Text;

using System.Windows.Forms; using System.Configuration; using System.IO;

using System.IO.Ports;

namespace WindowsApplication2 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent(); }

int iCount; int numbers; byte rlenth; bool bRLenth; int bRStart; bool bRParam; byte Rchk; int LParam; byte[] RParam; bool brcmd; byte RCmd; bool bRchk; bool bfinish;

private void Form1_Load(object sender, EventArgs e) {

//Form1 Form1 = new Form1(); try {

if (this.serialPort1.IsOpen) {

serialPort1.Close(); } else {

serialPort1.PortName = \//Ñ¡Ôñ´®¿ÚCOM1

serialPort1.BaudRate = 9600; //ÉèÖÃͨÐſڲÎÊý

serialPort1.DataBits = 8; //Êý¾Ýλ

serialPort1.Parity = System.IO.Ports.Parity.None;//УÑéλ ÎÞУÑé

serialPort1.StopBits = System.IO.Ports.StopBits.One;//ֹͣλ£±Î»

serialPort1.ReadBufferSize = 1024; //½ÓÊÕ»º³åÇø´óС

serialPort1.WriteBufferSize = 1024; //·¢ËÍ»º³åÇø´óС serialPort1.Open();

serialPort1.ReadExisting(); //ÉèÖÃInput´Ó½ÓÊÕ»º³å¶Áȡȫ²¿Êý¾Ý

serialPort1.ReceivedBytesThreshold = 1; //ÉèÖÃÒý·¢OnCommʼþµÄ×Ö½Ú³¤¶È

serialPort1.DiscardInBuffer() ; //Çå³ý½ÓÊÕ»º³åÇø

serialPort1.DiscardOutBuffer() ; //Çå³ý·¢ËÍ»º³åÇø

}

string connstr =

System.Configuration.ConfigurationManager.AppSettings[\ring\

SqlConnection conn = new SqlConnection(connstr);

ʱ¼ä,price,card from test01\ SqlDataAdapter(sql, conn);

conn.Open();

string sql = \ name as SqlDataAdapter da = new DataSet ds = new DataSet(); da.Fill(ds, \

ultraChart1.DataSource = ds.Tables[0].DefaultView;

dataGridView1.DataSource = ds.Tables[0].DefaultView;

ultraChart1.Axis.Y.LogBase = 1000; ultraChart1.Axis.Y.RangeMax = 30000; ultraChart1.Axis.Y.RangeMin = 0; Application.EnableVisualStyles(); Application.DoEvents(); }

catch (Exception ex) {

MessageBox.Show(\ageBoxButtons.OK,MessageBoxIcon.Error); }

//ultraChart1.

}

///

/// ȡǰºó´æ´¢Æ÷Á½¸öÖµ¶Ô±È,Ó¦¸¶µçÄÔÒì³£Í˳ö ///

/// ///

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { try {

//Byte[] dataread = new Byte[8] ;

//serialPort1.Read(dataread, 0, dataread.Length);

//int productline=dataread[0]; //½Ó¿ÚºÅ

//iCount=dataread[5]; string connstr =

System.Configuration.ConfigurationManager.AppSettings[\ring\

SqlConnection conn = new SqlConnection(connstr);

conn.Open();

//if (dataread[0] == 0xAA) //{

// //

MessageBox.Show(productline.ToString(), \MessageBoxIcon.Error);

// numbers = 0; // numbers =

Convert.ToInt32(dataread[4]) * 256 ^ 1 + Convert.ToInt32(dataread[5]); // numbers =

Convert.ToInt32(dataread[4]) * Convert.ToInt32(System.Math.Pow(256, 1)) + Convert.ToInt32(dataread[5]);

// SqlCommand cmd = new SqlCommand(\

// cmd.CommandType = CommandType.StoredProcedure;

// cmd.Parameters.Add(\tity\

// cmd.Parameters[\\

// cmd.Parameters.Add(\s\

// cmd.Parameters[\Value = dataread[3];

// cmd.ExecuteNonQuery(); //}

byte[] DataRead; int bytData ; int bytnum;

//bytnum = serialPort1.ReadByte; ;

// TODO: NotImplemented statement: ICSharpCode.SharpRefactory.Parser.AST.VB.OnErrorStatement if (serialPort1.ReceivedBytesThreshold == serialPort1.ReceivedBytesThreshold) {

bytnum = serialPort1.BytesToRead;

DataRead = new byte[bytnum]; // TODO: NotImplemented statement: ICSharpCode.SharpRefactory.Parser.AST.VB.ReDimStatement for (int k = 0; k <= (bytnum - 1); k++)

{

bytData= serialPort1.ReadByte();

DataRead[k] =(byte) bytData;

bfinish = RFJ(DataRead[k]);

if (bfinish) {

//System.Convert.ToInt32(RCmd)Ϊ¶Ë¿ÚºÅ

iCount = 0; for (int j = 0; j <= 1; j++)

{

iCount += System.Convert.ToInt32(RParam[j]) * Convert.ToInt32(Math.Pow(256, j));

} cmd = new SqlCommand(\ ype = CommandType.StoredProcedure;

rs.Add(\

rs[\

rs.Add(\

SqlCommand cmd.CommandT cmd.Paramete cmd.Paramete cmd.Paramete

cmd.Parameters[\

cmd.ExecuteNonQuery();

} } }

}

catch (IOException ex) {

throw (ex); }

}

private void timer1_Tick(object sender, EventArgs e) {

//this.Opacity -= -0.1; //if (this.Opacity==0) //{

// timer1.Enabled = false; // this.Close(); //} }

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {

Win32.AnimateWindow(this.Handle, 2500, Win32.AW_SLIDE | Win32.AW_HIDE | Win32.AW_BLEND); // e.Cancel = true; //timer1.Enabled = true; }

private void Btn_OK_Click(object sender, EventArgs e) {

popupNotifier1.Popup(); }

private bool RFJ(byte Data)

{

bool result=false; if (bRStart == 0) {

if (Data == 0xAA) {

bRStart = 1; } }

else if (bRStart == 1) {

if (Data == 0x55) {

bRStart = 2; }

else if (Data == 0xAA) {

bRStart = 1; } else {

bRStart = 0; } }

else if (bRLenth == false) {

if (Data < 20) {

bRLenth = true; rlenth = Data; Rchk = Data;

LParam = (int)(rlenth) - 3; RParam = new byte[2]; } else {

bRStart = 0; } }

else if (brcmd == false) {

brcmd = true; RCmd = Data;

Rchk = (byte)(Rchk ^ Data); }

else if (bRParam == false) {

if (LParam >= 0) {

RParam[LParam] = Data;

Rchk = (byte)(Rchk ^ Data); LParam = LParam - 1; }

if (LParam < 0) {

bRParam = true; } }

else if (bRchk == false) {

if (Rchk == Data) {

result = true; } else {

bRStart = 0; bRLenth = false; brcmd = false; bRParam = false; } }

return result; }

} }

ʹÓÃSerialPortÀàÉè¼Æ´®¿ÚͨѶ³ÌÐò 2007-12-10 14:11

Ò»£®¸ÅÊö

ÔÚVisual Studio 6.0Öбàд´®¿ÚͨѶ³ÌÐò£¬Ò»°ã¶¼Ê¹ÓÃMicrosoft Communication Control£¨¼ò³ÆMSComm£©µÄͨѶ¿Ø¼þ£¬Ö»ÒªÍ¨ ¹ý¶Ô´Ë¿Ø¼þµÄÊôÐÔºÍʼþ½øÐÐÏàÓ¦±à³Ì²Ù×÷£¬¾Í¿ÉÒÔÇáËɵØÊµÏÖ´®¿ÚͨѶ¡£µ«ÔÚMicrosoft.Net¼¼Êõ¹ã·ºÓ¦ÓõĽñÌ죬Visual Studio.NetûÓн«´Ë¿Ø¼þ¼ÓÈë¿Ø¼þ¿â£¬ËùÒÔÈËÃDzÉÓÃÁËÐí¶à·½·¨ÔÚVisual Studio.NetÀ´±àд´®¿ÚͨѶ³ÌÐò£ºµÚÒ»ÖÖ·½·¨ÊÇͨ¹ý²ÉÓÃVisual Studio 6.0ÖÐÔ­À´µÄMSComm¿Ø¼þÕâÊÇ×î¼òµ¥µÄ£¬×î·½±ãµÄ·½·¨£¬µ«ÐèҪע²á£»µÚ¶þÖÖ·½·¨ÊDzÉÓÃ΢ÈíÔÚ.NETÍÆ³öÁËÒ»¸ö´®¿Ú¿Ø¼þ£¬»ùÓÚ.NETµÄP/Invokeµ÷Ó÷½·¨ÊµÏÖ£»µÚÈýÖÖ·½·¨ÊÇ×Ô¼ºÓÃAPIд´®¿ÚͨÐÅ£¬ËäÈ»ÄѶȸߣ¬µ«¿ÉÒÔ·½±ãʵÏÖ×Ô¼ºÏëÒªµÄ¸÷ÖÖ¹¦ÄÜ¡£

ÏÖÔÚ΢ÈíÍÆ³öÁË×îа汾µÄVisual Studio 2005¿ª·¢¹¤¾ß£¬¿ÉÒÔ²»ÔÙ²ÉÓõÚÈý·½¿Ø¼þµÄ·½·¨À´Éè¼Æ´®¿ÚͨѶ³ÌÐò¡£NET Framework 2.0 Àà¿â°üº¬ÁËSerialPort Àà,·½±ãµØÊµÏÖÁËËùÐèÒª´®¿ÚͨѶµÄ¶àÖÖ¹¦ÄÜ£¬ÎªÁËʹMSComm±à³Ì·½·¨¿ìËÙת»»µ½ÒÔSerialPortÀàΪºËÐĵĴ®¿ÚͨѶµÄÉè¼Æ·½·¨£¬±¾ÎÄ×ÅÖØÌÖÂÛÁËVisual Studio 6.0µÄMSComm¿Ø¼þºÍSerialPort ÀàÉè¼Æ·½·¨µÄÒìͬµã¡£

¶þ£®SerialPort³£ÓÃÊôÐÔ¡¢·½·¨ºÍʼþ 1£®ÃüÃû¿Õ¼ä

System.IO.PortsÃüÃû¿Õ¼ä°üº¬ÁË¿ØÖÆ´®¿ÚÖØÒªµÄSerialPortÀ࣬¸ÃÀàÌṩÁËͬ²½ I/O ºÍʼþÇý¶¯µÄ I/O¡¢¶Ô¹Ü½ÅºÍÖжÏ״̬µÄ·ÃÎÊÒÔ¼°¶Ô´®ÐÐÇý¶¯³ÌÐòÊôÐԵķÃÎÊ£¬ËùÒÔÔÚ³ÌÐò´úÂëÆðʼλÖÃÐè¼ÓÈëUsing System.IO.Ports¡£ 2£®´®¿ÚµÄͨѶ²ÎÊý

´®¿ÚͨѶ×î³£ÓõIJÎÊý¾ÍÊÇͨѶ¶Ë¿ÚºÅ¼°Í¨Ñ¶¸ñʽ(²¨ÌØÂÊ¡¢Êý¾Ýλ¡¢Í£Ö¹Î»ºÍУÑéλ)£¬ÔÚMSCommÖÐÏà¹ØµÄÊôÐÔÊÇCommPortºÍSettings¡£SerialPortÀàÓëMSCommÓÐÒ»Ð©Çø±ð: a.ͨѶ¶Ë¿ÚºÅ

[PortName]ÊôÐÔ»ñÈ¡»òÉèÖÃͨÐŶ˿ڣ¬°üÀ¨µ«²»ÏÞÓÚËùÓпÉÓÃµÄ COM ¶Ë¿Ú£¬Çë×¢Òâ¸ÃÊôÐÔ·µ»ØÀàÐÍΪString£¬²»ÊÇMscomm.CommPortµÄshortÀàÐÍ¡£Í¨³£Çé¿öÏ£¬PortNameÕý³£·µ»ØµÄֵΪCOM1¡¢COM2¡­¡­£¬SerialPortÀà×î´óÖ§³ÖµÄ¶Ë¿ÚÊýÍ»ÆÆÁËCommPort¿Ø¼þÖÐCommPortÊôÐÔ²»Äܳ¬¹ý16µÄÏÞÖ¹£¬´ó´ó·½±ãÁËÓû§´®¿ÚÉ豸µÄÅäÖᣠb. ͨѶ¸ñʽ

SerialPortÀà¶Ô·Ö±ðÓÃ[BaudRate]¡¢[Parity]¡¢[DataBits]¡¢[StopBits]ÊôÐÔÉèÖÃͨѶ¸ñʽÖеIJ¨ÌØÂÊ¡¢Êý¾Ýλ¡¢Í£Ö¹Î»ºÍУÑé룬ÆäÖÐ[Parity]ºÍ[StopBits]·Ö±ðÊÇö¾ÙÀàÐÍParity¡¢StopBits£¬ParityÀàÐÍÖÐö¾ÙÁËOdd(Ææ)¡¢Even(ż)¡¢Mark¡¢None¡¢Space£¬Parityö¾ÙÁËNone¡¢One¡¢OnePointFive¡¢Two¡£

SerialPortÀàÌṩÁËÆß¸öÖØÔØµÄ¹¹Ô캯Êý£¬¼È¿ÉÒÔ¶ÔÒѾ­ÊµÀý»¯µÄSerialPort¶ÔÏóÉèÖÃÉÏÊöÏà¹ØÊôÐÔµÄÖµ£¬Ò²¿ÉÒÔʹÓÃÖ¸¶¨µÄ¶Ë¿ÚÃû³Æ¡¢²¨ÌØÂÊºÍÆæÅ¼Ð£ÑéλÊý¾ÝλºÍֹͣλֱ½Ó³õʼ»¯ SerialPort ÀàµÄÐÂʵÀý¡£ 3£®´®¿ÚµÄ´ò¿ªºÍ¹Ø±Õ

SerialPortÀàûÓвÉÓÃMSComm.PortOpen=True/FalseÉèÖÃÊôÐÔÖµ´ò¿ª¹Ø±Õ´®¿Ú£¬ÏàÓ¦µÄÊǵ÷ÓÃÀàµÄOpen()ºÍClose()·½·¨¡£

4. Êý¾ÝµÄ·¢ËͺͶÁÈ¡

SerialÀàµ÷ÓÃÖØÔØµÄWriteºÍWriteLine·½·¨·¢ËÍÊý¾Ý£¬ÆäÖÐ

WriteLine¿É·¢ËÍ×Ö·û´®²¢ÔÚ×Ö·û´®Ä©Î²¼ÓÈë»»Ðзû£¬¶ÁÈ¡´®¿Ú»º³åÇøµÄ·½·¨ÓÐÐí¶à£¬ÆäÖгýÁËReadExistingºÍReadTo,ÆäÓàµÄ·½·¨¶¼ÊÇͬ²½µ÷Óã¬Ï̱߳»×èÈûÖ±µ½»º³åÇøÓÐÏàÓ¦µÄÊý¾Ý»ò´óÓÚReadTimeOutÊôÐÔÉ趨µÄʱ¼äÖµºó£¬Òý·¢ReadExistingÒì³£¡£

5.DataReceivedʼþ

¸ÃʼþÀàËÆÓÚMSComm¿Ø¼þÖеÄOnCommʼþ£¬DataReceivedʼþÔÚ½ÓÊÕµ½ÁË[ReceivedBytesThreshold]ÉèÖõÄ×Ö·û¸öÊý»ò½ÓÊÕµ½ÁËÎļþ½áÊø×Ö·û²¢½«Æä·ÅÈëÁËÊäÈ뻺³åÇøÊ±±»´¥·¢¡£ÆäÖÐ[ReceivedBytesThreshold]Ï൱ÓÚ

MSComm¿Ø¼þµÄ[Rthreshold]ÊôÐÔ£¬¸ÃʼþµÄÓ÷¨ÓëMsComm¿Ø¼þµÄOnCommʼþÔÚCommEventΪcomEvSendºÍcomEvEofʱÊÇÒ»Öµġ£

Èý£®SerialPortµÄʹÓÃ

¶ÔÓÚÊìϤMSComm¿Ø¼þµÄ³ÌÐòÉè¼ÆÕߣ¬SerialPortÀàÊÇÏ൱ÈÝÒ×ÉÏÊֵġ£ÔÚ½øÐд®¿ÚͨѶʱ£¬Ò»°ãµÄÁ÷³ÌÊÇÉèÖÃͨѶ¶Ë¿ÚºÅ¼°²¨ÌØÂÊ¡¢Êý¾Ýλ¡¢Í£Ö¹Î»ºÍУÑé룬ÔÙ´ò¿ª¶Ë¿ÚÁ¬½Ó£¬·¢ËÍÊý¾Ý£¬½ÓÊÕÊý¾Ý£¬×îºó¹Ø±Õ¶Ë¿ÚÁ¬½ÓÕâÑù¼¸¸ö²½Öè¡£

Êý¾Ý½ÓÊÕµÄÉè¼Æ·½·¨ÔÚÕâÀï±È½ÏÖØÒª£¬²ÉÓÃÂÖѯµÄ·½·¨±È½ÏÀË·Ñʱ¼ä£¬ÔÚVisual BasicÖеÄÑÓʱ·½·¨ÖÐÒ»°ã»áµ÷ÓÃAPI²¢ÓÃDOEvents·½·¨À´´¦Àí£¬µ«³ÌÐò²»Ò׿ØÖÆ£¬½¨Òé²ÉÓÃDataReceivedʼþ´¥·¢µÄ·½·¨£¬ºÏÀíµÄÉèÖÃReceivedBytesThresholdµÄÖµ£¬Èô½ÓÊÕµÄÊǶ¨³¤µÄÊý¾Ý£¬Ôò½«

ReceivedBytesThresholdÉèΪ½ÓÊÕÊý¾ÝµÄ³¤¶È£¬Èô½ÓÊÕÊý¾ÝµÄ½áβÊǹ̶¨µÄ×Ö·û»ò×Ö·û´®Ôò¿É²ÉÓÃReadToµÄ·½·¨»òÔÚDataReceivedʼþÖÐÅжϽÓÊÕµÄ×Ö·ûÊÇ·ñÂú×ãÌõ¼þ¡£

SerialPortÀà¶ÁÈ¡Êý¾ÝµÄÐí¶à·½·¨ÊÇͬ²½×èÈûµ÷Ó㬾¡Á¿±ÜÃâÔÚÖ÷Ïß³ÌÖе÷Ó㬿ÉÒÔʹÓÃÒì²½´¦Àí»òÏ̼߳䴦Àíµ÷ÓÃÕâЩ¶ÁÈ¡Êý¾ÝµÄ·½·¨¡£ ÓÉÓÚDataReceivedʼþÔÚ¸¨Ï̱߳»Òý·¢£¬µ±ÊÕµ½ÍêÕûµÄÒ»ÌõÊý¾Ý£¬·µ»ØÖ÷Ï̴߳¦Àí»òÔÚ´°ÌåÉÏÏÔʾʱ£¬Çë×¢Òâ¿çÏ̵߳Ĵ¦Àí£¬C#¿É²ÉÓÿؼþÒ첽ίÍеķ½·¨Control.BeginInvoke¼°Í¬²½Î¯Íеķ½·¨Invoke¡£

ËÄ£®½áÊøÓï

ÔÚ.NETƽ̨ÏÂÊìÁ·Ê¹ÓÃSerialPort À࣬¿ÉÒԺܺõؿª·¢³ö´®¿ÚͨѶÀà³ÌÐò£¬¶ÔÓÚ¹ýȥʹÓÃMSComm¿Ø¼þÉè¼ÆÁËһЩͨѶ³ÌÐò£¬Ò²¿ÉÒÔ½«MSComm¿Ø¼þÌæ»»ÎªSerialPortÀ࣬µ±È»ÎªÁ˱ÜÃâ¶ÔÒÔǰµÄÏîÄ¿×ö´óµÄ¸Ä¶¯£¬¿ÉÒÔʹÓÃ

SerialPortÀàÉè¼ÆÒ»Ð©ÓëMSComm¿Ø¼þ¾ßÓÐÏàͬ½Ó¿ÚµÄÀ࣬ÔÚ½ñºó¹¤Òµ¿ØÖÆÖУ¬SerialPortÀཫ¹ã·ºµØÓ¦ÓÃÓÚ´®¿ÚͨѶ³ÌÐòµÄÉè¼ÆÖУ¬·¢»Ó×ÅÓëMSComm¿Ø¼þÒ»ÑùµÄ×÷ÓÃ

C#ÓëËÉÏÂFP¡Æ¿É±à³Ì¿ØÖÆÆ÷µÄͨÐÅ

×÷Õߣº¹ãÎ÷³ç×óÊн»¾¯Ö§¶Ó Åí³¯Íþ

ÕªÒª

±¾ÎĽéÉÜÁËͨ¹ýÒý½øActiveX¿Ø¼þMSComm£¬ÀûÓÃC#ÓïÑÔ±à³Ì,ʵÏÖÉÏλ»úÓëËÉÏÂFPG-C24R2 PLCµÄͨÐÅ£¬²¢¸ø³öÁ˹¤³ÌʵÀý¡£¸Ã·½·¨¼òµ¥¿É¿¿¡¢±ãÓÚÒÆÖ²¡¢ÊµÓÃÐÔÇ¿£¬ÔÚ¹¤Òµ¿ØÖÆÖÐÓÐ׏㷺µÄÓÃ;¡£ ¹Ø¼ü´Ê£ºC# ´®¿ÚͨЊʵʱ¼à¿Ø ActiveX ¿Ø¼þ

Abstract£ºA method of serial communication between Host-computer and NAIS FPG-C24R2 PLC via introducing ActiveX component MSComm by C# programming has introduced in this paper,and also presents practical

project.This method is simple¡¢reliable and easy to transplant,and its has high application value.

Key words: C# serial communication real-time monitoring ActiveX component Ò»¡¢Ç°ÑÔ

C#ÓïÑÔÊÇ.NET¼¼ÊõµÄºËÐÄ¿ª·¢ÓïÑÔ£¬ÊÇÒ»ÖÖ¼òµ¥¡¢ÏÖ´ú¡¢ÃæÏò¶ÔÏóºÍÀàÐͰ²È«µÄ±à³ÌÓïÑÔ£¬ËüʵÏÖÁË¿ìËÙÓ¦ÓóÌÐò¿ª·¢¡¢¿çƽ̨²¿Êð£¬Äܹ»·ÃÎÊÆ½Ì¨¹ÌÓеÄ×ÊÔ´£¬Ö§³ÖCOMºÍ.NET¼¼Êõ£¬¾ßÓÐC++ÓïÑÔµÄÇ¿´ó¹¦ÄÜ¡¢JavaÓïÑÔµÄ¿çÆ½Ì¨ÌØÐÔºÍDelphiÓïÑԵķ½±ã¿ì½ÝµÈÖÚ¶àµÄÓÅÐãÆ·ÖÊ¡£FP¡ÆÊÇÈÕ±¾ËÉϵ繤Öêʽ»áÉçÉú²úµÄСÐͿɱà³ÌÐò¿ØÖÆÆ÷£¬ËüÓÐÐí¶à¹æ¸ñ£¬¾ßÓÐÌå»ýС¡¢ÖØÁ¿Çá¡¢¹¦ÄÜÆëÈ«¡¢±à³Ì¼òµ¥¡¢¼Û¸ñ±ãÒ˵ÈÓŵ㣬ÔÚ¹¤Òµ¿ØÖÆÖÐÓ¦ÓÃÊ®·Ö¹ã·º¡£ ±¾ÎÄÔÚWindows xpÏÂÓÃVisual Studio .NET 2003±àÖÆÒ»¸ö¼òµ¥µÄͨÐųÌÐò£¬Ì½ÌÖʹÓÃMSComm¿Ø¼þ¶ÔFPG-C24R2 PLC½øÐд®ÐÐͨÐŵÄʵÏÖ·½·¨¡£ ¶þ¡¢ActiveX¿Ø¼þµÄÒýÈë

Äã±ØÐëÓÐMscomm.srg, Mscomm32.ocx,Mscomm32.depÎļþÔÚÄãµÄWindowsµÄSystemĿ¼Ï£¨×¢ÒâWinNTÏÂÊÇSystem32£©£¬¶øÇÒËü±ØÐëÕýÈ·µÄ×¢²á¡£Äã¿ÉÒÔ×°VB6.0À´»ñµÃ£¬°²×°VB.6.0ºó£¬MSComm¿Ø¼þ¾Í×Ô¶¯ÔÚÄãµÄ¼ÆËã»úÉÏ×¢²áÁË£¬Õâ±ÈÊÖ¹¤×¢²á¿Ø¼þʡʶàÁË£¬Visual.Studio.NET2003ÔÚÏîÄ¿¹¤³ÌÖУ¨Solution)²åÈëMSComm¿Ø¼þµÄ¾ßÌå²½Ö裺н¨³ÌÐòºó£¬µã»÷Tools(¹¤¾ß)-->Add/Remove Toolbox items(Ìí¼Ó/ÒÆ³ý¹¤¾ßÏäÏ¾Í´ò¿ªÁËCustomize Toolbox(×Ô¶¨Ò幤¾ßÏ䣩¶Ô»°¿ò,ÔÙÑ¡ÔñCOM Components(COM×é¼þ)Ï²¢ÔÚ³öÏֿؼþÖоͿÉÒÔÕÒµ½Microsoft Communications Control,version 6.0£¬Ñ¡ÉϸÃ

ÏÔÙµã»÷\£¬¾Í»áÔÚToolbox¿Ø¼þ¹¤¾ßÏäÖп´µ½MSComm¿Ø¼þµÄµç»°Í¼±êÁË£¬½«ËüÍϵ½´°Ì壨Form£©¾Í¿ÉÒÔÁË¡£ Èý¡¢Í¨ÐÅЭÒé

FP¡ÆÏµÁÐPLCͨÐÅϵͳµÄ»ù±¾Ð­ÒéÊÇËÉϵ繤µÄרÓÃͨÐÅЭÒé-MEWTOCOL£»PLCÓë¼ÆËã»úµÄͨÐÅЭÒéÊÇMEWTOCOL-COM¡£¸ÃЭÒé²ÉÓÃÒ첽ͨÐÅ·½Ê½£¬Æä²¨ÌØÂÊÓÐ300bps¡¢600bps¡¢1200bps¡¢2400bps¡¢4800bps¡¢9600bps¡¢19200bps¡¢38400bps¡¢57600bps¡¢115200bpsµÈ¶àÖÖ¿ÉÑ¡£¬ÇÒ±¨Îij¤¶È¿É±ä¿É¹Ì¶¨¡£¸Ã·½Ê½Í¨ÐÅЭÒéÈçÏ£º

ͼ1ºÍͼ2·Ö±ðΪÉÏλ»ú·¢Ë͵ÄÉÏλ»úÁ´½ÓÃüÁîÖ¡¶ÁDMÇøÊý¾ÝµÄÃüÁî¸ñʽºÍÓÉPLC·µ»ØµÄÓ¦´ðÖ¡¸ñʽ¡£µ±PLC½ÓÊÕµ½´ÓÉÏλ»ú·¢À´µÄASCIIÂëÃüÁîʱ×Ô¶¯·µ»ØASCIIÂëÓ¦´ð¡£

ÆäÖУ¬£¥ÎªÆðʼ·û£¬±ê¼Çÿһ֡±¨ÎĵĿªÊ¼£¬CRΪ½áÊø·û£¬±ê¼Çÿһ֡±¨ÎĵĽáÊø£¬BCCΪÁ½×Ö½ÚµÄ֡УÑéÂëFCS£¬ËüÊÇ´Ó¿ªÊ¼·û\µ½ÕýÎĽáÊøµÄËùÓÐ×Ö·ûµÄASCIIÂ밴λÒì»òµÄ½á¹û£¬HLΪPLCµÄÕ¾µØÖ·£¬ÎªÁ½Î»16½øÖÆÊý£¬Èç00Ôò±íʾµÚһ̨PLC¡£#¡¢$±ê×¢¸ÃÖ¡±¨ÎÄΪºÎÖÖÀàÐÍ£¬ÉÏλ»úµÄÃüÁîÖ¡Óɲ»¹Ì¶¨µÄ×Ö½ÚÊý×é³É£¬Õë¶Ô²»Í¬µÄʶ±ðÂëÓв»Í¬µÄÖ¡³¤¶È¡£µ«»ù±¾¸ñʽ´óÌåÒ»Ö¡£

ËÄ¡¢±à³ÌʵÏÖ

Æô¶¯Visual.Studio.NET2003£¬±ã¿É½øÈëVisual C#.NET´°¿Ú»·¾³£¬½¨Á¢WindowsÓ¦ÓóÌÐò£¬½¨Á¢ÏîÄ¿Ãû³Æ£¨complc£©£¬Éú³ÉÏîÄ¿´°Ì壨comForm£©¡£ÔÚ´°ÌåÉÏÌí¼ÓͨÐŰ´Å¥button1¡¢Í˳ö°´Å¥button2£¬²¢ÔÚ¹¤¾ßÏäWindows´°Ìå¿Ø¼þÀ¸Ñ¡ÖÐMicrosoft Communications Control,version 6.0¿Ø¼þ£¬Èçͼ3¡£

´úÂëÈçÏÂ:

using System;

using System.Text; using System.Drawing;

using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace complc { ///

/// Form1 µÄժҪ˵Ã÷¡£ ///

public class comForm : System.Windows.Forms.Form { private AxMSCommLib.AxMSComm axMSComm1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Label label1;

private System.Windows.Forms.Label label2;

///

/// ±ØÐèµÄÉè¼ÆÆ÷±äÁ¿¡£ /// private System.ComponentModel.Container components = null; public comForm() {

// Windows ´°ÌåÉè¼ÆÆ÷Ö§³ÖËù±ØÐèµÄ

InitializeComponent(); // TODO: ÔÚ InitializeComponent µ÷ÓúóÌí¼ÓÈκι¹Ô캯Êý´úÂë } ///

/// ÇåÀíËùÓÐÕýÔÚʹÓõÄ×ÊÔ´¡£ /// protected override void Dispose( bool disposing ) { if( disposing )

{ if (components != null) { components.Dispose(); } } base.Dispose( disposing ); }

/// Windows ´°ÌåÉè¼ÆÆ÷Éú³ÉµÄ´úÂë

///

/// Ó¦ÓóÌÐòµÄÖ÷Èë¿Úµã¡£ /// [STAThread] static void Main() { Application.Run(new comForm()); } private void button1_Click(object sender, System.EventArgs e)

´®¿Ú

{

string ms,rd = \int i;

if (!axMSComm1.PortOpen) axMSComm1.PortOpen = true; //´ò¿ªaxMSComm1.InputLen = 0; //Çå³ý½ÓÊÕ»º³åÇø axMSComm1.DTREnable = true; //ÖÃDTRÓÐЧ

axMSComm1.RTSEnable = true; //ÖÃRTSÓÐЧ

axMSComm1.InputMode =

MSCommLib.InputModeConstants.comInputModeText; //ÖÃΪ¶þ½øÖÆÊäÈ뷽ʽ axMSComm1.RThreshold = 1; //ÉèÖÃΪ½ÓÊÕ»º³åÇøÃ¿½ÓÊÕÒ»¸ö×Ö·û½«Òý·¢Ò»´ÎOnCommʼþ ms=textBox1.Text; // ÊäÈëÈ磺#RDD9001590016»ò#RDD0100601036 axMSComm1.Output = ms+tobcc(ms)+(char)13; // sleep(30); rd += axMSComm1.Input; textBox2.Text = rd; } private void comForm_Load(object sender, System.EventArgs e) { axMSComm1.CommPort = System.Convert.ToInt16(1); //ÉèΪcom1 axMSComm1.Settings = \ }

public string tobcc(string s) //֡УÑ麯ÊýFCS { int t = 0; char[] chars = s.ToCharArray(); for(int i = 1;i <= s.Length-1;i++) { t = t^=(char)chars[i]; } return t.ToString().Substring(1,2); }

private void button2_Click(object sender, System.EventArgs e) { Application.Exit(); } } }

Îå¡¢½áÂÛ

±¾ÎÄËùÓгÌÐò¾ùÔÚWindows XP, Visual.Studio.NET2003»·¾³Öе÷ÊÔͨ¹ý£¬

¸ÃͨÐÅ·½Ê½¼òµ¥£¬Í¨ÐÅÊ®·ÖÎȶ¨¿É¿¿£¬´Ó¶øÔÚ¹¤Òµ¿ØÖƵÄСÐÍ¼à¿ØÏµÍ³ÖÐÓÐ׏ãÀ«µÄÓ¦ÓÃǰ¾°¡£¶ÁÕß¿ÉÔÚ±¾ÎĵĻù´¡ÉÏ£¬²Î¿¼ËÉϹ«Ë¾µÄMEWTOCOL-COMЭÒ飬±ã¿ÉÇáËÉʵÏÖPCÓëËÉÏÂFP¡ÆÏµÁÐPLCµÄͨÐÅ£¬ÒÔÍê³ÉÉÏλ»ú¶ÔPLCµÄ¼àÊÓÓë¿ØÖÆ¡£