C#串口通讯+BigEndian+Little-Endian(大端和小端方案)

  • Post author:
  • Post category:其他


C#串口通讯

#region 串口
        /// <summary>
        /// 2 3 4G DTU短信收发说明
        /// </summary>
        public static void TestDTU4G()
        {
            var PortNames = SerialPort.GetPortNames();
            foreach (var item in PortNames)
            {
                Console.WriteLine($"端口:{item}");
            }

            serialPort = new SerialPort();
            var result = SerialPortInit(PortNames[0]);
            if (result)
            {
                //while (true)
                {
                    var txt = "测试消息123AB";
                    byte[] unicodeBytes = null;
                    string sendString = null;
                    StringBuilder stringBuilder = new StringBuilder();
                    if (Regex.IsMatch(txt, @"[\u4e00-\u9fa5]"))//是否包含中文
                    {
                        //BigEndian------6D4B 8BD5 6D88 606F 0031 0032 0033 0041 0042
                        foreach (var i in txt.ToCharArray())
                        {
                            stringBuilder.Append(((int)i).ToString("X").PadLeft(4, '0'));
                        }
                        sendString = stringBuilder.ToString();
                        //下面的也是大端方案
                        //unicodeBytes = Encoding.BigEndianUnicode.GetBytes(txt);
                    }
                    else
                    {
                        //Little-Endian-----4B6D D58B 886D 6F60 3100 3200 3300 4100 4200
                        unicodeBytes = Encoding.Unicode.GetBytes(txt);
                    }

                    if (unicodeBytes != null && unicodeBytes.Length > 0)
                    {
                        foreach (var item in unicodeBytes)
                        {
                            stringBuilder.Append(item.ToString("X2"));
                        }
                    }
                   
                    sendString = stringBuilder.ToString();
                    Console.WriteLine($"{sendString}");
                    Console.WriteLine("AT*MSGS=18052060345,0,12,123456ABCDEF");
                    //serialPort.Write("AT*MSGS=18052060345,0,12,123456ABCDEF");
                    if (!string.IsNullOrEmpty(sendString))
                    {
                        while (true)
                        {
                            serialPort.Write($"AT*MSGS=18052060793,3,{sendString.Length},{sendString}");
                            Thread.Sleep(TimeSpan.FromSeconds(2));
                        }
                        //serialPort.Write($"AT*MSGS=18052060345,3,{sendString.Length},{sendString}");
                        //serialPort.Write("AT*MSGS=18052060345,3,36,6D4B8BD56D88606F00310032003300410042"); 
                    }


                    //var data = Encoding.Default.GetBytes($"AT*MSGS=18052060345,0,12,123456ABCDEF");
                    //SerialPortWrite(data, data.Length);
                    //Thread thread = new Thread(() =>
                    //{
                    //    while (true)
                    //    {
                    //        Thread.Sleep(TimeSpan.FromSeconds(10));
                    //        serialPort.Write("AT*MSGS=18052060793,0,12,123456ABCDEF");
                    //    }                        
                    //});
                    //thread.IsBackground = true;
                    //thread.Start();
                }
            }
        }

        static SerialPort serialPort = null;

        public static bool SerialPortInit(string comx)
        {
            serialPort.PortName = comx;
            try
            {
                if (serialPort.IsOpen)
                    serialPort.Close();
            }
            catch
            {
            }
            serialPort.PortName = comx;          // 串口号
            serialPort.BaudRate = 9600;          // 波特率:9600
            serialPort.DataBits = 8;             // 数据位数:8
            serialPort.StopBits = StopBits.One;  // 停止位
            serialPort.Parity = Parity.None;     // 奇偶校验无
            serialPort.Encoding = Encoding.Default;
            serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPortReceive);
            try
            {
                serialPort.Open();// 打开串口
                return true;
            }
            catch
            {
                Console.WriteLine(comx + "端口被占用");
                return false;
            }
        }

        /// <summary>
        /// 串口写数据
        /// </summary>
        /// <param name="data"></param>
        /// <param name="len"></param>
        public static void SerialPortWrite(byte[] data, int len)
        {
            try
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Write(data, 0, len);
                }
            }
            catch { }

        }

        /// <summary>
        /// 串口接收数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        public static void SerialPortReceive(object sender, SerialDataReceivedEventArgs e)
        {
            int bufflen = serialPort.BytesToRead;    //返回接收到的数据个数

            byte[] dat = new byte[bufflen];
            serialPort.Read(dat, 0, bufflen);
            Console.WriteLine($"串口收到信息:{Encoding.Default.GetString(dat)}");
        }

        public enum HardwareEnum
        {
            // 硬件
            Win32_Processor,         // CPU 处理器
            Win32_PhysicalMemory,    // 物理内存条
            Win32_Keyboard,          // 键盘
            Win32_PointingDevice,    // 点输入设备,包括鼠标。
            Win32_FloppyDrive,       // 软盘驱动器
            Win32_DiskDrive,         // 硬盘驱动器
            Win32_CDROMDrive,        // 光盘驱动器
            Win32_BaseBoard,         // 主板
            Win32_BIOS,              // BIOS 芯片
            Win32_ParallelPort,      // 并口
            Win32_SerialPort,        // 串口
            Win32_SerialPortConfiguration,   // 串口配置
            Win32_SoundDevice,               // 多媒体设置,一般指声卡。
            Win32_SystemSlot,                // 主板插槽 (ISA & PCI & AGP)
            Win32_USBController,             // USB 控制器
            Win32_NetworkAdapter,            // 网络适配器
            Win32_NetworkAdapterConfiguration, // 网络适配器设置
            Win32_Printer,                  // 打印机
            Win32_PrinterConfiguration,     // 打印机设置
            Win32_PrintJob,                 // 打印机任务
            Win32_TCPIPPrinterPort,         // 打印机端口
            Win32_POTSModem,                // MODEM
            Win32_POTSModemToSerialPort,    // MODEM 端口
            Win32_DesktopMonitor,           // 显示器
            Win32_DisplayConfiguration,     // 显卡
            Win32_DisplayControllerConfiguration,    // 显卡设置
            Win32_VideoController,                  // 显卡细节。
            Win32_VideoSettings,                    // 显卡支持的显示模式。

            // 操作系统
            Win32_TimeZone,                    // 时区
            Win32_SystemDriver,                // 驱动程序
            Win32_DiskPartition,               // 磁盘分区
            Win32_LogicalDisk,                 // 逻辑磁盘
            Win32_LogicalDiskToPartition,      // 逻辑磁盘所在分区及始末位置。
            Win32_LogicalMemoryConfiguration,  // 逻辑内存配置
            Win32_PageFile,                    // 系统页文件信息
            Win32_PageFileSetting,             // 页文件设置
            Win32_BootConfiguration,           // 系统启动配置
            Win32_ComputerSystem,              // 计算机信息简要
            Win32_OperatingSystem,             // 操作系统信息
            Win32_StartupCommand,              // 系统自动启动程序
            Win32_Service,                     // 系统安装的服务
            Win32_Group,                       // 系统管理组
            Win32_GroupUser,                   // 系统组帐号
            Win32_UserAccount,                 // 用户帐号
            Win32_Process,                     // 系统进程
            Win32_Thread,                      // 系统线程
            Win32_Share,                       // 共享
            Win32_NetworkClient,               // 已安装的网络客户端
            Win32_NetworkProtocol,             // 已安装的网络协议
            Win32_PnPEntity,                   //all device
        }


        //如果是设备字符串中存在COM,则保存该字符串,则找到串口名。
        private static string[] GetHarewareInfo(HardwareEnum hardType, string propKey)
        {
            List<string> strs = new List<string>();
            try
            {
                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + hardType))
                {
                    var hardInfos = searcher.Get();
                    foreach (var hardInfo in hardInfos)
                    {
                        if (hardInfo.Properties[propKey].Value != null)
                        {
                            String str = hardInfo.Properties[propKey].Value.ToString();
                            if (str.Contains("COM"))
                            {
                                strs.Add(str);
                            }
                        }
                    }
                }
                return strs.ToArray();
            }
            catch
            {
                //MessageBox.Show("硬件端口查找错误", "程序猿的提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return null;
            }
            finally
            {
                strs = null;
            }
        }

        //自动检测新的硬件插入,如果存在则开启定时器,刷新端口名
        //protected override void WndProc(ref Message m)
        //{
        //    const int WM_DEVICECHANGE = 0x219;
        //    if (m.Msg == WM_DEVICECHANGE)
        //    {
        //        timer3.Interval = 100;
        //        timer3.Enabled = true;
        //        DeviceTimer3Flag = true;

        //    }
        //    base.WndProc(ref m); //将系统消息传递自父类的WndProc
        //}
        //定时器函数,刷新端口名
        //private void timer3_Tick(object sender, EventArgs e)
        //{
        //    if (DeviceTimer3Flag)
        //    {
        //        DeviceTimer3Flag = false;
        //        RefreshComList();
        //        timer3.Enabled = false;
        //        this.comboBox1.SelectedIndex = -1;

        //    }
        //    if (ShowTimer3Flag)
        //    {
        //        ShowTimer3Flag = false;
        //        timer3.Enabled = false;
        //        toolStripStatusLabel4.Text = "";
        //    }
        //}
        //刷新端口名信息
        protected void RefreshComList()
        {
            string[] str = GetHarewareInfo(HardwareEnum.Win32_PnPEntity, "Name");//获取全部驱动名称
            //foreach (string vPortName in SerialPort.GetPortNames())
            //try
            //{
            //    comboBox1.Items.Clear();
            //    for (byte i = 0; i < str.Length; i++)
            //    {
            //        //this.comboBox1.Text =  vPortName ;
            //        comboBox1.Items.Add(str[i]);
            //    }
            //}
            //catch (Exception)
            //{
            //    ShowMessage("没有可用端口", 1000);
            //}
            //this.Refresh();
        }
        //获取端口信息后,提取出COM口,初始化端口。
        //private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //    if (button2.Text == "停止发送")
        //    {
        //        button2.Text = "配置发送";
        //        timer2.Enabled = false;
        //    }
        //    string comPortName;
        //    string TempByte;
        //    string ConstByte = "-";
        //    int startIndex = comboBox1.SelectedItem.ToString().LastIndexOf("(");
        //    int endIndex = comboBox1.SelectedItem.ToString().LastIndexOf(")");
        //    if ((endIndex - startIndex) > 5)
        //    {
        //        TempByte = comboBox1.SelectedItem.ToString().Substring(startIndex + 6, 1);
        //        if (TempByte == ConstByte)
        //        {
        //            comPortName = comboBox1.SelectedItem.ToString().Substring(startIndex + 1, 5);
        //        }
        //        else
        //        {
        //            comPortName = comboBox1.SelectedItem.ToString().Substring(startIndex + 1, 4);
        //        }
        //    }
        //    else
        //    {
        //        comPortName = comboBox1.SelectedItem.ToString().Substring(startIndex + 1, 4);
        //    }
        //    if (SerialCommx.SeriaInit(comPortName))
        //    {
        //        ShowMessage(SerialCommx.GetPortName() + "已打开", 1000);
        //        button2.Enabled = true;
        //    }
        //    else
        //    {
        //        ShowMessage(SerialCommx.GetPortName() + "未打开", 1000);
        //        button2.Enabled = false;
        //    }
        //    CurrentCOM = comboBox1.SelectedItem.ToString();
        //}
        #endregion



版权声明:本文为LongtengGensSupreme原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。