C#实现串口发送序列化数据

如下图:

其中红色框内展现的为实现效果图,其中最前面的文本框是要发送的具体字节,可以手动修改,后面的按钮为单击可控制单次发送,同时双机要发送的文本框可修改按钮的标题,用于做备注使用,后面的红色数字用于定义序列发送的顺序,我这里定义的是小于20,大于20的时候认为不转发,最后面的蓝色数字为发送完成后的等待时间,单位毫秒;

当下面的checkbox(循环)选中的时候,就开始按自定义序列发送,当不选中的时候,就停止发送,保存配置按钮,可以将上面修改的配置保存,下次启动程序调用配置,可省去从新编辑的时间。

下面简单说名一下编写方法:

单击循环checkbox函数

{
    if(checkBox1.Checked)
    {
        forcanrun = true;//循环发送标志有效
        //定义其他界面按钮的状态
        btn_sttestcom.Text = "结束";
        commname = comboBox4.Text;
        commbps = combobps.Text;
        commcrc = combocrc.SelectedIndex;
        sendstr = richTextBox3.Text;
        
        //收集上面文本框,发送序列号,延时时间的数据并保存到数组中
        oradata();
        //创建一个线程,用于控制并按顺序发送
        forsend = new Thread(func_forsend);
        forsend.IsBackground = true;
        forsend.Start();                
        forcanrun = true;
        Console.WriteLine("func_forsend thread started \r\n");
    }
    else//如果checkbox没有选中,停止发送,终止线程
    {
        forcanrun = false;
        forsend.Join(0);
        Console.WriteLine("func_forsend thread joined \r\n");
        Thread.Sleep(1000);
    }
}

//收集数据的函数,将数据保存到数组中
public string[] oradata()
{          
    arraytxt[0] = richTextBox3.Text;//发送str
    arraytxt[1] = richTextBox4.Text;
    arraytxt[2] = richTextBox5.Text;
    arraytxt[3] = richTextBox6.Text;
    arraytxt[4] = richTextBox7.Text;
    arraytxt[5] = richTextBox8.Text;
    arraytxt[6] = richTextBox9.Text;
    arraytxt[7] = richTextBox10.Text;
    arraytxt[8] = richTextBox11.Text;
    arraytxt[9] = richTextBox12.Text;
    arraytxt[10] = richTextBox13.Text;
    arraytxt[11] = richTextBox14.Text;
    arraytxt[12] = richTextBox15.Text;
    arraytxt[13] = richTextBox16.Text;

sendindex[0] = Convert.ToInt16(textBox8.Text); //发送index
    sendindex[1] = Convert.ToInt16(textBox10.Text);
    sendindex[2] = Convert.ToInt16(textBox12.Text);
    sendindex[3] = Convert.ToInt16(textBox14.Text);
    sendindex[4] = Convert.ToInt16(textBox16.Text);
    sendindex[5] = Convert.ToInt16(textBox18.Text);
    sendindex[6] = Convert.ToInt16(textBox20.Text);
    sendindex[7] = Convert.ToInt16(textBox22.Text);
    sendindex[8] = Convert.ToInt16(textBox24.Text);
    sendindex[9] = Convert.ToInt16(textBox26.Text);
    sendindex[10] = Convert.ToInt16(textBox28.Text);
    sendindex[11] = Convert.ToInt16(textBox30.Text);
    sendindex[12] = Convert.ToInt16(textBox32.Text);
    sendindex[13] = Convert.ToInt16(textBox34.Text);

sleeptime[0] = Convert.ToInt16(textBox9.Text);//发送 delay
    sleeptime[1] = Convert.ToInt16(textBox11.Text);
    sleeptime[2] = Convert.ToInt16(textBox13.Text);
    sleeptime[3] = Convert.ToInt16(textBox15.Text);
    sleeptime[4] = Convert.ToInt16(textBox17.Text);
    sleeptime[5] = Convert.ToInt16(textBox19.Text);
    sleeptime[6] = Convert.ToInt16(textBox21.Text);
    sleeptime[7] = Convert.ToInt16(textBox23.Text);
    sleeptime[8] = Convert.ToInt16(textBox25.Text);
    sleeptime[9] = Convert.ToInt16(textBox27.Text);
    sleeptime[10] = Convert.ToInt16(textBox29.Text);
    sleeptime[11] = Convert.ToInt16(textBox31.Text);
    sleeptime[12] = Convert.ToInt16(textBox33.Text);
    sleeptime[13] = Convert.ToInt16(textBox35.Text);

string arrtxt1="";
    int sendindex1=0;
    int sleeptime1=0;
    for (int m = 0; m < 14;m++ )
    {
       for(int j=m+1;j<14;j++)
       {
           if(sendindex[j]<sendindex[m])
           {
               sendindex1 = sendindex[j];
               arrtxt1 = arraytxt[j];
               sleeptime1 = sleeptime[j];

sendindex[j] = sendindex[m];
               arraytxt[j] = arraytxt[m];
               sleeptime[j] = sleeptime[m];

sendindex[m] = sendindex1;
               arraytxt[m] = arrtxt1;
               sleeptime[m] = sleeptime1;
           }
       }
    }
    return arraytxt;
}

