在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#实现环形缓冲区实例

C#实现环形缓冲区实例

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:1.35M
  • 下载次数:27
  • 浏览次数:277
  • 发布时间:2019-10-24
  • 实例类别:C#语言基础
  • 发 布 人:liweiba
  • 文件格式:.rar
  • 所需积分:5
 相关标签: C# 实例

实例介绍

【实例简介】

因个人需求,需要测试串口数据,直接拿去应用就可以了,经历半个月的压力测试,都没问题, *组件功能:利用环形缓冲区的特点实现对接收到的数据环形缓冲进行缓冲,
 *进而减少应用程序对数据解析的压力,同时通过组件里面封装的读取缓冲
 *区的数据的函数,来读取缓冲区完整的一帧数据,从而减少或是避免数据
 *包的丢失的情况的发生,同时也减少了工程师重复编写数据解析方法的重,


【实例截图】

from clipboard

【核心代码】


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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        #region 创建日志
        TornadoJournal.Journal ReceivedJournal = new TornadoJournal.Journal(System.Environment.CurrentDirectory   "\\"   "ReceivedJournal", "Journal"   DateTime.Now.ToString("yy-MM-dd-hh-mm-ss"));
        TornadoJournal.Journal SendJournal = new TornadoJournal.Journal(System.Environment.CurrentDirectory   "\\"   "SendJournal", "Journal"   DateTime.Now.ToString("yy-MM-dd-hh-mm-ss"));
        #endregion

        #region 构造函数
        public Form1()
        {
            InitializeComponent();
            tornadoSerialPort1_DealAnalyticaledDataDwangD = new tornadoSerialPort1_DealAnalyticaledDataDelegate(tornadoSerialPort1_DealAnalyticaledDataDwang);
            string[] str;
            if (tornadoSerialPort1.ScanSerialPort(out str))
            {
                comboBox1.Items.AddRange(str);
                comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//旋转第3个可用串口
            }
        }
        #endregion

        #region 打开、关闭串口
        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "打开")
            {
                ReceivedJournal.CreateJournalFile();
                SendJournal.CreateJournalFile();
                button1.Text = "关闭";
                comboBox1.Enabled = false;
                tornadoSerialPort1.SetSerialPortParameter(9600, Parity.None, StopBits.One,8,1);
                tornadoSerialPort1.OpenSerialPort(comboBox1.Text);
            }
            else if (button1.Text == "关闭")
            {
                button1.Text = "打开";
                comboBox1.Enabled = true;
                tornadoSerialPort1.CloseSerialPort();
            }
        }
        #endregion

        #region 处理解析好的数据
        #region 创建更新textbox控件数据的委托
        public delegate void tornadoSerialPort1_DealAnalyticaledDataDelegate(byte[] data);
        tornadoSerialPort1_DealAnalyticaledDataDelegate tornadoSerialPort1_DealAnalyticaledDataDwangD;
        #endregion
        
        private void tornadoSerialPort1_DealAnalyticaledData(byte[] data)
        {
            BeginInvoke(tornadoSerialPort1_DealAnalyticaledDataDwangD, data);
        }

        Int64 count = 1;
        public void tornadoSerialPort1_DealAnalyticaledDataDwang(byte[] data)
        {
            textBox1.AppendText("\r\n");
            textBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")   "\r\n");          
            textBox1.AppendText("接收成功次数:"  count "\r\n");
            textBox1.AppendText("接收到的数据:");
            textBox1.AppendText(String.Join(",", data) );
            textBox1.AppendText("\r\n");
            textBox1.AppendText("原始数据:");
            foreach (byte b in data)
            {
                string hex16 =b.ToString("X2");//是否满足两位
                textBox1.AppendText(hex16   " ");
            }
            textBox1.AppendText("\r\n");
            int sum3 = data[0]   data[1]   data[2];
            int sum2 = (data[4] << 8) data[3];//待修改
            int temp = data[2] & 0x0F;
            textBox1.AppendText("帧起始符:"   "\t"   Convert.ToString(data[0], 16)  "\r\n");
            textBox1.AppendText("卡片编号:"   "\t"   Convert.ToString((((data[2] & 0x0F)<<8)  data[1]),10)   "\r\n");
            textBox1.AppendText("校验和  :"   "\t"   Convert.ToString(sum2, 16)   "\r\n");
            if((data[2]&0xc0)==0x00)
               textBox1.AppendText("电池状态:满电"   "\r\n");
            else if((data[2] & 0xc0) == 0x40)
               textBox1.AppendText("电池状态:半满"   "\r\n");
            else if ((data[2] & 0xc0) == 0x80)
               textBox1.AppendText("电池状态:电量低"   "\r\n");
            else if ((data[2] & 0xc0) == 0xC0)
               textBox1.AppendText("电池状态:欠压"   "\r\n");

            if ((data[2] & 0x30) == 0x00)
                textBox1.AppendText("卡片状态:正常"   "\r\n");  
            else
                textBox1.AppendText("卡片状态:异常"   "\r\n");
            if (sum3 == sum2)
            {
                textBox1.AppendText("校验成功"   "\r\n");
            }
            else
            {
                textBox1.AppendText("校验失败"   "\r\n");
            }
            ReceivedJournal.WriteStrMessageToJournalFile(textBox1.Text, Encoding.Default);
            count  ;
        }
        #endregion

        #region 自动发送数据
        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                if (SendDataThread != null) SendDataThread.Abort();
                SendDataThread = new Thread(new ThreadStart(SendDataT));
                SendDataThread.IsBackground = true;//设置为后台线程
                SendDataThread.Start();
                button3.Enabled = false;
            }
            catch { }
        }

        private Thread SendDataThread;
        private void SendDataT()
        {
            Int64 num = 0;
            Int64 count=1;
            byte[] bytedata = new byte[tornadoSerialPort1.FrameSize];
            bytedata[0] = 0xFF;
            bytedata[1] = 0x38;
            while (true)
            {
                try
                {
                    num  ;
                    if (num >= 380) num = 0;
                    bytedata[0] = 0xFF;
                    bytedata[1] = 0x38;
                    bytedata[2] = 0x78;
                    bytedata[3] = (byte)(0xFF & (num >> 8));
                    bytedata[4] = (byte)(0xFF & (num >> 0));
                    tornadoSerialPort1.SerialPortSendData(bytedata);
                    SendJournal.WriteStrMessageToJournalFile(string.Join(" ", bytedata)   "    "   count, Encoding.Default);
                    Thread.Sleep(1);
                    count  ;
                }
                catch { }
            }
        }
        #endregion

        #region 关闭自动发送线程
        private void buttonClear_Click(object sender, EventArgs e)
        {
            tornadoSerialPort1.SerialPortSendData(new byte[3]{1,2,3});
            //try
            //{
            //    if (SendDataThread != null) SendDataThread.Abort();
            //    button3.Enabled = true;
            //}
            //catch { };
        }
        #endregion

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }
    }
}


标签: C# 实例

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警