串口SerialPort编程(C#)

转:http://libinguest.blog.163.com/blog/static/4534208200811252208704/


 微软代码:取出本机的COM端口字符串

public static string[] GetPortNames()

{

    RegistryKey localMachine = null;

    RegistryKey key2 = null;

string[] textArray = null;

//这里有个断言,判断该注册表项是否存在

    new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM").Assert();

    try

    {

        localMachine = Registry.LocalMachine;

        key2 = localMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false);

        if (key2 != null)

        {

            string[] valueNames = key2.GetValueNames();

            textArray = new string[valueNames.Length];

            for (int i = 0; i < valueNames.Length; i++)

            {

                textArray[i] = (string) key2.GetValue(valueNames[i]);

            }

        }

    }

    finally

    {

        if (localMachine != null)

        {

            localMachine.Close();

        }

        if (key2 != null)

        {

            key2.Close();

        }

        CodeAccessPermission.RevertAssert();

    }

    if (textArray == null)

    {

        textArray = new string[0];

    }

    return textArray;

}

 

 

 

 

VS.NET2005中SerialPort控件操作详解(C#)

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;

        }

    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在虚拟机(VC)中使用串口Serial Port)下载可以通过SerialPort类实现。SerialPort类是C#编程语言中的一个类,专门用于操作计算机的串口设备。在使用SerialPort类进行串口下载之前,我们需要先引入System.IO.Ports命名空间,该命名空间中包含了与串口相关的类。 首先,我们需要创建一个SerialPort的实例对象,可以通过以下代码实现: SerialPort serialPort = new SerialPort(); 接着,我们需要设置串口的相关属性,例如波特率(BaudRate)、数据位(DataBits)、停止位(StopBits)、校验位(Parity)等。这些属性的值需要根据具体的串口设备配置进行设置。例如,波特率通常可以设置为9600,数据位为8位,停止位为1位,校验位为无校验。设置属性的代码示例如下: serialPort.BaudRate = 9600; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Parity = Parity.None; 接下来,我们需要打开串口。在下载之前,我们还需要设置好其他一些参数,例如读取和写入的超时时间(ReadTimeout和WriteTimeout)。最后,我们可以调用SerialPort类的Open方法打开串口,从而准备进行下载操作。 serialPort.ReadTimeout = 1000; // 读取超时时间设置为1秒 serialPort.WriteTimeout = 1000; // 写入超时时间设置为1秒 serialPort.Open(); 现在,串口已经打开并配置好了相关参数,我们可以对SerialPort对象进行读写操作。下载的具体实现方式需要根据具体需求和设备的通信协议来确定,可以使用SerialPort类的Read和Write方法进行数据的接收和发送。 最后,在下载完成后,我们需要关闭串口。可以通过调用SerialPort类的Close方法关闭串口serialPort.Close(); 综上所述,通过VC和SerialPort类可以实现串口下载操作。通过配置SerialPort类的相关属性和方法,可以实现串口设备的读写操作,完成下载任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值