专业的编程技术博客社区

网站首页 > 博客文章 正文

C#程序与单片机通信时,如何自动初始化串口(2)?

baijin 2024-10-31 12:19:23 博客文章 14 ℃ 0 评论

在前文C#程序与单片机通信时,如何自动初始化串口(1)?中介绍了如何注册程序,使用程序能够监听USB插、拔事件。当程序获得这些事件之后,如何确定事件源就是我们关注的那个USB设备呢?

每个USB设备都有他们的生产厂家代码、设备代码等信息,我们可以利用此信息来确定该设备。比如,有一个设备代码如下的USB设备(USB虚拟串口),此值可以从Windows设备管理>USB驱动信息中获取。

Device USB\VID_0483&PID_5740\123456

//定义一个标识字符串
const string VID_STR = @"USB\VID_0483&PID_5740"; 

在前文的Usb_DeviceAdded()函数中,要从系统中获得USB设备信息,并打开相应的串口。C#中要用到System.Management(类似系统设备管理功能),采用命令的方式实现,如下

//搜索所有插拔设备
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_PnPEntity");
//逐个访问
foreach (ManagementObject mo in searcher.Get())
{
 //比较是否正确
 if (0== string.Compare(VID_STR, 0, mo["PNPDeviceID"].ToString(), 0, VID_LEN))
 {
 try
 { 
 //找到对应设备
 m_Port = new SerialPort(mo["DeviceID"].ToString(), 115200, Parity.None, 8, StopBits.One)
 {
 //缓冲区大小
 WriteBufferSize = 1024,
 ReadBufferSize = 1024,
 //超时设定
 ReadTimeout = 2000//ms
	 };
 
 //打开串口
 m_Port.Open();
 IsOpen = m_Port.IsOpen;
 }
 catch
 {
 m_Port.Dispose();
 //如果失败则提示
 throw new ArgumentNullException("Port Open Failed", nameof(m_Port));
 } 
 }
}

同样在检测到USB拔出时,可以在前文的Usb_DeviceRemoved()函数中同样判断该是否存在,如果存在,则不作处理(是其它USB设备拔出),否则,要关闭串口。

想全面了解此话题,请参考前三篇,

C#程序与单片机通信时,如何实现结构体的字节对齐

C#程序与单片机通信时,如何实现结构体转换为字节流

C#程序与单片机通信时,如何自动初始化串口(1)?

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表