获取串口数据

1. .net获取,在后端获取后直接显示在页面中或写入数据库,如果需要写入数据库,只需将获取到的accept作为参数向后传递即可

        /// <summary>
        /// 获取本机串口列表
        /// </summary>
        /// <param name="isUseReg"></param>
        /// <returns></returns>
        private List<string> GetComlist(bool isUseReg)
        {
            List<string> list = new List<string>();
            try
            {
                if (isUseReg)
                {
                    RegistryKey RootKey = Registry.LocalMachine;
                    RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");

                    String[] ComNames = Comkey.GetValueNames();

                    foreach (String ComNamekey in ComNames)
                    {
                        string TemS = Comkey.GetValue(ComNamekey).ToString();
                        list.Add(TemS);
                    }
                }
                else
                {
                    foreach (string com in SerialPort.GetPortNames())  //自动获取串行口名称  
                        list.Add(com);
                }
            }
            catch
            {
                MessageBox.Show("串行端口检查异常!");
                // System.Environment.Exit(0); //彻底退出应用程序   
            }
            return list;
        }
        /// <summary>
        /// 判断是否存在当前串口
        /// </summary>
        string targetCOMPort = null;
        private void StartSerialPortMonitor()
        {
            List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表     
            if (comList.Count == 0)
            {
                MessageBox.Show("当前设备不存在串行端口!");
                // System.Environment.Exit(0); //彻底退出应用程序   
            }
            else
            {
                targetCOMPort = comList[0];
                //string targetCOMPort = "COM3";
                //判断串口列表中是否存在目标串行端口
                if (!comList.Contains(targetCOMPort))
                {
                    MessageBox.Show("当前设备不存在配置的串行端口!");
                    //System.Environment.Exit(0); //彻底退出应用程序   
                }
            }
        }

        /// <summary>
        /// 设置通讯串口
        /// </summary>
        SerialPort serialPort = new SerialPort();
        public void setcom()
        {
            try
            {
                StartSerialPortMonitor();
                serialPort = new SerialPort(targetCOMPort);
                serialPort.PortName = targetCOMPort; //通信端口
                serialPort.BaudRate = 115200; //串行波特率
                serialPort.DataBits = 8; //每个字节的标准数据位长度
                serialPort.StopBits = StopBits.One; //设置每个字节的标准停止位数
                serialPort.Parity = Parity.None; //设置奇偶校验检查协议
                                                 //下面这句是当信息中有汉字时,能正确传输,不然会出现问号。

                //对编码进行注册GB2312;
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");
                //串口控件成员变量,字面意思为接收字节阀值,
                //串口对象在收到这样长度的数据之后会触发事件处理函数
                //一般都设为1
                serialPort.ReceivedBytesThreshold = 1;
                serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)

                serialPort.Open(); //打开串口
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            } 

        }
        /// <summary> 
        /// 发送数据 
        /// </summary> 
        /// <param name="sendData"></param> 
/*        private void SendData(string sendData)
        {
            try
            {
                serialPort.Encoding = EncodingType;
                serialPort.Write(sendData);
            }
            catch (Exception e)
            {
                throw e;
            }
        }*/

        /// <summary>
        /// 通讯有数据进执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
        {
            getcom();

        }


        //通过串口读取数据,处理数据

        string accept = null;
        StringBuilder sup = new StringBuilder();
        int j;
        public void getcom()
        {
            try
            {
                //定义一个字段,来保存串口传来的信息。
                string str = "";
                int len = serialPort.BytesToRead;
                Byte[] readBuffer = new Byte[len];
                serialPort.Read(readBuffer, 0, len);
                str = Encoding.Default.GetString(readBuffer);

                for (j = 0; j < str.Length; j++)
                {
                    if (str[j] == '=')
                        break;
                }
                for (int i = j + 1; i < j + 5; i++)
                {
                    sup.Append(str[i]);
                }
                accept = sup.ToString();
                sup = null;
                str = "";
                serialPort.DiscardInBuffer();  //清空接收缓冲区     
                serialPort.Close();
            }
            catch (Exception ex)
            {
                serialPort.Close();
            }
        }
        /// <summary>
        /// 获取温度
        /// </summary>
        /// <returns></returns>  
        public List<TempInfo> GetTemp(int Id, string Type)
        {
            setcom();
            if (!serialPort.IsOpen)
            {
                serialPort.Open();
            }
            getcom();
            if (serialPort.IsOpen)
            {
                SerialPort serialPort = new SerialPort();
                serialPort.Close();
            }
            string result = accept;
            bool success = _TempRepository.GetTemp(Id, Type, accept);
            if(success == true)
            {
                return result;
            }
            else 
            { 
                return result;
            }

        }

2.winform串口助手

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Runtime.InteropServices;
using main;

