C#串口上位机源代码

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;

using System.IO.Ports;

 

 

namespace WindowsFormsApplication3

{

    publicpartial class Form1 : Form

    {

        publicForm1()

        {

           InitializeComponent();

           this.Init(); //打开系统执行初始化程序

        }

 

        ///<summary>

        /// 界面初始化

        ///</summary>

        publicvoid Init()

        {

           btnSend.Enabled = false;//失能发送按钮

           cbCn.Items.AddRange(SerialPort.GetPortNames());   //获取串口号

            if(cbCn.Items.Count > 0) cbCn.SelectedIndex = 0; //设置默认串口号

           cbCb.SelectedIndex = 5;//设置默认波特率115200

           OC.ForeColor = Color.Red;  //串口状态默认关闭颜色红色

        }

 

        ///<summary>

        /// 打开/关闭串口

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        privatevoid btnOpen_Click(object sender, EventArgs e)

        {

           if(cbCn.Items.Count <= 0)

            {

               OC.Text = "没发现串口";

               return;

            }

           if(!serialPort1.IsOpen)//如果串口没有打开

            {

               //设置串口参数

               serialPort1.PortName = cbCn.SelectedItem.ToString();//设置端口号

               serialPort1.BaudRate = Convert.ToInt32(cbCb.SelectedItem.ToString());//设置波特率

               try

                {

                   serialPort1.Open();//打开串口

                   btnSend.Enabled = true;//使能发送按钮

               }

               catch(Exception ex)

               {

                   MessageBox.Show(ex.Message, "错误");

                }

               btnOpen.Text = "关闭串口";

               OC.Text = "串口已打开";

               OC.ForeColor = Color.Green;

               lblms.Text = "Name:" + serialPort1.PortName + "   Baud:" + serialPort1.BaudRate;

            }

            else//如果串口已打开

            {

               try

               {

                   serialPort1.Close();//关闭串口

                   btnSend.Enabled = false;//失能发送按键

               }

               catch(Exception ex)

               {

                    MessageBox.Show(ex.Message, "错误");

               }

               btnOpen.Text = "打开串口";

               OC.Text = "串口已关闭";

               OC.ForeColor = Color.Red;

               lblms.Text = null;

            }

            //串口一旦打开不可再配置

           cbCb.Enabled = !serialPort1.IsOpen;

           cbCn.Enabled = !serialPort1.IsOpen;

        }

 

        ///<summary>

        /// 清空接收区

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        privatevoid btnClRev_Click(object sender, EventArgs e)

        {

           txtShow.Clear();

           txtData1.Clear();

           txtData2.Clear();

           txtData3.Clear();

           txtData4.Clear();

           txtData5.Clear();

           txtData6.Clear();

        }

        ///<summary>

        /// 清空发送区

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        privatevoid btnClSend_Click(object sender, EventArgs e)

        {

           txtSend.Clear();

        }

 

       /*******************数据发送部分**********************/

        ///<summary>

        ///发送数据

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        shortSdat1,Sdat2;

        privatevoid btnSend_Click(object sender, EventArgs e)

        {

          byte[] sendData = null;// 定义一个字节数组

          byte[] buffer1 = new byte[6];

          

           try

            {

                Sdat1 =(short)Convert.ToInt16(txtSdat1.Text);//读数据

               Sdat2 = (short)Convert.ToInt16(txtSdat2.Text);//读数据

            }

           catch (Exception ex)

            {

               MessageBox.Show(ex.Message, "错误");

            }

            //数据打包

           buffer1[0] = 0xFA;

           buffer1[1] = 0xFA;

           buffer1[2] = (byte)((Sdat1 >> 8) & 0xFF);

           buffer1[3] = (byte)(Sdat1 & 0xFF);

           buffer1[4] = (byte)((Sdat2 >> 8) & 0xFF);

            buffer1[5] = (byte)(Sdat2 & 0xFF);

 

           txtSend.Text = buffer1.Length.ToString();

 

           sendData = Encoding.ASCII.GetBytes(txtSend.Text.Trim());//ASCII发送//trim()数据两端不能是空格

 

            if(serialPort1.IsOpen)//如果串口打开

            {

               try

               {

                   /*******************串口调用接口******************/

                   //serialPort1.Write(sendData, 0, sendData.Length);//发送数据

                   serialPort1.Write(buffer1, 0, buffer1.Length);//发送数据

               }

               catch(Exception ex)

               {

                   MessageBox.Show(ex.Message, "错误");

               }

            }

            else

            {

               MessageBox.Show("串口未打开", "错误");

            }

        }

 

        ///<summary>

       ///Hex-->byte

        ///</summary>

        ///<param name="s"></param>

        ///<returns></returns>

        privatebyte[] HexStrTobyte(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;

        }

 

       /*******************数据接收部分**********************/

        ///<summary>

        /// 数据接收

        ///</summary>

        ///<param name="sender"></param>

        ///<param name="e"></param>

        privateList<byte> buffer = new List<byte>(4096);

        shortDat1, Dat2, Dat3,Dat4,Dat5,Dat6;

        privatevoid Form1_Load(object sender, EventArgs e)

        {

 

        }

 

        privatevoid DataRec(object sender, SerialDataReceivedEventArgs e)

        {

            intn = serialPort1.BytesToRead; //读数据位

           byte[] RecData = new byte[n];//新建字符串数组从串口读入字节

           /***************串口调用接口************************/

           serialPort1.Read(RecData, 0, n);//读取数据

 

           buffer.AddRange(RecData);

          

            //数据解包

            while(buffer.Count >= 14 &&buffer[0] == 0xAA && buffer[1] == 0xAA)

            {

               Dat1 = (short)((buffer[2] << 8) | (buffer[3]));

               Dat2 = (short)((buffer[4] << 8) | (buffer[5]));

               Dat3 = (short)((buffer[6] << 8) | (buffer[7]));

               Dat4 = (short)((buffer[8] << 8) | (buffer[9]));

               Dat5 = (short)((buffer[10] << 8) | (buffer[11]));

               Dat6 = (short)((buffer[12] << 8) | (buffer[13]));

               buffer.RemoveRange(0, 14);

            }

 

            this.Invoke((EventHandler)(delegate//invoke一个匿名委托跨线程访问ui

            {

               txtData1.Text = Dat1.ToString();

               txtData2.Text = Dat2.ToString();

               txtData3.Text = Dat3.ToString();

               txtData4.Text = Dat4.ToString();

               txtData5.Text = Dat5.ToString();

               txtData6.Text = Dat6.ToString();

 

               txtShow.AppendText(byteToHexStr(RecData).ToString().ToUpper());//接收到的数据以hex格式显示

               //txtShow.AppendText(Encoding.ASCII.GetString(RecData));//接收数据以ASCII格式显示

            }));

        }

 

        ///<summary>

        ///byte-->Hex

        ///</summary>

        ///<param name="bytes"></param>

        ///<returns></returns>

        publicstatic string byteToHexStr(byte[] bytes)

        {

           string returnStr = "";

            if(bytes != null)

            {

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

               {

                    returnStr +=bytes[i].ToString("X2");//X2 十六进制2

               }

            }

           return returnStr;

        }

    }

}

 


  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值