c#串口操作中怎么实时检测到我计算机连接上了串口还是拔掉了串口 c#串口操作中怎么实时检测到我计算机连接上了串口还是拔掉了串口,还要能检测到是COM口几??望高手指导! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HKEY hKey; LONG ret; OSVERSIONINFO osvi; BOOL bOsVersionInfoEx; char keyinfo[100],comm_name[200],ValueName[200], Uart[16]; int i; DWORD sType,Reserved,cbData,cbValueName; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); memset(keyinfo,0,100); strcpy(keyinfo,"HARDWARE\\DEVICEMAP\\SERIALCOMM"); i=0; sType=REG_SZ;Reserved=0; bOsVersionInfoEx =GetVersionEx(&osvi); ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey); if (ret==ERROR_SUCCESS){ if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { for(i=1;i<=128;i++) { sprintf(comm_name,"COM%d",i); m_Uart.AddString(comm_name); } } else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { do { cbData=200;cbValueName=200; memset(comm_name,0,200); memset(ValueName,0,200); ret=RegEnumValue(hKey,i,ValueName,&cbValueName,NULL,&sType,(LPBYTE)comm_name,&cbData); if (strlen(comm_name) > 0) { // 检测出来的串口 } i++; }while (ret==ERROR_SUCCESS); } } RegCloseKey(hKey);通过检测注册表实现,你自己把代码写成C#的吧 楼上的可能会错楼主的意思了,楼主的意思是想动态实时的监测计算机的串口有无设备的插拔。这种方法只能用类似PING的方式实现:程序打开计算机上所有的串口,不停的向串口发送ping命令(此命令类似于网络通信中的心跳包),下位机在收到返回后,按照协议规定的格式响应数据包,程序收到下位机的回复后就可以判断出是否监测出设备,是哪个串口插入了设备了。 2个方法1.通讯协议里定义心跳包,定时检测。2.直接看连续时间是否有串口数据,比如定一个定时器,到时间就提示连接断开,每次进入到DataReceived中断事件的时候重置一次定时器,当连续一个周期没重置,定时器触发,提示断线。 串口并非即插即用设备.串口在释放前只能被绑定一次.心跳线程会占用端口影响通讯,最好还是利用中断等手段来监控串口缓存中的数据流.类似的软件 COMGrasphttp://download.csdn.net/source/1982031 动态实时的监测计算机的串口有无设备的插拔。如果设备有变动,windows 会发送消息 WM_DEVICECHANGE。 DataGridView 按钮列,隐藏某些行的按钮 请问结构是按值传递,那么类是?根据情况来按值或引用传递么? 请问linq和存储过程效率一样吗? DateList排序问题 是否是.net的一个bug OleDbDataAdapter 怎么更新不了数据库? 新手上路,求好书!推荐好书人人有分! 十分复杂的问题疯狂给分 C#程序打包问题 将对象序列化时问题 C# WinForm软件设计,如何管理操作过程中的各种状态,事件 如何快速监控另一个命令行程序的标准输出?
HKEY hKey;
LONG ret;
OSVERSIONINFO osvi;
BOOL bOsVersionInfoEx;
char keyinfo[100],comm_name[200],ValueName[200], Uart[16];
int i;
DWORD sType,Reserved,cbData,cbValueName;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
memset(keyinfo,0,100);
strcpy(keyinfo,"HARDWARE\\DEVICEMAP\\SERIALCOMM");
i=0; sType=REG_SZ;Reserved=0;
bOsVersionInfoEx =GetVersionEx(&osvi);
ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey);
if (ret==ERROR_SUCCESS){
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
for(i=1;i<=128;i++)
{
sprintf(comm_name,"COM%d",i);
m_Uart.AddString(comm_name);
}
}
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
do
{
cbData=200;cbValueName=200;
memset(comm_name,0,200);
memset(ValueName,0,200);
ret=RegEnumValue(hKey,i,ValueName,&cbValueName,NULL,&sType,(LPBYTE)comm_name,&cbData);
if (strlen(comm_name) > 0)
{
// 检测出来的串口
}
i++;
}while (ret==ERROR_SUCCESS);
}
}
RegCloseKey(hKey);
通过检测注册表实现,你自己把代码写成C#的吧
这种方法只能用类似PING的方式实现:
程序打开计算机上所有的串口,不停的向串口发送ping命令(此命令类似于网络通信中的心跳包),下位机在收到返回后,按照协议规定的格式响应数据包,程序收到下位机的回复后就可以判断出是否监测出设备,是哪个串口插入了设备了。
1.通讯协议里定义心跳包,定时检测。
2.直接看连续时间是否有串口数据,比如定一个定时器,到时间就提示连接断开,每次进入到DataReceived中断事件的时候重置一次定时器,当连续一个周期没重置,定时器触发,提示断线。
串口在释放前只能被绑定一次.心跳线程会占用端口影响通讯,最好还是利用中断等手段来监控串口缓存中的数据流.类似的软件 COMGrasp
http://download.csdn.net/source/1982031
动态实时的监测计算机的串口有无设备的插拔。如果设备有变动,windows 会发送消息 WM_DEVICECHANGE。