。Net串口调试工具

基于.NET MAUI的跨平台串口调试工具开发实战 本文详细介绍了基于.NET MAUI框架开发跨平台串口调试工具的实战经验。通过定义核心接口、利用依赖注入处理平台差异,并分别实现了Windows与Android平台的串口通讯,构建了一套代码可覆盖多端的解决方案。文章深入探讨了架构设计、数据绑定及功能增强技巧,为嵌入式与物联网开发提供了高效的调试工具实现路径。 阅读详情
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Runtime.Remoting.Channels;

namespace YZ_LOT
{

    public enum CurrSetTypeName
    {
        Lora_Read,
        Lora_Write,
        Lora_Su_Read,
        Lora_Su_Write,
        GuanLi_Read,
        GuanLi_Write,
        Rs485_Read,
        Rs485_Write,
        XiaoYan_Read,
        XiaoYan_Write
    }

    public partial class UserControl_Machine_Debug : UserControl
    {
        private delegate void InvokeHandler();
        SerialPort sp = null;    //申明一个串口类

        bool isOpen = false;    //打开串口的标志

        bool isSetProperty = false;

        bool isHex = true;


        CurrSetTypeName MingLing_Type;

        string Machine_Name = "";

        public UserControl_Machine_Debug()
        {
            InitializeComponent();
        }

        public UserControl_Machine_Debug(string mName)
        {
            InitializeComponent();
            Machine_Name = mName;
        }


        private void GetChuanKou()
        {

            bool comExistence = false;    //有无可用串口标志位

            comboBox_ChuanKou.Items.Clear();    //清除当前串口号中的所有串口名称

            for (int i = 0; i < 10; i++)
            {
                try
                {

                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString());    //sp依次赋值COM1、COM2、、COM10

                    sp.Open();

                    sp.Close();

                    comboBox_ChuanKou.Items.Add("COM" + (i + 1).ToString());    //串口可以打开关闭说明串口可以使用,否则跳到异常

                    comExistence = true;    //有可用串口则标志位为true

                }
                catch (Exception)
                {

                    continue;    //COM1串口不存在,则继续COM2,依次循环到COM10

                }

            }
            if (comExistence)
            {

                comboBox_ChuanKou.SelectedIndex = 0;    //串口号更新为最先有效的串口

            }
        }


