关于VS.Net2005中串口操作说明(C#)(SerialPort组件)

关于VS.Net2005中串口操作说明(C#)(SerialPort组件)

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;
using  System.IO.Ports;


namespace  SerialPorts
{
    
public  partial  class  frm_Main : Form
    {
        
#region  Public Enumerations
        
public   enum  DataMode { Text, Hex }
        
public   enum  LogMsgType { Incoming, Outgoing, Normal, Warning, Error };
        
#endregion
        
private  Color[] LogMsgTypeColor  =  { Color.Orange, Color.Green, Color.Black, Color.Blue, Color.Red };


        
// 禁用和启用程序中各控件的状态
         private   void  EnableControls()
        {
            
//  基于串口的打开与否,设置控件状态
            gbPortSettings.Enabled  =   ! ComPort.IsOpen;
            btns.Enabled 
=  btnstop.Enabled  =  txtSendData.Enabled  =  btnSend.Enabled  =  ComPort.IsOpen;

            
if  (ComPort.IsOpen) btnOpenPort.Text  =   " 关闭串口 " ;
            
else  btnOpenPort.Text  =   " 打开串口 " ;
        }
        
// 初始化组件的数据,为串口提供相关参数
         private   void  InitializeControlValues()
        {
            cmbParity.Items.Clear(); cmbParity.Items.AddRange(Enum.GetNames(
typeof (Parity)));
            cmbStopBits.Items.Clear(); cmbStopBits.Items.AddRange(Enum.GetNames(
typeof (StopBits)));

            cmbPortName.Items.Clear();
            
foreach  ( string  s  in  SerialPort.GetPortNames())
                cmbPortName.Items.Add(s);

            cmbPortName.Text 
=  cmbPortName.Items[ 0 ].ToString();
            cmbParity.Text 
=  cmbParity.Items[ 0 ].ToString();
            cmbStopBits.Text 
=  cmbStopBits.Items[ 0 ].ToString();
            cmbDataBits.Text 
=  cmbDataBits.Items[ 0 ].ToString();
            cmbParity.Text 
=  cmbParity.Items[ 0 ].ToString();
            cmbBaudRate.Text 
=  cmbBaudRate.Items[ 0 ].ToString();

            EnableControls();
        }
        
// 十六进制转换字节数组
         private   byte [] HexStringToByteArray( string  s)
        {
            s 
=  s.Replace( "   " "" );
            
byte [] buffer  =   new   byte [s.Length  /   2 ];
            
for  ( int  i  =   0 ; i  <  s.Length; i  +=   2 )
                buffer[i 
/   2 =  ( byte )Convert.ToByte(s.Substring(i,  2 ),  16 );
            
return  buffer;
        }
        
// 字节数组转换十六进制
         private   string  ByteArrayToHexString( byte [] data)
        {
            StringBuilder sb 
=   new  StringBuilder(data.Length  *   3 );
            
foreach  ( byte  b  in  data)
                sb.Append(Convert.ToString(b, 
16 ).PadLeft( 2 ' 0 ' ).PadRight( 3 '   ' ));
            
return  sb.ToString().ToUpper();
        }
        
// 显示数据日志
         private   void  Log(LogMsgType msgtype,  string  msg)
        {
            rtfTerminal.Invoke(
new  EventHandler( delegate
            {
                rtfTerminal.SelectedText 
=   string .Empty;
                rtfTerminal.SelectionFont 
=   new  Font(rtfTerminal.SelectionFont, FontStyle.Bold);
                rtfTerminal.SelectionColor 
=  LogMsgTypeColor[( int )msgtype];
                rtfTerminal.AppendText(msg);
                rtfTerminal.ScrollToCaret();
            }));
        }
        
// 串口发送方式
         #region  Local Properties
        
private  DataMode CurrentDataMode
        {
            
get
            {
                
if  (rbHex.Checked)  return  DataMode.Hex;
                
else   return  DataMode.Text;
            }
            
set
            {
                
if  (value  ==  DataMode.Text) rbText.Checked  =   true ;
                
else  rbHex.Checked  =   true ;
            }
        }
        
#endregion
        
// 发送数据
         private   void  SendData()
        {
            
if  (CurrentDataMode  ==  DataMode.Text)
            {
                
//  发送用户的文本到串口
                ComPort.Write(txtSendData.Text);

                
//  将用户的文本显示到数据窗口
                Log(LogMsgType.Outgoing, txtSendData.Text  +   " /n " );
            }
            
else
            {
                
try
                {
                    
//  转换用户十六进制数据到字节数组
                     byte [] data  =  HexStringToByteArray(txtSendData.Text);

                    
//  发送数据到串口
                    ComPort.Write(data,  0 , data.Length);

                    
//  将用户十六进制数据到数据窗口
                    Log(LogMsgType.Outgoing, ByteArrayToHexString(data)  +   " /n " );
                }
                
catch  (FormatException)
                {
                    
//  转换错误
                    Log(LogMsgType.Error,  " 十六进制数据有误:  "   +  txtSendData.Text  +   " /n " );
                }
            }
            txtSendData.SelectAll();
        }


        
///   <summary>
        
///  -------------------------------------------------------------
        
///   </summary>
         public  frm_Main()
        {
            InitializeComponent();
        }

        
private   void  Form1_Load( object  sender, EventArgs e)
        {
            InitializeControlValues();
            ComPort.DataReceived 
+=   new  SerialDataReceivedEventHandler(port_DataReceived);
        }

        
// 打开串口
         private   void  btnOpenPort_Click( object  sender, EventArgs e)
        {
            
if  (ComPort.IsOpen) ComPort.Close();
            
else
            {
                
// 设置串口参数
                ComPort.BaudRate  =   int .Parse(cmbBaudRate.Text);
                ComPort.DataBits 
=   int .Parse(cmbDataBits.Text);
                ComPort.StopBits 
=  (StopBits)Enum.Parse( typeof (StopBits), cmbStopBits.Text);
                ComPort.Parity 
=  (Parity)Enum.Parse( typeof (Parity), cmbParity.Text);
                ComPort.PortName 
=  cmbPortName.Text;

                
//  打开串口
                ComPort.Open();
            }

            
//  改变组件状态
            EnableControls();

            
//  如果串口打开,将焦点放入txtSendData
             if  (ComPort.IsOpen) txtSendData.Focus();
        }

        
private   void  rbHex_CheckedChanged( object  sender, EventArgs e)
        {
            
if  (rbHex.Checked) CurrentDataMode  =  DataMode.Hex;
        }

        
private   void  rbText_CheckedChanged( object  sender, EventArgs e)
        {
            
if  (rbText.Checked) CurrentDataMode  =  DataMode.Text;
        }
        
// 接收数据
         private   void  port_DataReceived( object  sender, SerialDataReceivedEventArgs e)
        {
            

            
//  判断用户用的是字节模式还是字符模式
             if  (CurrentDataMode  ==  DataMode.Text)
            {
                
//  读取缓冲区的数据
                 string  data  =  ComPort.ReadExisting();

                
//  显示读取的数据到数据窗口
                Log(LogMsgType.Incoming, data  +   " /n " );
            }
            
else
            {
                
//  获取字节长度
                 int  bytes  =  ComPort.BytesToRead;

                
//  创建字节数组
                 byte [] buffer  =   new   byte [bytes];

                
//  读取缓冲区的数据到数组
                ComPort.Read(buffer,  0 , bytes);

                
//  显示读取的数据到数据窗口
                Log(LogMsgType.Incoming, ByteArrayToHexString(buffer)  +   " /n " );
            }
        }
        
// 发送数据按键
         private   void  btnSend_Click( object  sender, EventArgs e)
        {
            SendData();
        }

        
private   void  lnkAbout_LinkClicked( object  sender, LinkLabelLinkClickedEventArgs e)
        {
            (
new  frmAbout()).ShowDialog( this );
        }
        
// 时间组件控制发送数据
         private   void  timer1_Tick( object  sender, EventArgs e)
        {
            SendData();
        }
        
// 连续发送数据
         private   void  button1_Click( object  sender, EventArgs e)
        {
            delay.Enabled 
=   true ;
            btns.Enabled 
=   ! delay.Enabled;
            btnstop.Enabled 
=  delay.Enabled;
        }
        
// 停止连续发送数据
         private   void  button2_Click( object  sender, EventArgs e)
        {
            delay.Enabled 
=   false ;
            btns.Enabled 
=   ! delay.Enabled;
            btnstop.Enabled 
=  delay.Enabled;
        }
    }
}

 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1863506
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值