±¾Àý³ÌÖ÷Òª½²½âʹÓÃ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;
///
// Windows ´°ÌåÉè¼ÆÆ÷Ö§³ÖËù±ØÐèµÄ
InitializeComponent(); // TODO: ÔÚ InitializeComponent µ÷ÓúóÌí¼ÓÈκι¹Ô캯Êý´úÂë } ///
{ if (components != null) { components.Dispose(); } } base.Dispose( disposing ); }
/// Windows ´°ÌåÉè¼ÆÆ÷Éú³ÉµÄ´úÂë
///
´®¿Ú
{
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µÄ¼àÊÓÓë¿ØÖÆ¡£