        private void SetPortProperty()
        {


            sp = new SerialPort();    //初始化sp

            sp.PortName = comboBox_ChuanKou.Text.Trim();    //设置串口名

            sp.BaudRate = Convert.ToInt32(comboBox_BoTe.Text.Trim());    //设置波特率,波特率是把字符串转换为32位整型
            Console.WriteLine(comboBox_BoTe.Text);

            if (comboBox_TingZhi.Text.Trim() == "0")
            {

                sp.StopBits = StopBits.None;    //停止位为0

            }

            else if (comboBox_TingZhi.Text.Trim() == "1.5")
            {

                sp.StopBits = StopBits.OnePointFive;    //停止位为1.5

            }

            else if (comboBox_TingZhi.Text.Trim() == "2")

            {

                sp.StopBits = StopBits.Two;    //停止位为2

            }

            else

            {

                sp.StopBits = StopBits.One;    //停止位为1

            }

            sp.DataBits = Convert.ToInt16(comboBox_ShuJu.Text.Trim());    //设置数据位,数据位是把字符串转换为16位整型

            if (comboBox_XiaoYan.Text.Trim() == "ODD")
            {

                sp.Parity = Parity.Odd;    //奇校验

            }
            else if (comboBox_XiaoYan.Text.Trim() == "EVEN")
            {

                sp.Parity = Parity.Even;    //偶校验
            }
            else
            {
                sp.Parity = Parity.None;    //不校验
            }

            sp.ReceivedBytesThreshold = 1;
            sp.DtrEnable = true;
            sp.ReadTimeout = 1000;
            sp.RtsEnable = true;
            sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);

        }

        private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);    //延时100ms,等待接收完数据
            bool IsSuccess = true;
            string recvData = "";
            try
            {
                if (isHex == false)
                {

                    recvData += sp.ReadLine();    //字符型,把接收字符直接显示在tbxRecvData上面,sp.ReadLine读串口字符串

                }
                else
                {

                    Byte[] ReceivedData = new Byte[sp.BytesToRead];    //定义并初始化字符数组,sp.ByteToRead串口读字符串长度

                    sp.Read(ReceivedData, 0, ReceivedData.Length);    //字符数组读取串口数据

                    recvData = BitConverter.ToString(ReceivedData, 0, ReceivedData.Length).Replace("-", " ");


                }
            }
            catch (TimeoutException)
            {

                IsSuccess = false;
            }
            

            sp.DiscardInBuffer();    //清除串口接收缓冲区数据

            string[] mingling_Arr = recvData.Split(' ');
            if(mingling_Arr.Length == 7 || mingling_Arr.Length == 8)
            {
                this.Invoke(new InvokeHandler(delegate ()
                {
                    switch (MingLing_Type)
                    {
                        case CurrSetTypeName.Lora_Read:
                            if(IsSuccess)
                            {
                                label_Lora.Text = "读取成功";
                                label_Lora.ForeColor = Color.Green;
                                int iNum = int.Parse(Get10string(mingling_Arr[4]));
                                comboBox_Lora.SelectedIndex = iNum - 1;
                            }
                            else
                            {
                                label_Lora.Text = "读取失败";
                                label_Lora.ForeColor = Color.Red;

                            }
                            
                            
                            break;
                        case CurrSetTypeName.Lora_Write:
                            if(IsSuccess)
                            {
                                label_Lora.Text = "设置成功";
                                label_Lora.ForeColor = Color.Green;
                            }
                            else
                            {
                                label_Lora.Text = "设置失败";
                                label_Lora.ForeColor = Color.Red;
                            }
                            
                            break;
                        case CurrSetTypeName.Lora_Su_Read:
                            if(IsSuccess)
                            {
                                label_Lora_Su.Text = "读取成功";
                                label_Lora_Su.ForeColor = Color.Green;
                                int iNum_Su = int.Parse(Get10string(mingling_Arr[4]));
                                comboBox_Lora_Su.SelectedIndex = iNum_Su - 1;
                            }
                            else
                            {
                                label_Lora_Su.Text = "读取失败";
                                label_Lora_Su.ForeColor = Color.Red;
                            }

                            
                            break;
                        case CurrSetTypeName.Lora_Su_Write:
                            if (IsSuccess)
                            {
                                label_Lora_Su.Text = "设置成功";
                                label_Lora_Su.ForeColor = Color.Green;
                            }
                            else
                            {
                                label_Lora_Su.Text = "设置失败";
                                label_Lora_Su.ForeColor = Color.Red;
                            }
                            
                            break;
                        case CurrSetTypeName.GuanLi_Read:
                            if(IsSuccess)
                            {
                                label_GuanLi.Text = "读取成功";
                                label_GuanLi.ForeColor = Color.Green;
                                textBox_GuanLi.Text = Get10string(mingling_Arr[4]);
                            }
                            else
                            {
                                label_GuanLi.Text = "读取失败";
                                label_GuanLi.ForeColor = Color.Red;
                            }
                           
                            break;
                        case CurrSetTypeName.GuanLi_Write:
                            if (IsSuccess)
                            {
                                label_GuanLi.Text = "设置成功";
                                label_GuanLi.ForeColor = Color.Green;
                            }
                            else
                            {
                                label_GuanLi.Text = "设置失败";
                                label_GuanLi.ForeColor = Color.Red;
                            }
                           
                            break;
                        case CurrSetTypeName.Rs485_Read:
                            if(IsSuccess)
                            {
                                label_BoTe.Text = "读取成功";
                                label_BoTe.ForeColor = Color.Green;
                                int iNum_BoTe = int.Parse(Get10string(mingling_Arr[4]));

                                comboBox_SuLu.SelectedIndex = iNum_BoTe - 1;
                            }
                            else
                            {
                                label_BoTe.Text = "读取失败";
                                label_BoTe.ForeColor = Color.Red;
                            }
                           

                            break;
                        case CurrSetTypeName.Rs485_Write:
                            if (IsSuccess)
                            {
                                label_BoTe.Text = "设置成功";
                                label_BoTe.ForeColor = Color.Green;
                            }
                            else
                            {
                                label_BoTe.Text = "设置失败";
                                label_BoTe.ForeColor = Color.Red;
                            }
                            
                            break;
                        case CurrSetTypeName.XiaoYan_Read:
                            if(IsSuccess)
                            {
                                label_XiaoJian.Text = "读取成功";
                                label_XiaoJian.ForeColor = Color.Green;
                                int iNum_XiaoYan = int.Parse(Get10string(mingling_Arr[4]));
                                comboBox_Data_XiaoYan.SelectedIndex = iNum_XiaoYan - 1;
                            }
                            else
                            {
                                label_XiaoJian.Text = "读取失败";
                                label_BoTe.ForeColor = Color.Red;
                            }
                            
                            break;
                        case CurrSetTypeName.XiaoYan_Write:
                            if (IsSuccess)
                            {
                                label_XiaoJian.Text = "设置成功";
                                label_XiaoJian.ForeColor = Color.Green;
                            }
                            else
                            {
                                label_XiaoJian.Text = "设置失败";
                                label_XiaoJian.ForeColor = Color.Red;
                            }
                            
                            break;
                        default:
                            break;
                    }
                }));
                    
            }
           


        }

        private void UserControl_Machine_Debug_Load(object sender, EventArgs e)
        {
            //加载串口
            GetChuanKou();
            comboBox_BoTe.SelectedIndex = 3;
            comboBox_ShuJu.SelectedIndex = 0;
            comboBox_TingZhi.SelectedIndex = 0;
            comboBox_XiaoYan.SelectedIndex = 0;
            this.label_BoTe.Text = "";
            label_Lora.Text = "";
            label_GuanLi.Text = "";
            label_Lora_Su.Text = "";
            label_XiaoJian.Text = "";
            comboBox_Lora.SelectedIndex = 0;
            comboBox_Lora_Su.SelectedIndex = 2;
            comboBox_SuLu.SelectedIndex = 3;
            comboBox_Data_XiaoYan.SelectedIndex = 0;
            groupBox_MachineName.Text = Machine_Name + "配置";
            label7.Text = Machine_Name + "配置";

            if(Machine_Name == "YZ-IOT_LORA_RS485网关")
            {
                this.label.Text = "管理设备数量";
            }


        }

        private void button_ResetMachine_Click(object sender, EventArgs e)
        {
            UserControl_Machine_List control_Machine_Debug = new UserControl_Machine_List();
            control_Machine_Debug.Dock = DockStyle.Fill;
            control_Machine_Debug.Show();

            this.Parent.Controls.Add(control_Machine_Debug);
            this.Parent.Controls.Remove(this);
        }


        private bool CheckPortSetting()

        {

            if (comboBox_ChuanKou.Text.Trim() =="")    return false;    //Trim()删除开头和结尾的空白字符

            if (comboBox_BoTe.Text.Trim() =="")    return false;

            if (comboBox_ShuJu.Text.Trim() =="")    return false;

            if (comboBox_TingZhi.Text.Trim() =="")    return false;

            if (comboBox_XiaoYan.Text.Trim() =="")    return false;

            return true;    //串口号、波特率、数据位、停止位、校验同时不为空,则返回true

        }

        private void button_OpenCom_Click(object sender, EventArgs e)
        {
            if (isOpen == false)    //之前串口是关闭的,则执行if语句块
            {

                if (!CheckPortSetting())    //串口未设置

                {

                    MessageBox.Show("串口未设置", "错误提示");

                    return;    //void函数加return,退出函数体

                }

                if(!isSetProperty)
                {
                    SetPortProperty();    //设置串口属性

                    isSetProperty = true;    //串口属性设置标志位设置为true

                }





                try

                {

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

                    isOpen = true;    //串口打开标志位设置为true

                    button_OpenCom.Text = "关闭串口";    //btnOpenCom的文本设置为“关闭串口”

                    comboBox_ChuanKou.Enabled = false;    //串口号失能

                    comboBox_BoTe.Enabled = false;    //波特率

                    comboBox_ShuJu.Enabled = false;    //数据位

                    comboBox_TingZhi.Enabled = false;    //停止位

                    comboBox_XiaoYan.Enabled = false;    //校验


                }

                catch (Exception)

                {

                    isSetProperty = false;    //串口设置标志位设置为false

                    isOpen = false;    //串口打开标志位设置为false

                    MessageBox.Show("串口无效或已被占用", "错误提示");    //打开失败提示消息框

                }

            }

            else    //之前串口是打开的,则执行else语句块

            {

                try

                {

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

                    isOpen = false;    //串口打开标志位设置为false

                    isSetProperty = false;

                    button_OpenCom.Text = "打开串口";    //btnOpenCom的文本设置为“打开串口”

                    comboBox_ChuanKou.Enabled = true;    //串口号失能

                    comboBox_BoTe.Enabled = true;    //波特率

                    comboBox_ShuJu.Enabled = true;    //数据位

                    comboBox_TingZhi.Enabled = true;    //停止位

                    comboBox_XiaoYan.Enabled = true;    //校验           

                }

                catch (Exception)

                {

                    MessageBox.Show("关闭串口时发生错误", "错误提示");    //关闭失败提示消息框

                }

            }

        }
        public byte[] strToToHexByte(String hexString)
        {
            hexString = hexString.Replace(" ", "");

            if ((hexString.Length % 2) != 0)

                hexString += " ";

            byte[] returnBytes = new byte[hexString.Length / 2];

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

                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Trim(), 16); return returnBytes;
        }

        private void SendData(string data, CurrSetTypeName typeid)
        {

            if (isOpen)    //串口打开状态
            {

                try
                {
                    MingLing_Type = typeid;
                    data += CRC.ToModbusCRC16(data).Insert(2, " ");
                    Console.WriteLine("发送数据--" + data);
                    byte[] writeBytes = strToToHexByte(data);
                    sp.Write(writeBytes, 0, writeBytes.Length);    //串口发送数据

                }

                catch

                {

                    MessageBox.Show("发送数据时发生错误!", "错误提示");

                    return;

                }

            }

            else

            {

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

            }



        }

        private void comboBox_ChuanKou_MouseEnter(object sender, EventArgs e)
        {
           
        }
        private string Get16String(string sDiZhi)
        {
            if (int.Parse(sDiZhi) > 9)
            {
                sDiZhi = Convert.ToString(int.Parse(sDiZhi), 16);
                if (sDiZhi.Length < 2)
                {
                    sDiZhi += "0" + sDiZhi.ToString();
                }
            }
            else
            {
                sDiZhi = "0" + sDiZhi;
            }

            return sDiZhi;


        }

        private string Get10string(string num)
        {
            int RtnMsg10 = int.Parse(num.Replace(" ", ""), System.Globalization.NumberStyles.HexNumber);
            return RtnMsg10.ToString();
        }
        private void button_Lora_Read_Click(object sender, EventArgs e)
        {
            
               
            SendData("FF 03 00 64 00 01 ",CurrSetTypeName.Lora_Read);
            
           
        }

        private void button_Lora_Sy_Read_Click(object sender, EventArgs e)
        {
            SendData("FF 03 00 65 00 01 ",CurrSetTypeName.Lora_Su_Read);
        }

       

        private void button_Lora_Set_Click(object sender, EventArgs e)
        {
            if(comboBox_Lora.Text != "")
            {

                int dataId = comboBox_Lora.SelectedIndex + 1;
                string sDiZhi = Get16String(dataId.ToString());
                SendData("FF 06 00 64 00 " + sDiZhi + " ",CurrSetTypeName.Lora_Write);
            }
            else
            {
                MessageBox.Show("请输入设置信息");
            }
          
        }

        private void button_GuanLi_Read_Click(object sender, EventArgs e)
        {
            SendData("FF 03 00 66 00 01 ",CurrSetTypeName.GuanLi_Read);
        }

        private void button_BoTe_Read_Click(object sender, EventArgs e)
        {
            SendData("FF 03 00 67 00 01 ",CurrSetTypeName.Rs485_Read);
        }

        private void button_XiaoJian_Read_Click(object sender, EventArgs e)
        {
            SendData("FF 03 00 68 00 01 ",CurrSetTypeName.XiaoYan_Read);
        }

        private void button_Lora_Su_Set_Click(object sender, EventArgs e)
        {
            if (comboBox_Lora_Su.Text != "")
            {
                int dataId = comboBox_Lora_Su.SelectedIndex + 1;
                string sDiZhi = Get16String(dataId.ToString());
                SendData("FF 06 00 65 00 " + sDiZhi + " ",CurrSetTypeName.Lora_Su_Write);
            }
            else
            {
                MessageBox.Show("请输入设置信息");
            }
        }

        private void button_GuanLi_Set_Click(object sender, EventArgs e)
        {
            if (textBox_GuanLi.Text != "")
            {
                string sDiZhi = Get16String(textBox_GuanLi.Text);
                SendData("FF 06 00 66 00 " + sDiZhi + " ",CurrSetTypeName.GuanLi_Write);
            }
            else
            {
                MessageBox.Show("请输入设置信息");
            }
        }

        private void button_BoTe_Set_Click(object sender, EventArgs e)
        {
            if (comboBox_SuLu.Text != "")
            {
                int  dataId = comboBox_SuLu.SelectedIndex + 1;
               
                string sDiZhi = Get16String(dataId.ToString());
                SendData("FF 06 00 67 00 " + sDiZhi + " ",CurrSetTypeName.Rs485_Write);
            }
            else
            {
                MessageBox.Show("请输入设置信息");
            }
        }

        private void button_XiaoJian_Set_Click(object sender, EventArgs e)
        {
            if (comboBox_Data_XiaoYan.Text != "")
            {
                int dataId = comboBox_Data_XiaoYan.SelectedIndex + 1;
                string sDiZhi = Get16String(dataId.ToString());
                SendData("FF 06 00 68 00 " + sDiZhi + " ",CurrSetTypeName.XiaoYan_Write);
            }
            else
            {
                MessageBox.Show("请输入设置信息");
            }
        }

        private void textBox_GuanLi_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8)
            {
                if(int.Parse(textBox_GuanLi.Text) > 0 && int.Parse(textBox_GuanLi.Text) <= 250)
                {
                    e.Handled = true;
                }
            }
        }

        private void textBox_GuanLi_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (int.Parse(textBox_GuanLi.Text) <= 0 )
                {
                    textBox_GuanLi.Text = "1";
                }

                if(int.Parse(textBox_GuanLi.Text) > 250)
                {
                    textBox_GuanLi.Text = "250";
                }
            }
            catch (Exception)
            {

               
            }
            
        }

        private void button_SearchMachine_Click(object sender, EventArgs e)
        {
            GetChuanKou();
        }
    }
}

 