namespace message
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(2000);//延时200ms等待接收完数据

        }

        #region 初始化窗体
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                string[] str = SerialPort.GetPortNames();   //获取连接到电脑的串口号并存进数组
                comboBox_PortNames.Items.Clear();           //清除串口号下拉框的内容
                comboBox_PortNames.Items.AddRange(str);     //将串口号添加到下拉框

                if (str.Length > 0)
                {
                    comboBox_PortNames.SelectedIndex = 0;   //设置ComboBox框的初始值
                    comboBox_BaudRate.SelectedIndex = 7;
                    comboBox_DataBit.SelectedIndex = 3;
                    comboBox_StopBit.SelectedIndex = 0;
                    comboBox_Parity.SelectedIndex = 2;
                }
                else
                {
                    MessageBox.Show("当前无串口连接!");
                }
            }
            catch
            {
                MessageBox.Show("无串口设备!\r\n请检查是否连接设备!\r\n请检查设备驱动!");
            }

        }
        #endregion

        /**************************************************************************/
        #region 接收串口数据
        /*
        开辟缓存区 根据具体协议内容获取一帧数据进行接收中断处理
         */
        //变量
        List<byte> sp_buffer = new List<byte>(64);    //串口缓存区
        int sp_buffer_max = 64;   //串口缓存区最大缓存字节数
        byte[] ruffer = new byte[9192]; //用来存放缓冲区的数据流

        private void SerialDataReceive(object sender, SerialDataReceivedEventArgs e)
        {
            if (serialPort1.IsOpen == false)
            {
                serialPort1.Close();
                return;
            }


            int Byte_len = serialPort1.BytesToRead; //读取缓存的数据长度
            byte[] Rc_byte = new byte[Byte_len];

            serialPort1.Read(Rc_byte, 0, Byte_len);   //将缓存数据存储进字节数组里面

            sp_buffer.AddRange(Rc_byte);    //存入缓存区
            if (sp_buffer.Count > sp_buffer_max)    //缓存超过字节数 先丢弃前面的字节  
                sp_buffer.RemoveRange(0, sp_buffer_max); //丢弃前面的字节0到sp_buffer_max



           // byte[] ruffer = new byte[9192]; //用来存放缓冲区的数据流

            //对数据流进行筛选,缓冲区每一组数据个数大于4则为我们想要的数据流
            if (sp_buffer.Count > 4)
            {
                sp_buffer.CopyTo(0, ruffer, 0, sp_buffer.Count);
                Task.Run(() => printf_data(ruffer, sp_buffer.Count, 1));  //打印数据流

            }
        }
        #endregion


        /**************************************************************************/

        string strplus = null;
        #region 打印数据流
        void printf_data(byte[] Frame, int Length, int T_R)   //打印串口数据
        {
            Int16 i_len;
            StringBuilder s = new StringBuilder();
            if (T_R == 0)
                s.Append("发送:" + "\r\n");
            else
                s.Append("接收:" + "\r\n");

            //清除无用多余的数据
            /*            int i = 0;
                        for (i = 0; i<Frame.Length;i++) {
                            if (Frame[i] == 0)
                                break;
                        };*/

            //byte[]转化为string
            string str = System.Text.Encoding.ASCII.GetString(Frame);

            short i = 0;
            for (i = 0; i < str.Length; i++)
            {
                if (str[i] == 'd')
                    break;
            }
            for (i_len = i; i_len < (i + 8); i_len++)       //打印字符串
            {
                //s.Append(str[i_len]);
                s.Append(str[i_len].ToString());
                s.Append(" ");
            }
            s.Append("[" + DateTime.Now.ToString("HH:mm:ss") + "]");
            s.Append("\r\n");

            string str_show = s.ToString();
            s = null;
            strplus = str_show;

            MethodInvoker mi = new MethodInvoker(() =>
            {
                if (richTextBox_Receive.Lines.Count() > 20)
                    richTextBox_Receive.Clear();
                richTextBox_Receive.AppendText(str_show);
            });
            BeginInvoke(mi);
            /*
            richTextBox_Receive.Focus(); //获取焦点
            richTextBox_Receive.Select(richTextBox_Receive.TextLength, 0);//光标
            richTextBox_Receive.ScrollToCaret(); //滚动条
            */
        }
        #endregion
        public void timer1_Tick(object sender, EventArgs e)
        {
            byte[] ruffer = new byte[9192];
        }
        private void richTextBox_Receive_TextChanged(object sender, EventArgs e)
        {

        }

        private void comboBox_PortNames_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void richTextBox_Send_TextChanged(object sender, EventArgs e)
        {

        }

        /**************************************************************************/
        #region 打开串口
        private void button_OpenOrClose_Click_1(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                if (comboBox_PortNames.SelectedItem == null)
                {
                    MessageBox.Show("请选择正确的串口", "提示");
                    return;
                }

                //设置串口参数
                serialPort1.PortName = comboBox_PortNames.Text.ToString();  //serialPort1是serialPort组件的Name 
                serialPort1.BaudRate = Convert.ToInt32(comboBox_BaudRate.SelectedItem.ToString());
                serialPort1.DataBits = Convert.ToInt32(comboBox_DataBit.SelectedItem.ToString());

                //设置停止位
                if (comboBox_StopBit.Text == "One")
                {
                    serialPort1.StopBits = StopBits.One;
                }
                else if (comboBox_StopBit.Text == "Two")
                {
                    serialPort1.StopBits = StopBits.Two;
                }
                else if (comboBox_StopBit.Text == "OnePointFive")
                {
                    serialPort1.StopBits = StopBits.OnePointFive;
                }
                else if (comboBox_StopBit.Text == "None")
                {
                    serialPort1.StopBits = StopBits.None;
                }

                //设置奇偶校验位
                if (comboBox_Parity.Text == "Odd")
                {
                    serialPort1.Parity = Parity.Odd;
                }
                else if (comboBox_Parity.Text == "Even")
                {
                    serialPort1.Parity = Parity.Even;
                }
                else if (comboBox_Parity.Text == "None")
                {
                    serialPort1.Parity = Parity.None;
                }

                try
                {
                    //禁止操作组件
                    comboBox_PortNames.Enabled = false;
                    comboBox_BaudRate.Enabled = false;
                    comboBox_DataBit.Enabled = false;
                    comboBox_StopBit.Enabled = false;
                    comboBox_Parity.Enabled = false;
                    button_Serach.Enabled = false;

                    serialPort1.Open(); //设置完参数后打开串口
                    button_OpenOrClose.Text = "关";  //更改Open按钮文本内容
                }
                catch
                {
                    MessageBox.Show("串口打开失败!");
                }


                serialPort1.DataReceived += new SerialDataReceivedEventHandler(SerialDataReceive);  //打开串口后绑定数据接收
            }
            else if (button_OpenOrClose.Text == "关")
            {
                try
                {
                    //允许操作组件
                    comboBox_PortNames.Enabled = true;
                    comboBox_BaudRate.Enabled = true;
                    comboBox_DataBit.Enabled = true;
                    comboBox_StopBit.Enabled = true;
                    comboBox_Parity.Enabled = true;
                    button_Serach.Enabled = true;


                    serialPort1.DiscardInBuffer();  //清除缓冲区的数据

                    serialPort1.Close();
                    button_OpenOrClose.Text = "开";   //更改Close按钮文本内容
                }
                catch
                {
                    MessageBox.Show("串口打开失败!");
                }
            }
        }
        #endregion
        /**************************************************************************/
        #region 清除输出框
        private void button_CLEAR_Click(object sender, EventArgs e)
        {
            richTextBox_Receive.Clear();     //清楚数据接收框数据
        }
        #endregion
        /**************************************************************************/
        #region 搜索串口(与初始化函数一样)
        private void button_Serach_Click_1(object sender, EventArgs e)
        {

            try
            {
                string[] str = SerialPort.GetPortNames();
                comboBox_PortNames.Items.Clear();
                comboBox_PortNames.Items.AddRange(str);

                if (str.Length > 0)
                {
                    comboBox_PortNames.SelectedIndex = 0;
                    comboBox_BaudRate.SelectedIndex = 7;
                    comboBox_DataBit.SelectedIndex = 3;
                    comboBox_StopBit.SelectedIndex = 0;
                    comboBox_Parity.SelectedIndex = 2;
                }
                else
                {
                    MessageBox.Show("当前无串口连接!");
                }
            }
            catch
            {
                MessageBox.Show("无串口设备!\r\n请检查是否连接设备!\r\n请检查设备驱动!");
            }
        }
        #endregion
        /**************************************************************************/
        #region 发送数据
        private void button_Send_Click_1(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                string[] sendbuff = richTextBox_Send.Text.Split();  //分割输入的字符串,判断有多少个字节需要发送
                int Buff_Len = sendbuff.Length;
                byte[] buff = new byte[Buff_Len];

                for (int i = 0; i < sendbuff.Length; i++)
                {
                    buff[i] = byte.Parse(sendbuff[i], System.Globalization.NumberStyles.HexNumber); //格式化字符串为十六进制数值
                }

                try
                {
                    serialPort1.Write(buff, 0, buff.Length);    //写数据
                    Task.Run(() => printf_data(buff, Buff_Len, 0));
                }
                catch
                {
                    MessageBox.Show("发送失败!!");
                }
            }
            else
            {
                MessageBox.Show("串口未打开!");
            }

        }

        private void updateSQL_Tick(object sender, EventArgs e)
        {
            string sqlupdate = null;
            StringBuilder sqlmess = new StringBuilder();
            for (int j = 13; j < 20; j++)
            {
                sqlmess.Append(strplus[j]);
            }
            sqlupdate = sqlmess.ToString();


            Dao dao = new Dao();
            string sql = $"update dbo.Temp set Temperature = '{sqlupdate}' where No = '1'";
            IDataReader dc = dao.read(sql);
            dc.Close();
            dao.DaoClose();
        }


        #endregion
        /**************************************************************************/
    }
}

效果图1(有连接)

 效果图2(无连接)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值