//发送数据的线程函数
public void func_forsend()
{
    while (forcanrun)//用于控制当checkbox无效的时候,线程就退出了。
    {     
        for (int i = 0; i < 14; i++)
        {
            if (sendindex[i] < 20)  //如果不想发送,可定义为20或则以上
            {
                string bb="";
                if (crcselectindex > 0)
                    bb = GetCRCData(arraytxt[i]);//根据要发送的数据,计算crc校验码并添加到最后的字符位置。                                
                else
                    bb = arraytxt[i];
                int n = 0;
                //此处可以自己修改,我这里实现的是网络模式和串口模式都兼容的
                if (!netflag)//串口模式,具体怎么发送这里就不啰嗦了
                {                                
                    n = ycomm.Sendstr(bb, Convert.ToInt16(ycomm.HexFlag)); 
                }
                else//网络模式
                {                    
                    if (netclientflag)//客户端模式
                        n = csocket.Sendstr(bb, csocket.hexflag);
                    else//服务端模式
                    {
                        if(scsocket.islisten)
                            n = scsocket.SendData(bb);
                    }
                }
                string sendstr1 = "";
                //如果成功发送,将数据显示到界面上,并增加时标
                if (n > 0)
                {
                    
                    if (timebz)
                    {
                        DateTime t1 = DateTime.Now;
                        sendstr1 = "[" + t1.Hour.ToString("00") + ":" + t1.Minute.ToString("00") + ":" + t1.Second.ToString("00") + "." + t1.Millisecond.ToString("000") + "] ";                                    
                    }
                    //次数显示数据用委托实现。
                    ShowThreadDataToRec(sendstr1 + "发→◇: " + bb + "\r\n");
                    if (savefilebz)//如果寸日志标志有效,保存报文到文件
                        txtfile.WriteLogFile("发→◇: " + bb + "\r\n", "报文保存", 1);
                }

Thread.Sleep(sleeptime[i]);//发送完成后,延时一定时间,放置串口堵塞                
            }
        }        
    }           
}

具体如何使用串口和网络发送数据以及如何计算校验码的实现代码,这里就不萝莉啰嗦的折腾了。

用c#实现通讯中自定义发送序列化数据,可一定程度上实现可编程发送的功能相关推荐

  1. 在Spark中自定义Kryo序列化输入输出API(转)

    原文链接:在Spark中自定义Kryo序列化输入输出API 在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo serialization.在默认情况 ...

  2. Python抓取网页中的动态序列化数据

    Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...

  3. 在pytorch中自定义dataset读取数据2021-1-8学习笔记

    在pytorch中自定义dataset读取数据 utils import os import json import pickle import randomimport matplotlib.pyp ...

  4. python发送json数据_在Websockets上发送JSON

    我有一个简单的Python tornado Websockets服务器,从JavaScript客户端接收消息.我正在尝试发送JSON数据,我找到的唯一解决方案是将JSON对象转换成字符串JSON,发送 ...

  5. 微信JSSDK使用步骤(用于在微信浏览器中自定义分享,分享到朋友圈,拍照,扫一扫等功能)

    一.使用JSSDK需要一个公众号(需要认证!): (1).把自己项目的服务器地址输入. (2).把MP_verify_m7Qp93BAuIGDWRVO.txt  文件下载下来,放到该服务器域名指向的根 ...

  6. QQ发送PDF为什么显示服务器,qq上传输文件默认发送在线文件设置.pdf

    具体解决方案如下: 解决方案 1 : 请您谅解.此问题是由于好友通过多态(多终端. 2 ,对方是多终端登录(或者开通移动在线功能)的情况下 ,感谢您的反馈.若给 您带来了困扰,我们后续会优化这方面的体 ...

  7. 易语言post发送php数据,易语言post上传文件

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 php源码是 $save_path = ""; if($_POST["save_path"]){ $save_pa ...

  8. 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

    为什么80%的码农都做不了架构师?>>>    最近要在QT下开发Tcp通讯,发送序列化数据以便于接收. 这里涉及到几个问题: 1.QTcpSocket.QTcpServer的通讯 ...

  9. 如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析

    在直播系统中,除了直播音视频之外,有时候还想从主播端发布文本信息等,这些信息可以不通过视频传输通道发送给用户播放端,但如果传输的数据想和视频保持精准同步,那最好的办法就是这些信息和视频数据打包在一起传 ...

最新文章

  1. 深圳上海场 | 神策 2019 数据驱动大会「PPT 下载」新鲜出炉!
  2. nginx alias
  3. 对'\0'的敬畏——由阶乘想到的
  4. for i in range什么意思_python迭代和解析——range、map函数
  5. iphone13怎么安装双卡(双卡功能)
  6. VS的C++调试教程
  7. libcef-详细步骤-将cef浏览器嵌入到Win32中作为子窗口运行
  8. SAP 获取不同币种间的汇率 RFC BAPI_EXCHANGERATE_GETDETAIL
  9. 电源完整性之仿真设计原理
  10. java:io的基本实例
  11. windows搭建RN环境
  12. 忘记服务器root用户密码
  13. Mac软件安装包和问题解决方案
  14. dvi转vga没有合适的分辨率
  15. 计算机科学与技术与测控,测控技术与仪器.PDF
  16. .启动ARCGIS提示“Automation错误”
  17. 【回眸】作为一位应届生,写简历的时候会踩哪些坑?
  18. linux修改开机启动,Linux修改开机启动logo
  19. 2018苹果App上架App Store审核指南要求
  20. 基于QT的安卓手机蓝牙APP开发

热门文章

  1. python椭圆面积_利用matplotlib实现2个椭圆的重叠区域
  2. pytorch 模型可视化_高效使用Pytorch的6个技巧:为你的训练Pipeline提供强大动力
  3. mysql忘记密码重置
  4. 在 Chrome 开发者工具中调试 node.js
  5. get_date.sh
  6. Android RSA加密对象数据
  7. 挑战JavaScript正则表达式每日两题(2)
  8. NFS基本配置与NFS客户端自动挂载
  9. 今天有点时间,想写一个小说,说说面向对象的故事,主人是人类!(一)
  10. MySQL优化篇:慢查询日志