久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3318|回復: 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, 下載次數: 18)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产你懂的在线观看 | 一区二区视频 | 99精品国产一区二区三区 | 狠狠干美女 | 日韩网站免费观看 | 欧美精品在线免费观看 | 黑人巨大精品欧美一区二区一视频 | 亚洲国产精品区 | 人妖videosex高潮另类 | 精品久久久久久久久久久院品网 | 美女中文字幕视频 | 国产精品美女久久久久aⅴ国产馆 | 久久久久一区 | 国产日韩一区 | www在线| 一级h片 | 欧美色综合天天久久综合精品 | 夜夜操天天操 | 欧美老妇交乱视频 | 亚洲日日夜夜 | 亚洲综合在线网 | 国产成人精品免费视频 | 日本三级全黄三级三级三级口周 | 精品久久久网站 | 一区二区久久 | 亚洲狠狠爱 | 欧美 日韩 国产 成人 在线 | 国产福利一区二区 | 午夜视频免费网站 | 91毛片网| 人人爽人人草 | 亚洲小视频在线观看 | 国内精品伊人久久久久网站 | 91久久夜色精品国产网站 | 午夜天堂精品久久久久 | 成年人的视频免费观看 | 欧美在线视频网 | 欧洲成人午夜免费大片 | 日韩精品在线视频 | 久久精品中文字幕 | 在线免费观看日本视频 |