C#串口通讯+BigEndian+Little-Endian(大端和小端方案)
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 0042foreach (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 4200unicodeBytes = 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; // 波特率:9600serialPort.DataBits = 8; // 数据位数:8serialPort.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, // MODEMWin32_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
C#串口通讯+BigEndian+Little-Endian(大端和小端方案)相关推荐
- 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)
一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...
- 大端和小端存储模式解析
一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一 ...
- mysql是大端小端_大端和小端 - HackerVirus - 博客园
在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过siz ...
- 网络字节码、本地字节码(大端,小端)
大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在 ...
- 一文彻底弄懂大端与小端
一文彻底弄懂大端与小端 1. 端模式起源 端模式(Endian)起源于<格列佛游记>, 书中根据鸡蛋敲开的方式不同将所有人分为2类,从圆头开始敲的人被归为Big Endian,从尖头开始敲 ...
- 大端和小端的判断及转换
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...
- 大端模式小端模式 主机序网络序
1. 主机序 不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序,这个叫做主机序.最常见的有两种: 1. Little endian:将低序字节存储在起始地址. 即小端 ...
- 深入理解计算机大端与小端
大端与小端 在嵌入式开发中,大端(Big-endian)和小端(Little-endian)是一个很重要的概念. MSB与LSB 节序的问题,必然牵涉到两大CPU派系.那就是Motorola的Powe ...
- 使用c语言测试大端和小端,C语言*符号使用及大端法小端法测试
工具:Microsoft Visual C++ 6.0 例子: int a = 1; int* b = &a; C语言规定a表示存储单元中的数据,&a表示存储单元的地址,b存储的就是a ...
最新文章
- MYSQL 部分事务
- ls –al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段!
- 基于奇异值分解(SVD)的图片压缩实践
- 用MS.NET开发三层结构应用程序[转载]
- Python—开始编程
- 转lua解析脚本过程中的关键数据结构介绍
- 精读《手写 SQL 编译器 - 性能优化之缓存》
- 改变权限Linux,Linux chmod改变权限属性命令
- IO前哨站之##File##
- 轻轻松松实现角度转换(弧度度分秒)
- 软件设计师提纲+复习资料整理(上午题)
- 虚拟机linux开启端口 与阿里云服务器开启端口的方法
- Flink SQL CDC 13 条生产实践经验
- Python将经纬度数据转换成浮点数据
- 水晶报表打印出错,未能加载文件或程序集“CrystalDecisions.CrystalReports.Engine, Version=10.5.3700.0
- 记一次Y7000P内存升级(骇客神条套条),让电脑飞起来~
- C和C++编程和学习文档
- Java常见面试题 + 答案
- HTML+CSS【超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站
- 03-iptables-实验
热门文章
- iOS 逆向编程(五)通过 (OpenSSH) Wifi 远程连接登录 iPhone
- C++和C语言求解一个数的阶乘以及多个数的阶乘之和
- 【大数据】数据中台是怎样炼成的?
- 高性能迷你服务器,分享几个关于迷你电脑主机的优缺点
- 爬取manhua.fzdm.com上的妖尾漫画
- [渣翻]从零开始写一个时序数据库
- 超越成功:经理人需提升的十二项自我管理能力
- 攻击JavaWeb应用[2]-CS交互安全
- 关于建立北京市专业技术人员职业资格与职称对应关系的通知
- 海康工业相机Python调用实现拍照