本文共 12168 字,大约阅读时间需要 40 分钟。
C#串口通讯
#region 串口 ////// 2 3 4G DTU短信收发说明 /// 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; } } ////// 串口写数据 /// /// /// public static void SerialPortWrite(byte[] data, int len) { try { if (serialPort.IsOpen) { serialPort.Write(data, 0, len); } } catch { } } ////// 串口接收数据 /// /// /// 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) { Liststrs = new List (); 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
转载地址:http://cjmiz.baihongyu.com/