# C# 学习笔记(13)自己的串口助手
## UI界面
>界面部分参考野火串口助手,自己拖控件拖一个即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210630200615106.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM3ODMxOQ==,size_16,color_FFFFFF,t_70)
## 功能实现
### 扫描串口
1. 方法一 使用串口自带的get函数
>比较简单实用
```csharp
SerialPort.GetPortNames();
```
2. 方法二 扫描设备管理器
>如果开发特定设备具有特定串口名,可以扫描设备管理器获取串口全名,筛选含有特定名称的串口
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210630201129190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM3ODMxOQ==,size_16,color_FFFFFF,t_70)
```csharp
/// <summary>
/// 获取COM口 从设备管理器获取COM口详细信息,筛选后返回符合要求的COM口(筛选包涵 str 字符串的COM口)
/// </summary>
/// <returns></returns>
public string[] GetComName()
{
List<string> coms = new List<string>();
string str = "COM"; //筛选关键字 可自行修改
try
{
//搜索设备管理器中的所有条目
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity"))
{
var hardInfos = searcher.Get();
foreach (var hardInfo in hardInfos)
{
if (hardInfo.Properties["Name"].Value != null)
{
if (hardInfo.Properties["Name"].Value.ToString().Contains("(COM"))
{
coms.Add(hardInfo.Properties["Name"].Value.ToString());
}
}
}
searcher.Dispose();
}
List<string> strs = new List<string>();
foreach (string portName in coms)
{
if (portName.Contains(str))
{
strs.Add(portName.Substring(portName.IndexOf("(COM")).Replace('(', ' ').Replace(')', ' ').Trim());
}
}
return strs.ToArray();
}
catch
{
return null;
}
}
```
### 串口热插拔
>当使用串口时,如果串口断开连接,立即关闭串口,当有新的串口插入,刷新串口列表
```csharp
public const int WM_DEVICE_CHANGE = 0x219; //设备改变
public const int DBT_DEVICEARRIVAL = 0x8000; //设备插入
public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //设备移除
/// <summary>
/// USB热插拔支持
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
switch (m.WParam.ToInt32()) //判断消息类型
{
case DBT_DEVICEARRIVAL:
{
if (serialPortCOM.IsOpen)
{
}
else
{
this.BeginInvoke(new Action(() => {
UpdateSerialName(cmbSerialName, GetComName(), cmbSerialName.Text);
}));
}
}
break;
case DBT_DEVICE_REMOVE_COMPLETE:
{
if (serialPortCOM.IsOpen)
{
}
else
{
this.BeginInvoke(new Action(() => {
CloseSerialPort();
UpdateSerialName(cmbSerialName, GetComName(), cmbSerialName.Text);
}));
}
}
break;
}
base.WndProc(ref m);
}
```
### 接收显示
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210630202703537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM3ODMxOQ==,size_16,color_FFFFFF,t_70)
```csharp
/// <summary>
/// 串口接收回调函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPortCOM_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//50ms处理一次串口接收
Thread.Sleep(50);
if(!serialPortCOM.IsOpen)
{
return;
}
Byte[] recvByteTemp = new Byte[serialPortCOM.BytesToRead];
serialPortCOM.Read(recvByteTemp, 0, recvByteTemp.Length);
//异步处理 防止UI界面卡死
this.BeginInvoke(new Action<byte[]>((byte[] data)=> { DisplayRxInfo(data); }), recvByteTemp);
}
/// <summary>
/// 接收处理
/// </summary>
/// <param name="data">串口接收字节数据</param>
private void DisplayRxInfo(byte[] data)
{
try
{
if (ckbStopDisPlay.Checked)
{
//停止显示
return;
}
string str = "";
if (ckbRxHex.Checked)
{
//十六进制显示
str = MyConver.ByteToHex(data);
if (ckbTimeStamp.Checked)
{
//时间戳
str = str.Replace("0A", "0A \r\n[" + DateTime.Now.Millisecond.ToString() + "]->>>");
}
}
else
{
str = RxEncoding.GetString(data);
if (ckbTimeStamp.Checked)
{
//时间戳
str = str.Replace("\n", "\n[" + DateTime.Now.Millisecond.ToString() + "]->>>");
}
}
if (ckbAutoClear.Checked && txbRx.TextLength > 4096)
{
//自动清除
txbRx.Text = "";
}
txbRx.AppendText(str);
if (ckbSaveRxFile.Checked)
{
//将接收信息写入文件
File.AppendAllText(CurrentFilePath, str);
}
RxCounter += data.Length;
}
catch
{
}
}
```
### 进制转换
```csharp
public static class MyConver
{
/// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string ByteToHex(byte[] data)
{
StringBuilder stringBuilder = new StringBuilder(1024);
for (int i = 0; i < data.Length; i++)
{
stringBuilder.Append(data[i].ToString("X2") + " ");
}
return stringBuilder.ToString();
}
/// <summary>
/// hex string字节数组转byte
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] HexToByte(string str)
{
str = str.Replace(" ", "");
if (str.Length % 2 != 0)
{
str = str.Insert(str.Length - 1, "0");
}
byte[] bytesHex = new byte[str.Length / 2];
try
{
for (int i = 0; i < str.Length / 2; i++)
{
bytesHex[i] = Convert.ToByte(str.Substring(2 * i, 2), 16);
}
}
catch
{
}
return bytesHex;
}
}
```
### 保存配置信息
>c# 提供了setting文件,可以十分方便的保存配置信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210630202146269.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM3ODMxOQ==,size_16,color_FFFFFF,t_70)
* 保存时一定要记得使用 Properties.Settings.Default.Save();保存
```csharp
/// <summary>
/// 加载参数
/// </summary>
private void LoadParam()
{
UpdateSerialName(cmbSerialName, GetComName(), Properties.Settings.Default.serialPortName);
//UpdateSerialName(cmbSerialName, SerialPort.GetPortNames(), Properties.Settings.Default.serialPortName);
cmbBaudRate.Text = Properties.Settings.Default.serialPortBaud;
cmbParity.SelectedIndex = cmbParity.Items.IndexOf(Properties.Settings.Default.serialPortParity);
cmbDataBits.Text = Properties.Settings.Default.serialPortDataBits;
cmbStopBits.T
没有合适的资源?快使用搜索试试~ 我知道了~
CSharp-COM-master.zip
共30个文件
cs:12个
png:4个
ico:2个
需积分: 0 0 下载量 148 浏览量
2021-07-16
21:32:15
上传
评论
收藏 171KB ZIP 举报
温馨提示
C# 串口助手 支持多行发送 波形显示
资源推荐
资源详情
资源评论
收起资源包目录
CSharp_COM-master.zip (30个子文件)
CSharp_COM-master
bin
Debug
CSharp_串口助手.exe.config 6KB
CSharp_串口助手.exe 113KB
CSharp_串口助手.pdb 132KB
MyConver.cs 1KB
CSharp_串口助手.csproj 5KB
串口助手.Designer.cs 87KB
串口助手.cs 26KB
Program.cs 516B
Settings.cs 1KB
多条发送.cs 6KB
串口助手.resx 33KB
CSharp_串口助手.sln 1KB
MyDataGridViewDoubleBuffer.cs 844B
image.ico 17KB
波形显示.cs 21KB
.gitignore 6KB
MySerializeToXml.cs 2KB
ico
清除.png 2KB
历史记录.png 14KB
image.ico 17KB
打开.png 5KB
另存为.png 2KB
README.md 13KB
App.config 6KB
.gitattributes 2KB
Properties
Resources.resx 7KB
Settings.settings 6KB
AssemblyInfo.cs 1KB
Settings.Designer.cs 19KB
Resources.Designer.cs 4KB
共 30 条
- 1
资源评论
不咸不要钱
- 粉丝: 1499
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功