• C# 串口通讯Demo(VS2010)

    2020-07-12 15:16:28
    一个简单的C# 串口通讯Demo,可收发数据
  • 基于C#实现串口通信Demo 1.基本概念 2.前端winForm布局如下(仅仅为了实现功能,布局略丑) 3.代码实现如下 复制代码 1 namespace SerialPortTest 2 { 3 public partial class Form1 : Form 4 { 5 ...
    基于C#实现串口通信Demo
    1.基本概念
    
    
     
    
    2.前端winForm布局如下(仅仅为了实现功能,布局略丑)
    
    
     
    
    3.代码实现如下
    复制代码
      1 namespace SerialPortTest
      2 {
      3     public partial class Form1 : Form
      4     {
      5         SerialPort sp1 = new SerialPort();
      6         public Form1()
      7         {
      8             InitializeComponent();
      9         }
     10 
     11         private void Form1_Load(object sender, EventArgs e)
     12         {
              //分别对应前端的波特率、数字位、校验位、停止位
     13             cbBaudRate.SelectedIndex = 0;
     14             cbDataBits.SelectedIndex = 0;
     15             cbCheck.SelectedIndex = 0;
     16             cbStop.SelectedIndex = 0;
     17 
     18             string[] strCom = SerialPort.GetPortNames();
     19             if (strCom == null)
     20             {
     21                 MessageBox.Show("本机没有串口!", "Error");
     22                 return;
     23             }
     24             //GetPortNames()方法:获取当前计算机的串行端口名的数组
     25             foreach (string com in System.IO.Ports.SerialPort.GetPortNames())
     26             {
     27                 cbCom.Items.Add(com);
     28             }
     29 
     30             cbCom.SelectedIndex = 0;
     31             sp1.BaudRate = 9600;
     32             Control.CheckForIllegalCrossThreadCalls = false;
     33             sp1.DataReceived += Sp1_DataReceived;
     34                          
     35             sp1.DtrEnable = true;//获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号。
     36             sp1.RtsEnable = true;//获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号
     37             //设置数据读取超时为1秒
     38             sp1.ReadTimeout = 1000;
     39 
     40             sp1.Close();
     41         }
     42 
     43         private void Sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
     44         {
     45             if (sp1.IsOpen)     //判断是否打开串口
     46             {
     47                 //输出当前时间
     48                 DateTime dt = DateTime.Now;
     49                 txtReceived.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
     50                 try
     51                 {
     52                     Byte[] receivedData = new Byte[sp1.BytesToRead];        //创建接收字节数组
     53                     sp1.Read(receivedData, 0, receivedData.Length);         //读取数据
     54                     AddContent(new UTF8Encoding().GetString(receivedData));//用万能的UTF8可以传输中文不会乱码
     55                 }
     56                 catch (System.Exception ex)
     57                 {
     58                     MessageBox.Show(ex.Message, "出错提示!!!!!");
     59                     txtSendStr.Text = "";
     60                 }
     61             }
     62             else
     63             {
     64                 MessageBox.Show("请打开某个串口", "错误提示");
     65             }
     66         }
     67 
     68         //将接受到的内容显示出来
     69         private void AddContent(string content)
     70         {
     71             this.BeginInvoke(new MethodInvoker(delegate
     72             {
     73                 txtReceived.AppendText(content);
     74                 txtReceived.AppendText("\r\n");
     75                 //记录收到的字符个数
     76                 lblRevCount.Text = (int.Parse(lblRevCount.Text) + content.Length).ToString();
     77             }));
     78         }
     79 
     80         private void btnOpen_Click(object sender, EventArgs e)
     81         {
     82             //serialPort1.IsOpen
     83             if (!sp1.IsOpen)
     84             {
     85                 try
     86                 {
     87                     //设置串口号
     88                     string serialName = cbCom.SelectedItem.ToString();
     89                     sp1.PortName = serialName;
     90 
     91                     //设置各“串口设置”
     92                     string strBaudRate = cbBaudRate.Text;
     93                     string strDateBits = cbDataBits.Text;
     94                     string strStopBits = cbStop.Text;
     95                     Int32 iBaudRate = Convert.ToInt32(strBaudRate);
     96                     Int32 iDateBits = Convert.ToInt32(strDateBits);
     97 
     98                     sp1.BaudRate = iBaudRate;       //波特率
     99                     sp1.DataBits = iDateBits;       //数据位
    100                     switch (cbStop.Text)            //停止位
    101                     {
    102                         case "1":
    103                             sp1.StopBits = StopBits.One;
    104                             break;
    105                         case "1.5":
    106                             sp1.StopBits = StopBits.OnePointFive;
    107                             break;
    108                         case "2":
    109                             sp1.StopBits = StopBits.Two;
    110                             break;
    111                         default:
    112                             MessageBox.Show("Error:参数不正确!", "Error");
    113                             break;
    114                     }
    115                     switch (cbCheck.Text)             //校验位
    116                     {
    117                         case "无":
    118                             sp1.Parity = Parity.None;
    119                             break;
    120                         case "奇校验":
    121                             sp1.Parity = Parity.Odd;
    122                             break;
    123                         case "偶校验":
    124                             sp1.Parity = Parity.Even;
    125                             break;
    126                         default:
    127                             MessageBox.Show("Error:参数不正确!", "Error");
    128                             break;
    129                     }
    130 
    131                     if (sp1.IsOpen == true)//如果打开状态,则先关闭一下
    132                     {
    133                         sp1.Close();
    134                     }
    135 
    136                     //设置必要控件不可用
    137                     cbCom.Enabled = false;
    138                     cbBaudRate.Enabled = false;
    139                     cbDataBits.Enabled = false;
    140                     cbStop.Enabled = false;
    141                     cbCheck.Enabled = false;
    142                     sp1.Open();     //打开串口
    143                     btnOpen.Text = "关闭串口";
    144                 }
    145                 catch (System.Exception ex)
    146                 {
    147                     MessageBox.Show("Error:" + ex.Message, "Error");
    148                     return;
    149                 }
    150             }
    151             else
    152             {
    153                 //恢复控件功能
    154                 //设置必要控件不可用
    155                 cbCom.Enabled = true;
    156                 cbBaudRate.Enabled = true;
    157                 cbDataBits.Enabled = true;
    158                 cbStop.Enabled = true;
    159                 cbCheck.Enabled = true;
    160                 sp1.Close();                    //关闭串口
    161                 btnOpen.Text = "打开串口";
    162             }
    163         }
    164 
    165         private void btnSend_Click(object sender, EventArgs e)
    166         {
    167             byte[] sendData = null;
    168             if (!sp1.IsOpen) //如果没打开
    169             {
    170                 MessageBox.Show("请先打开串口!", "Error");
    171                 return;
    172             }
    173             String strSend = txtSendStr.Text;
    174             try
    175             {
    176                 sendData = Encoding.UTF8.GetBytes(txtSendStr.Text.Trim());
    177                 //sp1.WriteLine(txtSendStr.Text);    //写入数据
    178                 sp1.Write(sendData, 0, sendData.Length);
    179             }
    180             catch (Exception ex)
    181             {
    182                 MessageBox.Show("Error:" + ex.Message, "Error");
    183             }
    184 
    185         }
    186 
    187     }
    188 }
    复制代码
     
    
    4.测试运行结果如下
      在自己同一台电脑上测试,需要先用Configure Virtual Serial Port Driver建立两个虚拟串口,如下
    
    
    
     
    
      串口运行结果如下:
    
    
    
     上述两窗体通信时要选择同一波特率,不然收发数据会失败
    
    关于C# serialport的一些说明:
    
    SerialPort() :如果未指定,则此构造函数使用默认属性值。 例如, DataBits 属性默认值为 8, Parity 属性默认为 None 枚举值,
    StopBits 属性默认值为 1,默认端口名为 COM1。
    
    public static string[] GetPortNames() :获取当前计算机的串行端口名的数组
    
    SerialPort.Read 方法 (Byte[], Int32, Int32) :从 SerialPort 输入缓冲区读取一些字节并将那些字节写入字节数组中指定的偏移量处
    
    SerialPort.ReadLine 方法 () :一直读取到输入缓冲区中的 NewLine 值
    
    SerialPort.Write 方法 (Byte[], Int32, Int32) : 使用缓冲区中的数据将指定数量的字节写入串行端口
    
    SerialPort.WriteLine 方法 (String) : 将指定的字符串和 NewLine 值写入输出缓冲区。
    
    
    

     

    展开全文
  • c#串口通信demo

    2020-06-22 08:53:16
    虚拟串口一发一收,完整demo 完整的c#代码,直接可以运行
  • visual studio 2012 c# wpf 开发串口收发数据demo,仅供学习测试使用,已测,可正常收发数据
  • C# SerialPort 串口读写

    2020-07-09 16:09:12
    实现串口事件DataReceived接收数据 后台开启一个监控线程来监控是否数据接收完成 定义3个事件,用来通知数据接收完成、数据发送完成、每次接收数据
  • c# 串口获取数据

    2019-03-06 17:47:12
    有很多场景应用到串口操作,比如:地磅、超市收银(串口扫码)、工业机械控制(和PLC的交互、和普通硬件的交互),今天分享一下基础版的串口操作。 using System; using System.Collections.Generic; using System...

     有很多场景应用到口操作,比如:地磅、超市收银(串口扫码)、工业机械控制(和PLC的交互、和普通硬件的交互),今天分享一下基础版的串口操作。

    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;
    using System.Threading; 
    using System.Drawing.Printing;
    using System.Drawing.Drawing2D; 
    
    namespace 串口操作demo2
    {
        public partial class Form1 : Form
        {
            private SerialPort ComDevice = new SerialPort();
            private delegate void Control_call_back();
            // public BarcodeLib.Barcode b1 = new BarcodeLib.Barcode(); //标签打印定义-此处无用
            //bool tempControlbool = true;//硬件相关定义-此处无用
            //bool tempControlRed = false;//硬件相关定义-此处无用
            //bool tempControlGreen = false;//硬件相关定义-此处无用
            bool StopGetWeight = false;
            /// <summary>
            /// 初始化操作
            /// </summary>
            public Form1()
            {
                InitializeComponent();
                drpComList.Items.AddRange(SerialPort.GetPortNames());
                if (drpComList.Items.Count > 0)
                {
                    drpComList.SelectedIndex = 0;
                    btnCom.Enabled = true;
                }
                drpBaudRate.SelectedIndex = 5;
                drpParity.SelectedIndex = 0;
                drpDataBits.SelectedIndex = 0;
                drpStopBits.SelectedIndex = 0;
                ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived1);
    
    
                // f.Show();
            }
    
            /// <summary>
            /// 输出数据-定义委托
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Com_DataReceived1(object sender, SerialDataReceivedEventArgs e)
            {
                if (!StopGetWeight)
                {
                    // ComDevice.ReadLine();
                    byte[] ReDatas = new byte[ComDevice.BytesToRead];
                    ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据
                    DataReceived1(richTextBox1, ReDatas);
                    Thread.Sleep(100);
                }
                else//停止
                {
                    if (ComDevice.IsOpen)
                        ComDevice.Close();
                }
            }
            string tempdata = "";
            string[] Data = new string[5];
            /// <summary>
            /// 数据解析处理
            /// 没有控件,数据传输不到前端
            /// 本文lock段代码完全可以不用,但是本人操作的数据要以回车作为判断标志输出,所以加此判断
            /// </summary>
            /// <param name="c">控件</param>
            /// <param name="b">数据</param>
            public void DataReceived1(Control c, byte[] b)
            {
                string data = Encoding.Default.GetString(b);
                lock (tempdata)
                {
                    if (data.IndexOf("\r") < 0)
                    {
                        tempdata = (tempdata + data).Trim();
                        MessageWrite.WriteMessage(data);
                        return;
                    }
                    else
                    {
                        data = tempdata.ToString() + data;
                        tempdata = "";
                    }
                }
                MessageWrite.WriteMessageData(data.Replace("\r", "").Replace("\n", "").Trim());
                c.Invoke(new MethodInvoker(delegate
                {
    
                    richTextBox1.AppendText(data);
                    richTextBox1.ScrollToCaret();
                    try
                    {
                        data = data.Split('\r')[0];
                    }
                    catch (Exception ex)
                    {
                        MessageWrite.WriteMessage(data + "\r" + ex.ToString());
                    }
    
                }));
            }
    
    
            /// <summary>
            /// 打开关闭操作
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnCom_Click(object sender, EventArgs e)
            {
                if (ComDevice.IsOpen == false)
                {
                    try
                    {
                        StopGetWeight = false;
                        ComDevice.PortName = drpComList.SelectedItem.ToString();
                        ComDevice.BaudRate = Convert.ToInt32(drpBaudRate.SelectedItem.ToString());
                        ComDevice.Parity = (Parity)Convert.ToInt32(drpParity.SelectedIndex.ToString());
                        ComDevice.DataBits = Convert.ToInt32(drpDataBits.SelectedItem.ToString());
                        ComDevice.StopBits = (StopBits)Convert.ToInt32(drpStopBits.SelectedItem.ToString());
    
                        ComDevice.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
    
                    //WriteControl(2, tempControlbool);
                    btnCom.Text = "关闭串口";
                    picComStatus.BackgroundImage = Properties.Resources.greenlight;
                }
                else
                {
                    try
                    {
                        ComDevice.Close();
                        StopGetWeight = true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    btnCom.Text = "打开串口";
                    picComStatus.BackgroundImage = Properties.Resources.redlight;
                }
    
                drpComList.Enabled = !ComDevice.IsOpen;
                drpBaudRate.Enabled = !ComDevice.IsOpen;
                drpParity.Enabled = !ComDevice.IsOpen;
                drpDataBits.Enabled = !ComDevice.IsOpen;
                drpStopBits.Enabled = !ComDevice.IsOpen;
            }
    
            ///// <summary>
            ///// 发送数据
            ///// </summary>
            ///// <param name="sender"></param>
            ///// <param name="data"></param>
    
            public delegate void DataReceive(object sender, byte[] b);
            public event DataReceive dr;
            /// <summary>
            /// 关闭串口
            /// </summary>
            public void ClearSelf()
            {
                if (ComDevice.IsOpen)
                {
                    ComDevice.Close();
                }
            }
    
            SerialPort myPort = new SerialPort();
            private void button1_Click(object sender, EventArgs e)
            {
                //myPort.Close();
                //SendData();
            }
    
            public static char[] hexDigits = {       
          '0',     '1',     '2',     '3',     '4',     '5',     '6',     '7',       
          '8',     '9',     'A',     'B',     'C',     'D',     'E',     'F'};
    
            public static string ToHexString(byte[] bytes)
            {
                char[] chars = new char[bytes.Length * 3];
                for (int i = 0; i < bytes.Length; i++)
                {
                    int b = bytes[i];
                    chars[i * 3] = hexDigits[b >> 4];
                    chars[i * 3 + 1] = hexDigits[b & 0xF];
                    chars[i * 3 + 2] = ' ';
                }
                return new string(chars);
            }
    
            ///<summary> 
            /// 从16进制转换成汉字 
            /// </summary> 
            /// <param name="hex"></param> 
            /// <param name="charset">编码,如"utf-8","gb2312"</param> 
            /// <returns></returns> 
            public static string UnHex(string hex, string charset)
            {
                if (hex == null)
                    throw new ArgumentNullException("hex");
                hex = hex.Replace(",", "");
                hex = hex.Replace("\n", "");
                hex = hex.Replace("\\", "");
                hex = hex.Replace(" ", "");
                if (hex.Length % 2 != 0)
                {
                    hex += "20";//空格 
                }
                // 需要将 hex 转换成 byte 数组。 
                byte[] bytes = new byte[hex.Length / 2];
                for (int i = 0; i < bytes.Length; i++)
                {
                    try
                    {
                        // 每两个字符是一个 byte。 
                        bytes[i] = byte.Parse(hex.Substring(i * 2, 2),
                        System.Globalization.NumberStyles.HexNumber);
                    }
                    catch
                    {
                        // Rethrow an exception with custom message. 
                        throw new ArgumentException("hex is not a valid hex number!", "hex");
                    }
                }
                System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset);
                return chs.GetString(bytes, 0, bytes.Length).Replace("\0", "");
            }
    
            /// <summary>
            /// 字符串转16进制字节数组
            /// </summary>
            /// <param name="hexString"></param>
            /// <returns></returns>
            private static byte[] strToToHexByte(string hexString)
            {
                hexString = hexString.Replace(" ", "");
                if ((hexString.Length % 2) != 0)
                    hexString += " ";
                byte[] returnBytes = new byte[hexString.Length / 2];
                for (int i = 0; i < returnBytes.Length; i++)
                    returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Trim(), 16);
                return returnBytes;
            }
    
    
            private void button2_Click(object sender, EventArgs e)
            {
                //GetWeight();
            }
            bool tempbool = false;
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
    
                if (ComDevice.IsOpen)
                    ComDevice.Close();
            }
    
            //-------------------------------------------------
          
        }
    }
    

     

     https://download.csdn.net/download/dapeng2513/11002816

    展开全文
  • C#:蓝牙串口数据和写数据 原文:C#:蓝牙串口数据和写数据 首次使用C#编写与COM口有关的程序,期间遇到了很多问题,写下自己的经验总结,如有错漏,欢迎批评指正! 1、新建一个串口类(nbsp;...
    原文:C#:蓝牙串口读数据和写数据

      首次使用C#编写与COM口有关的程序,期间遇到了很多问题,写下自己的经验总结,如有错漏,欢迎批评指正!

    1、新建一个串口类(nbsp;SerialPort类)

    1 //Create a serial port for bluetooth
    2 SerialPort BluetoothConnection = new SerialPort();

    2、串口端口号搜索:

    string[] Ports = SerialPort.GetPortNames();
    or (int i = 0; i lt; Ports.Length; i++)
    {
    nbsp;nbsp;nbsp; string name = Ports[i];
    nbsp;nbsp;nbsp; comboBox.Items.Add(name);//显示在消息框里面
    }

    3、读数据、显示数据:

    byte[] data = new byte[length];
                BluetoothConnection.Read(data,0,length);
                for (int i = 0; i lt; length; i++)
                {
                    BlueToothReceivedData += string.Format("data[{0}] = {1}\r\n", i, data[i]);//"+="表示接收数据事件发生时,触发"+="后面的语句
                }

    4、写数据:

    byte[] head = new byte[8] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };//随便写的一组数据,里面的数据无意义
    BluetoothConnection.Write(head, 0, head.Length);

    5、常用的端口设置和方法:

    BluetoothConnection.Open();//打开蓝牙串口
    BluetoothConnection.ReadTimeout=10000//设置或获取数据超时之前的毫秒数
    BluetoothConnection.DataReceived;//蓝牙串口接收了数据
    BluetoothConnection.BaudRate;//设置串口的波特率
    BluetoothConnection.BytesToRead;//蓝牙所收到的缓冲区里数据的数据长度
    BluetoothConnection.ReadByte();//从串口输入缓冲区里读一个字节
    BluetoothConnection.Close();//关闭蓝牙串口

    串口最基本的功能就是实现通信,简单来说就是读和写,就像大家熟知的那样,把大象装进冰箱只需要三步:打开蓝牙串口,操作和处理数据,关闭蓝牙串口。

    建议在手机上下载一个蓝牙助手,可以清楚具体地看到数据收发的结果。

    另外,如果要设置蓝牙模块的波特率、密码等,需要在电脑上下载串口软件。

    posted on 2019-07-20 08:47 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/11216549.html

    展开全文
  • 这节主要介绍通过串口接收回来的数据,我是如何处理的。 首先跟负责硬件的同学约定好格式,首个字母作为标志,判断是哪一个数据,然后利用字符:和@约定为数据,然后裁剪出来,就获得了数据。 话不多说,上代码...

    这节主要介绍通过串口接收回来的数据,我是如何处理的。

    首先跟负责硬件的同学约定好格式,首个字母作为标志,判断是哪一个数据,然后利用字符:和@约定为数据,然后裁剪出来,就获得了数据。

    话不多说,上代码( this.Invoke里面的更新ui代码(在串口那一节里面有说)):

                                this.Invoke(new System.Threading.ThreadStart(delegate ()
                                {
                                    //distances_label.Text = indata;
                                   String temp = "";
                                    int i = str.IndexOf(":");//找:的位置  
                                    int j = str.IndexOf("@");//找@的位置
                                    switch (str.Substring(0, 1))
                                    {
                                        case "U"://超声波  //Substring(int startIndex, int length)           
                                            temp = (str.Substring(i + 1)).Substring(0, j - i - 1);//找出:和@之间的字符串
                                            /*if (int.Parse(temp) == -1)
                                            {
                                                distances_label.Text = "0cm";
                                            }*/
                                            //else{}
                                             distances_label.Text = temp + "cm"; 
                                            break;
                                        case "P"://光敏
                                            temp = (str.Substring(i + 1)).Substring(0, j - i - 1);//找出:和@之间的字符串
                                            R_label.Text = temp + "Ω";
                                            break;
                                        case "S"://红外
                                            temp = (str.Substring(i + 1)).Substring(0, j - i - 1);
                                            if (temp =="1")
                                            {
                                                HW_Label.Text = "有人";
                                            }
                                            else
                                            {
                                                HW_Label.Text = "没有人";
                                            }
                                            break;
                                        case "H"://H48.0@T28.0&  温湿度
                                            int H_F = str.IndexOf("H");//找H的位置
    
                                            int H_L = str.IndexOf("@");//找@的位置
    
                                            string H_temp = (str.Substring(H_F + 1)).Substring(0, H_L - H_F - 1);
                                            Hum_label.Text = H_temp + "%";
                                            int T_F= str.IndexOf("T");
                                            int T_L = str.IndexOf("&");//找&的位置
                                            string T_temp = (str.Substring(T_F + 1)).Substring(0, T_L - T_F - 1);
                                            Tep_label.Text = T_temp + "°C";
                                            UpdateQueueValue(T_temp, H_temp);
                                            break;
                                    }
                                }));

    通过str.IndexOf返回的位置,把数据取出来,再进行text的赋值。因为温湿度是一起传上来的,所以用不同的字符进行隔开,我定义的数据形式是H48.0@T28.0&,所以截取H@之间和T&之间的数据,其他同理。

    这里是更新图表里面的数据。 (如果之前用随机数测试的话,记得把定时器里面更新数据函数去掉,在这里进行数值更新)

    UpdateQueueValue(T_temp, H_temp);

    下面就是把数据的输出成txt文本和保存截图

    先看一下输出效果:(我选择全部输出,前面提到设置了三种)

    保存了在E盘的根目录下: 

     

    其实是把数据综合起来,然后在进行写入文件。 

    定义一个String

    String output = "";

    输出按钮的代码,判断是输出哪一个调用对应的函数再写入文件:(012就是对应我的选项)

     private void btn_Writefile_Click(object sender, EventArgs e)
            {
                switch (put_comboBox.SelectedIndex)
                {
                    case 0:
                        output_TH_processing(); break;
                    case 1:
                        output_HW_processing(); break;
                    case 2:
                        output_TH_HW_processing(); break;
                }
                try
                {
                    if (!File.Exists(@"E:\监测数据.txt"))
                    {
                        FileStream fs = new FileStream(@"E:\监测数据.txt", FileMode.Create, FileAccess.Write);
                        StreamWriter sw = new StreamWriter(fs);
                        long fl = fs.Length;
                        fs.Seek(fl, SeekOrigin.End);
                        sw.WriteLine(output);//开始写入值
                        sw.Close();
                        fs.Close();
                        MessageBox.Show("输出成功!请在E盘根目录下查看!");
                    }
                    else
                    {
                        FileStream fs = new FileStream(@"E:\监测数据.txt", FileMode.Open, FileAccess.Write);
                        StreamWriter sw = new StreamWriter(fs);
                        long fl = fs.Length;
                        fs.Seek(fl, SeekOrigin.Begin);
                        sw.WriteLine(output + "\n\n");//开始写入值
                        sw.Close();
                        fs.Close();
                        MessageBox.Show("输出成功!请在E盘根目录下查看!");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("错误信息:" + ex.Message + "!");
                }
    
            }

    每个case的函数(不同小异,格式不一样,大家可以按照需求修改): 

    private void output_TH_HW_processing()
            {
                try
                {
                    output = "";
                    double T_average = 0;
                    double H_average = 0;
                    int k = 1;
                    output = DateTime.Now.ToLocalTime().ToString() + "--最近六次的温湿度监测:\r\n";
                    double[] T_list = T_dataQueue.ToArray();
                    double[] H_list = H_dataQueue.ToArray();
                    foreach (double i in T_list)
                    {
                        T_average += i;
                        output += "第" + k + "次温度是:" + i + "°C" + "\r\n";
                        ++k;
                    }
                    output += "平均温度是:" + Math.Round(T_average / 6.0, 2) + "°C" + "\r\n" + "\r\n";
                    k = 1;
                    foreach (double i in H_list)
                    {
                        H_average += i;
                        output += "第" + k + "次湿度是:" + i + "%" + "\r\n";
                        ++k;
                    }
    
                    output += "平均湿度是:" + Math.Round(H_average / 6.0, 2) + "%" + "\r\n";
                    output += "\r\n红外监测数据:\r\n";
                    output += "红外测距:" + distances_label.Text.ToString() + ",红外感应:" + HW_Label.Text.ToString() + "。\r\n";
                }
                catch (Exception ex)
                {
                    MessageBox.Show("output_txt:" + ex.Message + "!");
                }
            }
      private void output_TH_processing()
            {
                try { 
                double T_average = 0;
                double H_average = 0;
                int k = 1;
                output = "";
                output=DateTime.Now.ToLocalTime().ToString()+ "--最近六次的温湿度监测:\r\n";
                double [] T_list= T_dataQueue.ToArray();
                double[] H_list = H_dataQueue.ToArray();
                foreach (double i in T_list)
                {
                    T_average += i;
                    output += "第" + k + "次温度是:" + i + "°C" + "\r\n";
                    ++k;
                }
                output += "平均温度是:" + Math.Round(T_average / 6.0, 2) + "°C" + "\r\n"+ "\r\n";
                k = 1;
                foreach (double i in H_list)
                {
                    H_average += i;
                    output += "第" + k + "次湿度是:" + i + "%" + "\r\n";
                    ++k;
                }
                output += "平均湿度是:" + Math.Round(H_average / 6.0, 2) + "%" + "\r\n";
                }
                catch (Exception ex)
                {
                    MessageBox.Show("output_txt:" + ex.Message + "!");
                }
            }
            private void output_HW_processing()
            {
                try
                {
                    output = "";
                    output = DateTime.Now.ToLocalTime().ToString() + "--感应监测数据:\r\n";
                    output += "超声波测距:"+ distances_label.Text.ToString()+",红外感应:"+ HW_Label.Text.ToString()+ "。\r\n";
                }
                catch (Exception ex)
                {
                    MessageBox.Show("output_txt:" + ex.Message + "!");
                }
            }
    

    下面这个是保存表格截图的代码:

    private void button2_Click(object sender, EventArgs e)
            {
                SaveFileDialog save_pic = new SaveFileDialog();
                save_pic.Filter = "Bitmap (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg|PNG (*.png)|*.png|SVG (*.svg)|*.svg";
                save_pic.FilterIndex = 2;
                save_pic.RestoreDirectory = true;
    
                // Set image file format
                if (save_pic.ShowDialog() == DialogResult.OK)
                {
                    ChartImageFormat format = ChartImageFormat.Bmp;
    
                    if (save_pic.FileName.EndsWith("bmp"))
                    {
                        format = ChartImageFormat.Bmp;
                    }
                    else if (save_pic.FileName.EndsWith("jpg"))
                    {
                        format = ChartImageFormat.Jpeg;
                    }
                   
                    else if (save_pic.FileName.EndsWith("png"))
                    {
                        format = ChartImageFormat.Png;
                    }
                    // Save image
                    chart1.SaveImage(save_pic.FileName, format);
                }
            }

     

    到这里整个上位机的功能构建就完成了。 

     

    展开全文
  • 一但说要监听一个串口数据,我们一般都会是会想到C#,但是就是不想用C#来开发。其实java也是可以的。 第一:需要下载一个额外的支持Java串口通信操作的jar包,Rxtx这个jar包(32位/64位均支持)。下载地址(里面...

    一但说要监听一个串口的数据,我们一般都会是会想到C#,但是就是不想用C#来开发。其实java也是可以的。

    第一:需要下载一个额外的支持Java串口通信操作的jar包,Rxtx这个jar包(32位/64位均支持)。下载地址(里面有windows(x64和x86)和linux(x64和x86)的驱动包):http://download.csdn.net/download/atgeretg/10122892
    官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载)
    使用方法如下:
    拷贝 RXTXcomm.jar 到 <JAVA_HOME>\jre\lib\ext目录中; 
    拷贝 rxtxSerial.dll 到 <JAVA_HOME>\jre\bin目录中; 
    拷贝 rxtxParallel.dll 到 <JAVA_HOME>\jre\bin目录中; 
    <JAVA_HOME>为jdk安装
    第二:
    下载解压,将RXTXcomm.jar包在 Java Build Path 下引入项目,就可以了,你的java项目就可以监听到电脑com数据了

     

    捕获

     

    第三:关于该jar包读取串口的使用,我写了一个小Demo,以下是小Demo的部分类。项目下载地址:http://download.csdn.net/download/atgeretg/10121971

    MainFrame该类提供界面化的串口通信的各简单操作,代码如下:

    public class MainFrame extends JFrame implements ActionListener {


    /**
    * 程序界面宽度
    */
    public static final int WIDTH = 500;


    /**
    * 程序界面高度
    */
    public static final int HEIGHT = 360;


    private JTextPane dataView = new JTextPane();
    private JScrollPane scrollDataView = new JScrollPane(dataView);


    // 串口设置面板
    private JPanel serialPortPanel = new JPanel();
    private JLabel serialPortLabel = new JLabel("串口");
    private JLabel baudrateLabel = new JLabel("波特率");
    private JComboBox commChoice = new JComboBox();
    private JComboBox baudrateChoice = new JComboBox();


    // 操作面板
    private JPanel operatePanel = new JPanel();
    private JTextArea dataInput = new JTextArea();
    private JButton serialPortOpenBtn = new JButton("打开串口");
    private JButton sendDataBtn = new JButton("发送数据");
    private JButton openCmdButton = new JButton("打开射频");
    private JButton closeCmdButton = new JButton("关闭射频");


    /**
    * 正常的风格
    */
    private final String STYLE_NORMAL = "normal";
    /**
    * 字体为红色
    */
    private final String STYLE_RED = "red";


    private List<String> commList = null;
    private SerialPort serialport;


    public MainFrame() {
    initView();
    initComponents();
    initData();
    }


    private void initView() {
    // 关闭程序
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    // 禁止窗口最大化
    setResizable(false);


    // 设置程序窗口居中显示
    Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
    setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, 499, 455);
    getContentPane().setLayout(null);


    setTitle("串口通讯");
    }


    private void initComponents() {
    // 数据显示
    dataView.setFocusable(false);
    scrollDataView.setBounds(10, 10, 475, 200);
    /* 数据区域的风格 */
    Style def = dataView.getStyledDocument().addStyle(null, null);
    StyleConstants.setFontFamily(def, "verdana");
    StyleConstants.setFontSize(def, 12);
    Style normal = dataView.addStyle(STYLE_NORMAL, def);
    Style s = dataView.addStyle(STYLE_RED, normal);
    StyleConstants.setForeground(s, Color.RED);
    dataView.setParagraphAttributes(normal, true);


    getContentPane().add(scrollDataView);


    // 串口设置
    serialPortPanel.setBorder(BorderFactory.createTitledBorder("串口设置"));
    serialPortPanel.setBounds(10, 220, 170, 188);
    serialPortPanel.setLayout(null);
    getContentPane().add(serialPortPanel);


    serialPortLabel.setForeground(Color.gray);
    serialPortLabel.setBounds(10, 25, 40, 20);
    serialPortPanel.add(serialPortLabel);


    commChoice.setFocusable(false);
    commChoice.setBounds(60, 25, 100, 20);
    serialPortPanel.add(commChoice);


    baudrateLabel.setForeground(Color.gray);
    baudrateLabel.setBounds(10, 60, 40, 20);
    serialPortPanel.add(baudrateLabel);


    baudrateChoice.setFocusable(false);
    baudrateChoice.setBounds(60, 60, 100, 20);
    serialPortPanel.add(baudrateChoice);


    // 操作
    operatePanel.setBorder(BorderFactory.createTitledBorder("操作"));
    operatePanel.setBounds(200, 220, 285, 188);
    operatePanel.setLayout(null);
    getContentPane().add(operatePanel);


    dataInput.setBounds(25, 25, 235, 63);
    operatePanel.add(dataInput);


    serialPortOpenBtn.setFocusable(false);
    serialPortOpenBtn.setBounds(45, 98, 90, 20);
    serialPortOpenBtn.addActionListener(this);
    operatePanel.add(serialPortOpenBtn);


    sendDataBtn.setFocusable(false);
    sendDataBtn.setBounds(155, 98, 90, 20);
    sendDataBtn.addActionListener(this);
    operatePanel.add(sendDataBtn);


    openCmdButton.setBounds(45, 128, 90, 20);
    openCmdButton.addActionListener(this);
    operatePanel.add(openCmdButton);


    closeCmdButton.setBounds(155, 128, 90, 20);
    closeCmdButton.addActionListener(this);
    operatePanel.add(closeCmdButton);


    JButton btnNewButton = new JButton("clear");
    btnNewButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    dataView.setText("");
    }
    });
    btnNewButton.setBounds(45, 158, 90, 20);
    operatePanel.add(btnNewButton);


    }


    @SuppressWarnings("unchecked")
    private void initData() {
    commList = SerialPortManager.findPort();
    // 检查是否有可用串口,有则加入选项中
    if (commList == null || commList.size() < 1) {
    DialogShowUtils.warningMessage("没有搜索到有效串口!");
    } else {
    for (String s : commList) {
    commChoice.addItem(s);
    }
    }


    baudrateChoice.addItem("9600");
    baudrateChoice.addItem("19200");
    baudrateChoice.addItem("38400");
    baudrateChoice.addItem("57600");
    baudrateChoice.addItem("115200");
    }




    /**
    * 打开串口

    */
    private void openSerialPort() {




    // 获取串口名称
    String commName = (String) commChoice.getSelectedItem();
    // 获取波特率
    int baudrate = 9600;
    String bps = (String) baudrateChoice.getSelectedItem();
    baudrate = Integer.parseInt(bps);


    // 检查串口名称是否获取正确
    if (commName == null || commName.equals("")) {
    DialogShowUtils.warningMessage("没有搜索到有效串口!");
    } else {
    try {
    serialport = SerialPortManager.openPort(commName, baudrate);
    if (serialport != null) {
    dataShow("串口已打开",STYLE_RED);
    serialPortOpenBtn.setText("关闭串口");
    }
    } catch (SerialPortParameterFailure e) {
    e.printStackTrace();
    } catch (NotASerialPort e) {
    e.printStackTrace();
    } catch (NoSuchPort e) {
    e.printStackTrace();
    } catch (PortInUse e) {
    e.printStackTrace();
    DialogShowUtils.warningMessage("串口已被占用!");
    }
    }


    try {
    SerialPortManager.addListener(serialport, new SerialListener());
    } catch (TooManyListeners e) {
    e.printStackTrace();
    }
    }

    /**
    * 关闭串口

    */
    private void closeSerialPort() {
    SerialPortManager.closePort(serialport);
    dataShow("已经关闭串口",STYLE_RED);
    serialPortOpenBtn.setText("打开串口");
    serialport = null;
    }

    /**
    * 打印数据到面板上

    */
    private void dataShow(String text,String style) {
    StringBuilder builderData = new StringBuilder();
    builderData.setLength(0);
    builderData.append(MyUtils.formatDateStr_ss()).append("\r\n").append(text).append("\r\n");
    try {
    Document document = dataView.getDocument();
    if(STYLE_RED.equals(style))
    dataView.getDocument().insertString(document.getLength(), builderData.toString(),
    dataView.getStyle(style));
    else
    dataView.getDocument().insertString(document.getLength(), builderData.toString(),
    dataView.getStyle(STYLE_NORMAL));
    dataView.setCaretPosition(document.getLength());
    } catch (BadLocationException e) {
    e.printStackTrace();
    }
    }




    /**
    * 发送指定数据

    */
    private void sendData(String data) {
    try {
    SerialPortManager.sendToPort(serialport, MyUtils.HexString2Bytes(data));
    dataShow(data,STYLE_RED);
    } catch (SendDataToSerialPortFailure e) {
    e.printStackTrace();
    } catch (SerialPortOutputStreamCloseFailure e) {
    e.printStackTrace();

    }


    private class SerialListener implements SerialPortEventListener {
    /**
    * 处理监控到的串口事件
    */
    public void serialEvent(SerialPortEvent serialPortEvent) {


    switch (serialPortEvent.getEventType()) {


    case SerialPortEvent.BI: // 10 通讯中断
    DialogShowUtils.errorMessage("与串口设备通讯中断");
    break;


    case SerialPortEvent.OE: // 7 溢位(溢出)错误


    case SerialPortEvent.FE: // 9 帧错误


    case SerialPortEvent.PE: // 8 奇偶校验错误


    case SerialPortEvent.CD: // 6 载波检测


    case SerialPortEvent.CTS: // 3 清除待发送数据


    case SerialPortEvent.DSR: // 4 待发送数据准备好了


    case SerialPortEvent.RI: // 5 振铃指示


    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空
    break;


    case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用数据
    byte[] data = null;
    try {
    if (serialport == null) {
    DialogShowUtils.errorMessage("串口对象为空!监听失败!");
    } else {
    // 读取串口数据
    data = SerialPortManager.readFromPort(serialport);
    dataShow(MyUtils.byteArray2HexString(data, data.length, true), STYLE_NORMAL);
    }
    } catch (Exception e) {
    DialogShowUtils.errorMessage(e.toString());
    // 发生读取错误时显示错误信息后退出系统
    System.exit(0);
    }
    break;
    }
    }
    }


    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new MainFrame().setVisible(true);
    }
    });
    }


    @Override
    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == serialPortOpenBtn) {
    if (serialport == null) {
    openSerialPort();
    } else {
    closeSerialPort();
    }
    } else if (e.getSource() == sendDataBtn) {
    String data = dataInput.getText().toString();
    if(MyUtils.isEmpty(data))
    return;
    sendData(data);
    } else if (e.getSource() == openCmdButton) {
    // 0x02 0x05 0x01 0xaa 0x03 --> "0x02 0x05 0x01 0x06 0x03"
    String data = "020501aa03";
    sendData(data);


    } else if (e.getSource() == closeCmdButton) {
    // 0x02 0x05 0x02 0xaa 0x03 --> "0x02 0x05 0x02 0x05 0x03"
    String data = "020502aa03";
    sendData(data);
    }
    }

    }

     

    这是一个串口管理类主要是读取电脑上的串口:

    public class SerialPortManager {


    /**
    * 查找所有可用端口

    * @return 可用端口名称列表
    */
    @SuppressWarnings("unchecked")
    public static final ArrayList<String> findPort() {
    // 获得当前所有可用串口
    Enumeration<CommPortIdentifier> portList = CommPortIdentifier
    .getPortIdentifiers();
    ArrayList<String> portNameList = new ArrayList<String>();
    // 将可用串口名添加到List并返回该List
    while (portList.hasMoreElements()) {
    String portName = portList.nextElement().getName();
    portNameList.add(portName);
    }
    return portNameList;
    }


    /**
    * 打开串口

    * @param portName
    *            端口名称
    * @param baudrate
    *            波特率
    * @return 串口对象
    * @throws SerialPortParameterFailure
    *             设置串口参数失败
    * @throws NotASerialPort
    *             端口指向设备不是串口类型
    * @throws NoSuchPort
    *             没有该端口对应的串口设备
    * @throws PortInUse
    *             端口已被占用
    */
    public static final SerialPort openPort(String portName, int baudrate)
    throws SerialPortParameterFailure, NotASerialPort, NoSuchPort,
    PortInUse {
    try {
    // 通过端口名识别端口
    CommPortIdentifier portIdentifier = CommPortIdentifier
    .getPortIdentifier(portName);
    // 打开端口,并给端口名字和一个timeout(打开操作的超时时间)
    CommPort commPort = portIdentifier.open(portName, 2000);
    // 判断是不是串口
    if (commPort instanceof SerialPort) {
    SerialPort serialPort = (SerialPort) commPort;
    try {
    // 设置一下串口的波特率等参数
    serialPort.setSerialPortParams(baudrate,
    SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE);
    } catch (UnsupportedCommOperationException e) {
    throw new SerialPortParameterFailure();
    }
    return serialPort;
    } else {
    // 不是串口
    throw new NotASerialPort();
    }
    } catch (NoSuchPortException e1) {
    throw new NoSuchPort();
    } catch (PortInUseException e2) {
    throw new PortInUse();
    }
    }


    /**
    * 关闭串口

    * @param serialport
    *            待关闭的串口对象
    */
    public static void closePort(SerialPort serialPort) {
    if (serialPort != null) {
    serialPort.close();
    serialPort = null;
    }
    }


    /**
    * 往串口发送数据

    * @param serialPort
    *            串口对象
    * @param order
    *            待发送数据
    * @throws SendDataToSerialPortFailure
    *             向串口发送数据失败
    * @throws SerialPortOutputStreamCloseFailure
    *             关闭串口对象的输出流出错
    */
    public static void sendToPort(SerialPort serialPort, byte[] order)
    throws SendDataToSerialPortFailure,
    SerialPortOutputStreamCloseFailure {
    OutputStream out = null;
    try {
    out = serialPort.getOutputStream();
    out.write(order);
    out.flush();
    } catch (IOException e) {
    throw new SendDataToSerialPortFailure();
    } finally {
    try {
    if (out != null) {
    out.close();
    out = null;
    }
    } catch (IOException e) {
    throw new SerialPortOutputStreamCloseFailure();
    }
    }
    }


    /** 
    * 从串口读取数据 
    *  
    * @param serialPort 
    *            当前已建立连接的SerialPort对象 
    * @return 读取到的数据 
    */  
    public static byte[] readFromPort(SerialPort serialPort) {  
        InputStream in = null;  
        byte[] bytes = {};  
        try {  
            in = serialPort.getInputStream();  
            // 缓冲区大小为一个字节  
            byte[] readBuffer = new byte[1];  
            int bytesNum = in.read(readBuffer);  
            while (bytesNum > 0) {  
                bytes = MyUtils.concat(bytes, readBuffer);  
                bytesNum = in.read(readBuffer);  
            }  
        } catch (IOException e) {  
            new ReadDataFromSerialPortFailure().printStackTrace();  
        } finally { 
            try {  
                if (in != null) {  
                    in.close();  
                    in = null;  
                }  
            } catch (IOException e) {  
                new SerialPortInputStreamCloseFailure().printStackTrace();  
            }  
        }  
        return bytes;  



    /**
    * 添加监听器

    * @param port
    *            串口对象
    * @param listener
    *            串口监听器
    * @throws TooManyListeners
    *             监听类对象过多
    */
    public static void addListener(SerialPort port,
    SerialPortEventListener listener) throws TooManyListeners {
    try {
    // 给串口添加监听器
    port.addEventListener(listener);
    // 设置当有数据到达时唤醒监听接收线程
    port.notifyOnDataAvailable(true);
    // 设置当通信中断时唤醒中断线程
    port.notifyOnBreakInterrupt(true);
    } catch (TooManyListenersException e) {
    throw new TooManyListeners();
    }
    }
    }

    运行效果:

    其项目结构:

    项目下载地址:http://download.csdn.net/download/atgeretg/10121971

    如果您在编写java过程中有出现问题,如果不嫌弃小编我学历浅薄,欢迎添加我的微信一起讨论,感谢您的支持!微信号:atgeretg
    大神您觉得还可以的话请您打赏,您的十分满意是小编的无限动力。
    

     

    展开全文
  • 使用JS获得串口数据

    2016-04-25 10:16:55
    JavaScript语言通常是一种网页编程语言,比较适合前台的一些应用设计。对于本地设备和数据的操作有比较大的限制。由于项目的需要,我需要获得本机的串口...第二种方法是使用C#语言的控件对串口进行控制,然后使用JS+AJ
  • C#实现串口监听

    2016-06-15 09:48:43
    Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据读取与写入有较大的不同。由于串口不知道数据何时到达,因此有两种方法可以实现串口数据读取。 1.用线程实时读...
  • 由于串口不知道数据何时到达,因此有两种方法可以实现串口数据读取。一、线程实时读串口;二、事件触发方式实现。 由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有...
  • 今天中午没睡午觉,头昏眼花的,实在写不了代码,把这几天写的Server层数据采集的程序整理了一下。 WatrLevelDataCollectServer.cs 1 using System; 2 using System.Collections.Generic; 3 using System....
  • 该文中使用的串口接收数据方法不会造成cpu占用过高等问题 源码地址:https://download.csdn.net/download/horseroll/10756130 demo效果图: 1.首先声明一个Serial变量 SerialPort serialPort1 = new ...
  • C# ISP 串口调试工具的开发(一)前言开发环境WinForm界面布局SerialPort 控件初始化串口参数窗体初始化连接串口进程记录发送参数读取参数关闭串口总结 前言 由于公司需要开发一个 ISP 串口调试工具,而我也具有一点...
  • C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据读取与写入有较大的不同。C#串口监听的实现由于串口不知道数据何时到达,因此有两种...
1 2 3 4 5 ... 19
收藏数 370
精华内容 148