.Net C# 通信开发-串口调试工具 🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀在.NET的世界里,C#编程语言以其优雅与强大的特性,成为了许多开发者的心头好。今天,我们就来一场串口通信的探险之旅,亲手打造一款既实用又俏皮的串口调试助手!🚀。 阅读详情

相关推荐

串口调试工具源码ASP.NET

今天下载了一个类似的,但是那个花了我十个资源分,而且还是一个不完整的,我整理了一下,直接F5就可以运行.

命令行文件重启服务器,Windows10命令行重启更新服务

更新失败后,联系微软客服,他们建议清理更新内存后重新尝试更新。实际原理是停止相关服务,删除缓存文件,再重启相关服务。具体步骤如下:右击左下角window 图标,打开命令提示符(管理员),依次输入以下命令net stop wuauservnet Stop cryptSvcnet Stop bitsnet Stop msiserverren C:\Windows\SoftwareDistributio...

weixin_34494211的博客 2391

uartassist 串口调试工具 可设置波特率 串口号 接收频率 十六进制等 ASC

uartassist 串口调试工具 可设置波特率 串口号 接收频率 十六进制等 ASC

【Win11】 系统更新 下载错误-0x8024a206

Win 11 下载错误-0x8024a206

qq_48180611的博客 2054

功能强大的串口工具:GhostyComm 4.0(万能通讯精灵)

