找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2758|回复: 0
打印 上一主题 下一主题
收起左侧

这是我做的一个关于dc_power的校准软件 附源码

[复制链接]
跳转到指定楼层
楼主
首选需要连接串口,之后就可以进行传输数据操作,
界面图形化,非常容易上手,源码都在里面了,有需要的话



可以学习一下源码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;

  10. using System.IO.Ports;
  11. using ZedGraph;
  12. using System.Threading;
  13. using System.Collections;

  14. namespace DC_POWER
  15. {
  16.     public partial class Mainform : Form
  17.     {
  18.         private const float VOLTAGE_MAX = 30.00f, CURRENT_MAX = 4.000f;
  19.                 public enum MODE
  20.                 {
  21.                         MODE_VOLTAGE = 0x00,
  22.                         MODE_CURRENT = 0x01,
  23.                 }
  24.                 private MODE currentMode = MODE.MODE_VOLTAGE;
  25.         //与下位机通讯相关
  26.         public enum COM_CMD
  27.         {
  28.             //M2S: master to slave cmd, S2M: slave to master
  29.             USART_M2S_Output  = 0x01,  //输出控制(默认关)
  30.             USART_M2S_Mode    = 0x02,  //输出模式切换(默认电压模式)
  31.             USART_M2S_SetVal  = 0x03,  //Master2Slave设置期望值:[1-4]:电压; [5-8]:电流
  32.             USART_M2S_Cal     = 0x04,  //进入校准模式(只在下位机开机前几秒内能够进入校准模式)
  33.             USART_M2S_StepAdd = 0x05,  //步进加
  34.             USART_M2S_StepSub = 0x06,  //步进减
  35.             USART_M2S_FAN     = 0x07,  //风扇控制:[1]0关;1开;2自动(默认)
  36.             USART_M2S_STATE   = 0x08,  //实时数据发送状态:[1]1发送数据 0停止发送
  37.             USART_M2S_GetVal  = 0x09,  //获取前一次的设定值
  38.             USART_S2M_PreVal  = 0x0A,  //Slave2Master返回前一次的设定值:[1-4]:电压值; [5-8]:电流值
  39.             USART_S2M_RealVal = 0x0B,  //Slave2Master返回的实际值:[1-4]:电压值; [5-8]:电流值
  40.             USART_S2M_RealTemp= 0x0C,  //Slave2Master返回温度值:[1-4]:当前温度值
  41.         }
  42.         private const byte USART_FRAMEHEAD = 0xAA, USART_FRAMETAIL = 0x55, USART_FRAMECTRL = 0xA5;

  43.         private long m_TotalRxLostPackages = 0; //记录总的丢包数
  44.         private long m_RxPackageDataCount = 0;  //记录接收到的一帧的字节数
  45.         private const int m_MaxPackageSize = 4096;   //一帧最大的字节数
  46.         private byte[] m_pRxBuf = new byte[m_MaxPackageSize]; //接收缓存

  47.         float voltageSet = 0.0f, currentSet = 0.0f, voltageGet = 0.0f, currentGet = 0.0f;

  48.         //绘图相关
  49.         public struct CurveStruct
  50.         {
  51.             public PointPairList pointList;//曲线数据
  52.             public Color         lineColor;//曲线颜色
  53.             public SymbolType    lineStyle;//线型
  54.             public string        curveName;//名称
  55.             public LineItem      curve;    //曲线
  56.             public float         scaleFactor;//比例系数
  57.             public byte          lineWidth; //线宽
  58.         }
  59.         private Hashtable curveHashTable = new Hashtable();//用来保存所有的曲线        
  60.         private GraphPane mGraphPane;
  61.         private long tickStart = 0;
  62.         double currentTime;
  63.         //double previousTime = 0;
  64.         CurveStruct mCurveStructVolSet = new CurveStruct();
  65.         CurveStruct mCurveStructVolGet = new CurveStruct();
  66.         CurveStruct mCurveStructCurSet = new CurveStruct();
  67.         CurveStruct mCurveStructCurGet = new CurveStruct();

  68.         //线程相关
  69.         private Queue<byte> receiveByteQueue = new Queue<byte>();//串口缓存队列
  70.         private Thread _dataParseThread = null;   //解析串口接收数据线程
  71.         private bool _runDataParseThread = false; //决定接收线程是否退出


  72.         public Mainform()
  73.         {
  74.             InitializeComponent();
  75.         }

  76.         private void Mainform_Load(object sender, EventArgs e)
  77.         {
  78.             //初始化串口列表,添加本地可用串口号            
  79.             if (SerialPort.GetPortNames().Length != 0)
  80.             {
  81.                 foreach (string vPortName in SerialPort.GetPortNames())
  82.                 {
  83.                     RibbonLabel item = new RibbonLabel();
  84.                     item.Text = vPortName;
  85.                     ribbonComboBoxCom1.DropDownItems.Add(item);
  86.                     ribbonComboBoxCom2.DropDownItems.Add(item);
  87.                 }
  88.                 ribbonComboBoxCom1.TextBoxText = SerialPort.GetPortNames()[0];
  89.                 ribbonComboBoxCom2.TextBoxText = SerialPort.GetPortNames()[0];
  90.             }
  91.             mGraphPane = zedGraphControl1.GraphPane;
  92.             mGraphPane.Title.Text = "DC_POWER";
  93.             //添加两个Y轴,分别显示电压、电流
  94.             mGraphPane.XAxis.Title.Text  = "time";
  95.             mGraphPane.YAxis.Title.Text  = "Voltage";
  96.             mGraphPane.Y2Axis.Title.Text = "Current";
  97.             mGraphPane.Y2Axis.IsVisible = true;
  98.             mGraphPane.YAxis.Scale.FontSpec.FontColor = Color.Red;
  99.             mGraphPane.YAxis.Title.FontSpec.FontColor = Color.Red;
  100.             mGraphPane.Y2Axis.Scale.FontSpec.FontColor = Color.Blue;
  101.             mGraphPane.Y2Axis.Title.FontSpec.FontColor = Color.Blue;


  102.             knob_Voltage.Enabled = false;
  103.             knob_Current.Enabled = false;
  104.             slideButtonMode.Enabled = false;
  105.             slideButtonOutput.Enabled = false;
  106.             glassButtonStepAdd.Enabled = false;
  107.             glassButtonCAL.Enabled = false;
  108.             glassButtonStepSub.Enabled = false;
  109.         }
  110.         private void Mainform_FormClosing(object sender, FormClosingEventArgs e)
  111.         {
  112.             if (serialPort1.IsOpen)
  113.             {
  114.                 ribbonButtonOpenCom1_Click(sender, e);
  115.             }
  116.             if (serialPort2.IsOpen)
  117.             {
  118.                 ribbonButtonOpenCom2_Click(sender, e);
  119.             }
  120.         }
  121.         
  122.         private void ResetGraphPane()
  123.         {            
  124.             mGraphPane.XAxis.Scale.Min = 0;      //X轴最小值0
  125.             mGraphPane.XAxis.Scale.Max = 30;     //X轴最大30
  126.             mGraphPane.XAxis.Scale.MinorStep = 1;//X轴小步长1,也就是小间隔
  127.             mGraphPane.XAxis.Scale.MajorStep = 5;//X轴大步长为5,也就是显示文字的大间隔
  128.             mGraphPane.YAxis.Scale.Min = 0;      //电压轴最小值0
  129.             mGraphPane.YAxis.Scale.Max = VOLTAGE_MAX;//电压最大值
  130.             mGraphPane.Y2Axis.Scale.Min = 0;      //电流轴最小值0
  131.             mGraphPane.Y2Axis.Scale.Max = CURRENT_MAX;//电流最大值
  132.             //清除原有曲线
  133.             if (mGraphPane.CurveList.Count != 0)
  134.             {
  135.                 mGraphPane.CurveList.Clear();
  136.                 mGraphPane.GraphObjList.Clear();
  137.                 curveHashTable.Clear();
  138.             }
  139.             //更新X和Y轴的范围
  140.             zedGraphControl1.AxisChange();
  141.             //更新图表
  142.             zedGraphControl1.Invalidate();

  143.             //添加四条新的曲线:电压设定曲线、电压实际曲线、电流设定曲线、实际电流曲线
  144.             mCurveStructVolSet.curveName = "SET_V";
  145.             mCurveStructVolSet.pointList = new PointPairList();
  146.             mCurveStructVolSet.lineColor = Color.Brown;
  147.             mCurveStructVolSet.lineStyle = SymbolType.None;
  148.             mCurveStructVolSet.lineWidth = 2;
  149.             mCurveStructVolSet.scaleFactor = 1;// 360.0f / 4000.0f;
  150.             mCurveStructVolSet.curve = mGraphPane.AddCurve(
  151.                 mCurveStructVolSet.curveName,
  152.                 mCurveStructVolSet.pointList,
  153.                 mCurveStructVolSet.lineColor,
  154.                 mCurveStructVolSet.lineStyle);
  155.             mCurveStructVolSet.curve.Line.Width = mCurveStructVolSet.lineWidth;
  156.             curveHashTable.Add("SET_V", mCurveStructVolSet);

  157.             mCurveStructVolGet.curveName = "GET_V";
  158.             mCurveStructVolGet.pointList = new PointPairList();
  159.             mCurveStructVolGet.lineColor = Color.Red;
  160.             mCurveStructVolGet.lineStyle = SymbolType.None;
  161.             mCurveStructVolGet.lineWidth = 2;
  162.             mCurveStructVolGet.scaleFactor = 1;// 360.0f / 4000.0f;
  163.             mCurveStructVolGet.curve = mGraphPane.AddCurve(
  164.                 mCurveStructVolGet.curveName,
  165.                 mCurveStructVolGet.pointList,
  166.                 mCurveStructVolGet.lineColor,
  167.                 mCurveStructVolGet.lineStyle);
  168.             mCurveStructVolGet.curve.Line.Width = mCurveStructVolGet.lineWidth;
  169.             curveHashTable.Add("GET_V", mCurveStructVolGet);

  170.             mCurveStructCurSet.curveName = "SET_I";
  171.             mCurveStructCurSet.pointList = new PointPairList();
  172.             mCurveStructCurSet.lineColor = Color.DarkBlue;
  173.             mCurveStructCurSet.lineStyle = SymbolType.None;
  174.             mCurveStructCurSet.lineWidth = 2;
  175.             mCurveStructCurSet.scaleFactor = 1;// 360.0f / 4000.0f;
  176.             mCurveStructCurSet.curve = mGraphPane.AddCurve(
  177.                 mCurveStructCurSet.curveName,
  178.                 mCurveStructCurSet.pointList,
  179.                 mCurveStructCurSet.lineColor,
  180.                 mCurveStructCurSet.lineStyle);
  181.             mCurveStructCurSet.curve.Line.Width = mCurveStructCurSet.lineWidth;
  182.             curveHashTable.Add("SET_I", mCurveStructCurSet);
  183.             mCurveStructCurSet.curve.IsY2Axis = true;

  184.             mCurveStructCurGet.curveName = "GET_I";
  185.             mCurveStructCurGet.pointList = new PointPairList();
  186.             mCurveStructCurGet.lineColor = Color.Blue;
  187.             mCurveStructCurGet.lineStyle = SymbolType.None;
  188.             mCurveStructCurGet.lineWidth = 2;
  189.             mCurveStructCurGet.scaleFactor = 1;// 360.0f / 4000.0f;
  190.             mCurveStructCurGet.curve = mGraphPane.AddCurve(
  191.                 mCurveStructCurGet.curveName,
  192.                 mCurveStructCurGet.pointList,
  193.                 mCurveStructCurGet.lineColor,
  194.                 mCurveStructCurGet.lineStyle);
  195.             mCurveStructCurGet.curve.Line.Width = mCurveStructCurGet.lineWidth;
  196.             curveHashTable.Add("GET_I", mCurveStructCurGet);
  197.             mCurveStructCurGet.curve.IsY2Axis = true;
  198.         }
  199.         private void PrepareReceiveData()
  200.         {
  201.             _dataParseThread = new Thread(new ThreadStart(DataParseThreadFunc));
  202.             _runDataParseThread = true;

  203.         }
  204.         private void StartReciveData()
  205.         {
  206.             PrepareReceiveData();
  207.             if (_dataParseThread != null)
  208.             {
  209.                 _dataParseThread.Start();
  210.             }
  211.         }
  212.         private void StopReceiveData()
  213.         {
  214.             _runDataParseThread = false;
  215.             if (_dataParseThread != null)
  216.             {
  217.                 _dataParseThread.Abort();
  218.                 _dataParseThread = null;
  219.             }
  220.         }
  221.                
  222.         private void knob_Voltage_ValueChanged(object sender, EventArgs e)
  223.         {
  224.             thermometerVoltage.Value = (float)knob_Voltage.Value / 10.0f;
  225.             lbDigitalMeter_Voltage_Set.Value = (float)knob_Voltage.Value / 10.0f;
  226.             float voltage = (float)lbDigitalMeter_Voltage_Set.Value;
  227.             float current = (float)lbDigitalMeter_Current_Set.Value;
  228.                         byte[] data = new byte[9];
  229.                         data[0] = (byte)COM_CMD.USART_M2S_SetVal;
  230.                         for(int iter = 0; iter < 4; iter++)
  231.                         {
  232.                                 data[1+iter] = BitConverter.GetBytes(voltage)[iter];
  233.                                 data[5+iter] = BitConverter.GetBytes(current)[iter];
  234.                         }
  235.             PackData2Frame(data);
  236.         }
  237.         private void knob_Current_ValueChanged(object sender, EventArgs e)
  238.         {
  239.             thermometerCurrent.Value = (float)knob_Current.Value / 100.0f;
  240.             lbDigitalMeter_Current_Set.Value = (float)knob_Current.Value / 100.0f;
  241.             float voltage = (float)lbDigitalMeter_Voltage_Set.Value;
  242.             float current = (float)lbDigitalMeter_Current_Set.Value;
  243.             byte[] data = new byte[9];
  244.             data[0] = (byte)COM_CMD.USART_M2S_SetVal;
  245.             for (int iter = 0; iter < 4; iter++)
  246.             {
  247.                 data[1 + iter] = BitConverter.GetBytes(voltage)[iter];
  248.                 data[5 + iter] = BitConverter.GetBytes(current)[iter];
  249.             }
  250.             PackData2Frame(data);
  251.         }        
  252.                 private void slideButtonOutput_Click(object sender, EventArgs e)
  253.         {
  254.             if (labelOutput.Text == "OFF")
  255.             {
  256.                 labelOutput.Text = "ON";
  257.                 PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_Output});//开输出
  258.                 Thread.Sleep(10);
  259.                 PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_STATE, 0x01 });//开始发送数据
  260.                 //开始接收数据
  261.                 tickStart = Environment.TickCount;
  262.                 StartReciveData();
  263.             }
  264.             else
  265.             {
  266.                 labelOutput.Text = "OFF";
  267.                 PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_Output });//关输出
  268.                 Thread.Sleep(10);
  269.                 PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_STATE, 0x00 });//停止发送数据
  270.                 //停止接收数据
  271.                 StopReceiveData();
  272.             }
  273.         }
  274.         private void slideButtonMode_Click(object sender, EventArgs e)
  275.         {
  276.                         if(currentMode == MODE.MODE_VOLTAGE)
  277.                         {
  278.                 labelMode.Text = "Mode: A";
  279.                                 currentMode = MODE.MODE_CURRENT;
  280.                                 PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_Mode, 0x01});//电流模式
  281.             }
  282.             else
  283.             {
  284.                 labelMode.Text = "Mode: V";
  285.                                 currentMode = MODE.MODE_VOLTAGE;
  286.                                 PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_Mode, 0x00});//电压模式
  287.                         }                                       
  288.         }

  289.         private void ribbonButtonOpenCom1_Click(object sender, EventArgs e)
  290.         {
  291.             try
  292.             {
  293.                 if (ribbonButtonOpenCom1.Text == "打开串口")
  294.                 {
  295.                     serialPort1.PortName = ribbonComboBoxCom1.TextBoxText;
  296.                     serialPort1.BaudRate = int.Parse(ribbonComboBoxBaud1.TextBoxText);
  297.                     serialPort1.StopBits = System.IO.Ports.StopBits.One;
  298.                     serialPort1.Parity = System.IO.Ports.Parity.None;
  299.                     serialPort1.DataBits = 8;

  300.                     serialPort1.Open();
  301.                     //成功打开后 设置按钮相应的状态
  302.                     ribbonButtonOpenCom1.Text = "关闭串口";
  303.                     ribbonButtonOpenCom1.Image = Image.FromFile(Application.StartupPath + "\\ICON\\shutdown.ico");

  304.                     ribbonComboBoxCom1.Enabled = false;
  305.                     ribbonComboBoxBaud1.Enabled = false;

  306.                     //复位各表盘的数值
  307.                     thermometerVoltage.Value = 0;
  308.                     thermometerCurrent.Value = 0;
  309.                     thermometerTemp.Value = 30;
  310.                     lbDigitalMeter_Voltage_Set.Value = 0;
  311.                     lbDigitalMeter_Current_Set.Value = 0;
  312.                     lbDigitalMeter_Voltage_Get.Value = 0;
  313.                     lbDigitalMeter_Current_Get.Value = 0;
  314.                     knob_Voltage.Value = 0;
  315.                     knob_Current.Value = 0;
  316.                     slideButtonMode.Checked = false;
  317.                     slideButtonOutput.Checked = false;
  318.                     //重新设置坐标,清空原有曲线后添加电压、电流设定曲线
  319.                     ResetGraphPane();

  320.                     knob_Voltage.Enabled = true;
  321.                     knob_Current.Enabled = true;
  322.                     slideButtonMode.Enabled = true;
  323.                     slideButtonOutput.Enabled = true;
  324.                     glassButtonStepAdd.Enabled = true;
  325.                     glassButtonCAL.Enabled = true;
  326.                     glassButtonStepSub.Enabled = true;

  327.                     //获取下位机前一次电压、电流的设定值
  328.                     byte[] data = new byte[] { (byte)COM_CMD.USART_M2S_GetVal };
  329.                     PackData2Frame(data);
  330.                 }
  331.                 else
  332.                 {
  333.                     //关闭下位机输出
  334.                     PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_STATE, 0x00 });//停止发送数据
  335.                     PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_Output, 0x00 });//关输出
  336.                     Thread.Sleep(200);

  337.                     serialPort1.Close();
  338.                     ribbonButtonOpenCom1.Text = "打开串口";
  339.                     ribbonButtonOpenCom1.Image = Image.FromFile(Application.StartupPath + "\\icon\\standby.ico");
  340.                     ribbonComboBoxCom1.Enabled = true;
  341.                     ribbonComboBoxBaud1.Enabled = true;

  342.                     //停止接收数据
  343.                     StopReceiveData();

  344.                     knob_Voltage.Enabled = false;
  345.                     knob_Current.Enabled = false;
  346.                     slideButtonMode.Enabled = false;
  347.                     slideButtonOutput.Enabled = false;
  348.                     glassButtonStepAdd.Enabled = false;
  349.                     glassButtonCAL.Enabled = false;
  350.                     glassButtonStepSub.Enabled = false;

  351.                 }
  352.             }
  353.             catch (Exception error)
  354.             {
  355.                 MessageBox.Show(error.ToString());
  356.             }

  357.         }

  358.         float voltage = 0, current = 0, temp = 0;
  359.         byte[] tmpArray = new byte[4];
  360.         private void DataParseThreadFunc()
  361.         {
  362.             while (_runDataParseThread)
  363.             {
  364.                 lock (this)
  365.                 {
  366.                     if (receiveByteQueue.Count > 0)
  367.                     {
  368.                         if (AnalyzePackage(receiveByteQueue.Dequeue()))
  369.                         {
  370.                             currentTime = (Environment.TickCount - tickStart) / 1000.0;// +previousTime;
  371.                            
  372.                             switch (m_pRxBuf[0])
  373.                             {
  374.                                 case (byte)COM_CMD.USART_S2M_PreVal://前一次设置的电压、电流
  375.                                     tmpArray[0] = m_pRxBuf[1];
  376.                                     tmpArray[1] = m_pRxBuf[2];
  377.                                     tmpArray[2] = m_pRxBuf[3];
  378.                                     tmpArray[3] = m_pRxBuf[4];
  379.                                     voltage = BitConverter.ToSingle(tmpArray, 0);
  380.                                     tmpArray[0] = m_pRxBuf[5];
  381.                                     tmpArray[1] = m_pRxBuf[6];
  382.                                     tmpArray[2] = m_pRxBuf[7];
  383.                                     tmpArray[3] = m_pRxBuf[8];
  384.                                     current = BitConverter.ToSingle(tmpArray, 0);
  385.                                     knob_Voltage.Value = (int)(voltage*10);
  386.                                     knob_Current.Value = (int)(current*100);
  387.                                     break;
  388.                                 case (byte)COM_CMD.USART_S2M_RealVal://实时电压、电流数据
  389.                                     tmpArray[0] = m_pRxBuf[1];
  390.                                     tmpArray[1] = m_pRxBuf[2];
  391.                                     tmpArray[2] = m_pRxBuf[3];
  392.                                     tmpArray[3] = m_pRxBuf[4];
  393.                                     voltage = BitConverter.ToSingle(tmpArray, 0);
  394.                                     tmpArray[0] = m_pRxBuf[5];
  395.                                     tmpArray[1] = m_pRxBuf[6];
  396.                                     tmpArray[2] = m_pRxBuf[7];
  397.                                     tmpArray[3] = m_pRxBuf[8];
  398.                                     current = BitConverter.ToSingle(tmpArray, 0);
  399.                                     
  400.                                     mCurveStructVolSet.pointList.Add(currentTime, (float)lbDigitalMeter_Voltage_Set.Value);
  401.                                     mCurveStructVolGet.pointList.Add(currentTime, voltage);
  402.                                     mCurveStructCurSet.pointList.Add(currentTime, (float)lbDigitalMeter_Current_Set.Value);
  403.                                     mCurveStructCurGet.pointList.Add(currentTime, current);
  404.                                     lbDigitalMeter_Voltage_Get.Value = (double)voltage;
  405.                                     lbDigitalMeter_Current_Get.Value = (double)current;
  406.                                     thermometerVoltage.Value = voltage;
  407.                                     thermometerCurrent.Value = current;
  408.                                     break;
  409.                                 case (byte)COM_CMD.USART_S2M_RealTemp://当前温度
  410.                                     tmpArray[0] = m_pRxBuf[1];
  411.                                     tmpArray[1] = m_pRxBuf[2];
  412.                                     tmpArray[2] = m_pRxBuf[3];
  413.                                     tmpArray[3] = m_pRxBuf[4];
  414.                                     temp = BitConverter.ToSingle(tmpArray, 0);
  415.                                     thermometerTemp.Value = temp;
  416.                                     if (temp <= 40.0)
  417.                                     {
  418.                                         thermometerTemp.BackColor = Color.Green;
  419.                                     }
  420.                                     else if (temp <= 50)
  421.                                     {
  422.                                         thermometerTemp.BackColor = Color.Brown;
  423.                                     }
  424.                                     else
  425.                                     {
  426.                                         thermometerTemp.BackColor = Color.Red;
  427.                                     }
  428.                                     break;
  429.                             }
  430.                            
  431.                             Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale;
  432.                             if (currentTime > xScale.Max - xScale.MajorStep)
  433.                             {
  434.                                 xScale.Max = currentTime + xScale.MajorStep;
  435.                                 xScale.Min = xScale.Max - 30.0;
  436.                             }

  437.                             //更新X和Y轴的范围
  438.                             zedGraphControl1.AxisChange();
  439.                             //更新图表
  440.                             zedGraphControl1.Invalidate();
  441.                         }
  442.                     }
  443.                 }
  444.             }
  445.         }

  446.                
  447.         private byte USART_LastByte = 0;
  448.         private bool USART_BeginFlag = false;
  449.         private bool USART_CtrlFlag = false;
  450.         private long USART_RevOffset = 0;
  451.         private byte CheckSum = 0;
  452.         private bool AnalyzePackage(byte data)
  453.         {
  454.             if (((data == USART_FRAMEHEAD) && (USART_LastByte == USART_FRAMEHEAD)) || (USART_RevOffset > m_MaxPackageSize))
  455.             {
  456.                 if (USART_RevOffset < 6 && USART_RevOffset > 0)
  457.                 {
  458.                     m_TotalRxLostPackages++;
  459.                 }
  460.                 //RESET
  461.                 USART_RevOffset = 0;
  462.                 USART_BeginFlag = true;
  463.                 USART_LastByte = data;
  464.                 return false;
  465.             }
  466.             if ((data == USART_FRAMETAIL) && (USART_LastByte == USART_FRAMETAIL) && USART_BeginFlag)
  467.             {
  468.                 USART_RevOffset--;//得到除去头尾和控制符的数据的个数
  469.                 m_RxPackageDataCount = USART_RevOffset - 1;
  470.                 CheckSum -= USART_FRAMETAIL;
  471.                 CheckSum -= m_pRxBuf[m_RxPackageDataCount];
  472.                 USART_LastByte = data;
  473.                 USART_BeginFlag = false;
  474.                 if (CheckSum == m_pRxBuf[m_RxPackageDataCount])
  475.                 {
  476.                     CheckSum = 0;
  477.                     return true;
  478.                 }
  479.                 m_TotalRxLostPackages++;

  480.                 CheckSum = 0;
  481.                 return false;
  482.             }
  483.             USART_LastByte = data;
  484.             if (USART_BeginFlag)
  485.             {
  486.                 if (USART_CtrlFlag)
  487.                 {
  488.                     m_pRxBuf[USART_RevOffset++] = data;
  489.                     CheckSum += data;
  490.                     USART_CtrlFlag = false;
  491.                     USART_LastByte = USART_FRAMECTRL;
  492.                 }
  493.                 else if (data == USART_FRAMECTRL)
  494.                 {
  495.                     USART_CtrlFlag = true;
  496.                 }
  497.                 else
  498.                 {
  499.                     m_pRxBuf[USART_RevOffset++] = data;
  500.                     CheckSum += data;
  501.                 }
  502.             }
  503.             return false;
  504.         }

  505.         private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  506.         {
  507.             Thread.Sleep(5);
  508.             try
  509.             {
  510.                 byte[] byteArray = new byte[serialPort1.ReadBufferSize];
  511.                 int len = serialPort1.Read(byteArray, 0, byteArray.Length);

  512.                 lock (this)
  513.                 {
  514.                     for (int i = 0; i < len; i++)
  515.                     {
  516.                         receiveByteQueue.Enqueue(byteArray[i]);
  517.                     }
  518.                 }
  519.             }
  520.             catch (Exception error)
  521.             {
  522.                 MessageBox.Show("serialPort1_DataReceived" + error.ToString());
  523.             }
  524.         }

  525.         private void PackData2Frame(params byte[] byteArray)
  526.         {
  527.             if (serialPort1.IsOpen)
  528.             {
  529.                 byte[] tmpByteArray = new byte[100];
  530.                 byte len = 0;
  531.                 tmpByteArray[0] = USART_FRAMEHEAD;
  532.                 tmpByteArray[1] = USART_FRAMEHEAD;
  533.                 CheckSum = 0;
  534.                 len = 2;
  535.                 foreach (byte tmp in byteArray)
  536.                 {
  537.                     if (tmp == USART_FRAMECTRL || tmp == USART_FRAMEHEAD || tmp == USART_FRAMETAIL)
  538.                     {
  539.                         tmpByteArray[len] = USART_FRAMECTRL;
  540.                         len++;
  541.                     }
  542.                     tmpByteArray[len] = tmp;
  543.                     CheckSum += tmp;
  544.                     len++;
  545.                 }
  546.                 if (CheckSum == USART_FRAMECTRL || CheckSum == USART_FRAMEHEAD || CheckSum == USART_FRAMETAIL)
  547.                 {
  548.                     tmpByteArray[len] = USART_FRAMECTRL;
  549.                     len++;
  550.                 }
  551.                 tmpByteArray[len] = CheckSum;
  552.                 len++;

  553.                 tmpByteArray[len] = USART_FRAMETAIL;
  554.                 len++;
  555.                 tmpByteArray[len] = USART_FRAMETAIL;
  556.                 len++;
  557.                 serialPort1.Write(tmpByteArray, 0, len);
  558.             }
  559.         }

  560.         private void ribbonButtonOpenCom2_Click(object sender, EventArgs e)
  561.         {

  562.             try
  563.             {
  564.                 if (ribbonButtonOpenCom2.Text == "打开串口")
  565.                 {
  566.                     serialPort2.PortName = ribbonComboBoxCom2.TextBoxText;
  567.                     serialPort2.BaudRate = int.Parse(ribbonComboBoxBaud2.TextBoxText);
  568.                     serialPort2.StopBits = System.IO.Ports.StopBits.One;
  569.                     serialPort2.Parity = System.IO.Ports.Parity.None;
  570.                     serialPort2.DataBits = 8;

  571.                     serialPort2.Open();
  572.                     //成功打开后 设置按钮相应的状态
  573.                     ribbonButtonOpenCom2.Text = "关闭串口";
  574.                     ribbonButtonOpenCom2.Image = Image.FromFile(Application.StartupPath + "\\ICON\\shutdown.ico");

  575.                     ribbonComboBoxCom2.Enabled = false;
  576.                     ribbonComboBoxBaud2.Enabled = false;
  577.                 }
  578.                 else
  579.                 {
  580.                     serialPort2.Close();
  581.                     ribbonButtonOpenCom2.Text = "打开串口";
  582.                     ribbonButtonOpenCom2.Image = Image.FromFile(Application.StartupPath + "\\icon\\standby.ico");
  583.                     ribbonComboBoxCom2.Enabled = true;
  584.                     ribbonComboBoxBaud2.Enabled = true;
  585.                 }
  586.             }
  587.             catch (Exception error)
  588.             {
  589.                 MessageBox.Show(error.ToString());
  590.             }
  591.         }

  592.         private void glassButtonCAL_Click(object sender, EventArgs e)
  593.         {
  594.             PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_Cal});
  595.         }

  596.         private void glassButtonStepAdd_Click(object sender, EventArgs e)
  597.         {
  598.             PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_StepAdd });

  599.         }

  600.         private void glassButtonStepSub_Click(object sender, EventArgs e)
  601.         {
  602.             PackData2Frame(new byte[] { (byte)COM_CMD.USART_M2S_StepSub });
  603.         }

  604.         

  605.     }
  606. }

  607.         
复制代码

全部资料51hei下载地址:
DC_POWER.rar (1.32 MB, 下载次数: 17)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表