功能强大的串口工具:GhostyComm 4.0(万能通讯精灵) 本软件是本人在2002初从事单片机开发工作时为了方便调试而编写的,当时是win 98版本。2003年才开发win xp版本。直到2007年前,仅支持串口,2006年增加了TCP连接的功能。 串口组件为第三方组件,TCP服务/客户主件为本人开发的“异步多线程”TCP组件,TCP服务组件为服务器级别的组件,每个客户连接有一个独立的线程响应处理。 本软件是单片机开发、调试不可缺少的功能齐全的串口工具——没有好的仿真器就要有好的串口工具。本软件也是TCP通讯开发、调试的好助手。好的工具可以达到事半功倍的效果。 试试看吧!适用于Windows 2000/2003/XP 数据显示举例: 收到的数据: 11:05:07,TCP服务数据,IP:192.168.10.220,端口:2801,138字节: $GPRMC,020426.000,A,2251.0144,N,10816.2180,E,0.11,39.63,100507,,,D*55$GPRMC,020426.000,A,2251.0144,N,10816.2180,E,0.11,39.63,100507,,,D*55 软件从收到的数据里面自动获取的数据: GPS有效:A GPS年:7 (3037) GPS月:5 (3035) GPS日:10 (3130) GPS时:2 (3032) GPS分:4 (3034) GPS秒:26 (3236) GPS经度:10816.218 (31303831362E32313830) GPS纬度:2251.0144 (323235312E303134342C) GPS速度:0.20385739 (302E31312C33392E3633) GPS角度:39.63 (33392E36332C31303035) GPS有效:A GPS年:7 (3037) GPS月:5 (3035) GPS日:10 (3130) GPS时:2 (3032) GPS分:4 (3034) GPS秒:26 (3236) GPS经度:10816.218 (31303831362E32313830) GPS纬度:2251.0144 (323235312E303134342C) GPS速度:0.20385739 (302E31312C33392E3633) GPS角度:39.63 (33392E36332C31303035) 收到的数据: 11:10:40,串口数据,18字节: 07 01 C7 BF C7 FF 66 80 91 A1 01 00 C3 FF 00 08 0D 0A . . 强 ? . f €? . . . ? . . . . . 软件从收到的数据里面自动获取的数据: 陀螺仪标志:1 (C7BF) 陀螺仪错误:0 (C7BF) 陀螺仪:-1.043955 (C7FF) 温度:14.8206 (6680) 角度:314.76159 (91A1) 主要功能: 1.可显示格式、非格式的字符、十进制、十六进制,非常的直观。 2、可以从收到的数据里面单独获取字符串型、整型和浮点型数据,不用再看着一堆十六进制数据而发愁了。 3、支持串口/TCP连接。 4、灵活多样的数据发送方式:字符串、十六进制或混和数据。 5.可以保存收到数据的文本或二进制数据。

串口工具(四种串口工具)

一个包含了四种串口工具的压缩包,有虚拟串口、SSCOM串口调试助手、串口调试助手、ASCII字符串表。

如何在 Windows 中终止更新服务:三种方法

Windows 更新是确保系统安全和性能的关键,但有时你可能希望暂时停止它,尤其是当更新干扰到你的工作或系统性能时。在这篇博客中,我将向你介绍三种常用的停止 Windows 更新服务的方法,帮助你在需要时灵活控制更新。

weixin_74075792的博客 4635

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 483

串口通讯中采用委托方法接收数据

串口通信代码似乎没有问题,就是不好使。

m0_37866385的博客 1021

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

c#实现串口操作 SerialPort

命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问。 操作类声明: SerialPort sp = null; /// <summary> /// 打开串口 /// </summary> /// <param name="protName"...

weixin_30316097的博客 484

Frida实战:如何用HashMap.put拦截法快速定位安卓App加密参数(附完整脚本)

本文详细介绍了如何使用Frida拦截HashMap.put方法快速定位安卓App加密参数,提供完整脚本和实战案例。通过动态分析技术,相比传统静态分析大幅提升效率,适用于电商、社交、金融等场景的加密参数定位。

jump7的博客 261

一款基于 .NET 开源美观、功能丰富的串口调试工具

今天大姚给大家分享一款基于 .NET 开源(GPL-3.0 license)、美观、流畅、高效、功能丰富的串口调试工具:SuperCom。SuperCom 是一款基于 .NET 开源(GPL-3.0 license)、美观、流畅、高效、功能丰富的串口调试工具,主要用于 Window 串口日志的采集、存储、可视化等功能。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1055

自助结账商品检测(Scanned Item Detection)——基于YOLOv8的RPC数据集实战

RPC数据集是由中国科学院自动化研究所发布的零售商品结账检测公开数据集,广泛用于自助结账和零售场景下的目标检测与识别。YOLOv8是YOLO系列最新版本,由Ultralytics推出,继承了YOLO家族的高效快速和高准确性,适用于实时检测场景。本文系统介绍了基于YOLOv8的RPC数据集自助结账商品检测方案,涵盖数据准备、训练、推理及UI界面设计。未来,可结合多模态感知、RFID融合技术,打造更加智能和稳定的自助结账系统。

YOLO 251

天气预测模型:基于时间序列分析的数学建模与实战案例

目录引言时间序列分析介绍使用Matlab进行天气预测实战案例:天气预测结论天气预测一直是气象学和相关领域的重要研究问题之一。数学建模是进行天气预测的有效方法之一,其中时间序列分析是常用的技术。在本篇博客中,我们将介绍时间序列分析的基本原理,演示如何使用Matlab进行模型建立和预测,并通过一个实战案例来展示模型的应用和分析。时间序列分析是一种用于分析和预测时间序列数据的统计方法。天气数据通常具有时间依赖性和随机性,因此时间序列分析可以帮助我们了解天气的变化趋势和规律,并提供对未来天气的预测。时间序列分析通常

YOLO 1546

.NET开源功能强大的串口调试工具

今天大姚给大家分享一款.NET开源的、功能强大的串口调试工具:LLCOM。LLCOM是一个.NET开源的、功能强大的串口调试工具。支持Lua自动化处理、串口调试、串口监听、串口曲线、TCP测试、MQTT测试、编码转换、乱码恢复等功能。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 997

iStoreOS等软路由插件卸载的残留?分享一款软路由高级卸载工具,自定义卸载,轻松解决卸载残留问题

iStoreOS用户看过来!👀 还在被插件包残留困扰吗?本文分享一款“高级卸载”的插件,助你深度清理iStoreOS系统,彻底解决软件卸载不净的痛点,告别频繁恢复出厂设置的烦恼!🚀

XiaoqiangClub的博客 1541

LLCOM:一个.NET开源且功能强大的串口调试工具

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现! 项目介绍 LLCOM是一个.NET开源、功能强大、高自由度的串口调试工具,它允许用户运行Lua脚本来提前处理待发送的数据,同时还集成了多种通信协议(如TCP、UDP、SSL、MQTT)的测试服务端/客户端功能,以及串口监听、编码互转、乱码恢复等特色功能。 主要功能 串口通信:集成串口监听功能...

dotNET跨平台 875

VTK:vtkAssembly用法实战

VTK:vtkAssembly用法实战程序输出程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkAssembly.h> #include <vtkAxesActor.h> #include <vtkCubeSource.h> #include <vtkNamedColors.h> #include <vtkNew.h> #include <vtkOrientation

希望我的博客,能帮上你解决学习中工作中所遇到的问题 936

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

.NET5+Avalonia跨平台实战:手把手教你用BaoYuanSerial开发串口调试工具

本文是一份详细的实战指南,手把手教你使用.NET 5和Avalonia框架开发名为BaoYuanSerial的跨平台串口调试工具。文章从技术选型、环境搭建讲起,深入讲解了基于MVVM模式的核心功能实现、UI设计、数据绑定,并最终指导如何打包发布到Windows、Linux和macOS平台,为嵌入式开发和物联网调试提供高效的开源解决方案。

nft7creator的博客 485

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: c# winform 设置TextBox 只能输入数字
下一篇: .Net C# Socket通信
Little_Code
博客等级 码龄10年 62粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值