讨论WDM驱动程序和应用程序的通信方法

Leo 2003-03-26 09:44:46
我现在所实现的驱动程序和应用程序的通信方法:
1.用注册表.通过检测注册表的内容可以实现此目的.缺点是DRIVER在读写注册表受到IRQL的限制.
2.通过磁盘文件.缺点是DRIVER在读写文件受到IRQL的限制,共享冲突.
3.用应用程序DeviceIoControl.通过设备链接名来呼叫驱动程序

我现在所想到的驱动程序和应用程序的通信方法:
1.信号量,互斥量.难点是如何传递较多的信息
2.共用内存.内核态和用户态内存地址如何相互应射


抛砖引玉,如果你有好的解决方法或好的想法不妨说出来,大家讨论讨论,欢迎UP.
...全文
304 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leo 2003-04-21
  • 打赏
  • 举报
回复
转帖
: LornWolf(绝地苍狼) ( )

影射核心内存到用户模式进程

映射由核心模式分配的缓冲到一个特定用户进程的虚拟地址空间,这种方法非常简单。并能使驱动程序保留对这种内存最大控制权。

驱动程序可以使用任意标准的方法来分配要共享的缓冲,如果没有特殊的要求并且大小适度,可以将它分配在非分页池中。

驱 动 程 序 使 用 IoAllocateMdl() 分 配 一 个 MDL 来 描 述 这 个 缓 冲, 然 后 调 用MmBuildMdlForNonPagedPool()。这个函数修改MDL以描述内核模式中一个非分页内存区域。
当用来描述共享缓冲的MDL建立起来以后,驱动程序现在可以准备将缓冲映射到用户进程的地 址空间了,由MmMapLockedPagesSpecifyCache() 这个函数完成。

你必须要在你想要映射共享缓冲的进程上下文环境中调用MmMapLockedPagesSpecifyCache(),并且指定AccessMode参数为UserMode。这个函数返回由MDL映射的用户态虚拟地址。 驱动程序可以把这个值作为用户程序发送IOCTL请求时的返回值返回给用户程序。

PVOID
CreateAndMapMemory()
{
PVOID buffer;
PMDL mdl;
PVOID userVAToReturn;

//
// Allocate a 4K buffer to share with the application
//

buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 'MpaM');

if(!buffer) {
return(NULL);
}

//
// Allocate and initalize an MDL that describes the buffer
//

mdl = IoAllocateMdl(buffer,

PAGE_SIZE,

FALSE,

FALSE,

NULL);

if(!mdl) {
ExFreePool(buffer);
return(NULL);
}

//
// Finish building the MDL -- Fill in the "page portion"
//

MmBuildMdlForNonPagedPool(mdl);

#if NT_40

//
// Map the buffer into user space
//
// NOTE: This function bug checks if out of PTEs
//

userVAToReturn = MmMapLockedPages(mdl, UserMode);

#else

//
// The preferred V5 way to map the buffer into user space
//

userVAToReturn =

MmMapLockedPagesSpecifyCache(mdl, // MDL

UserMode, // Mode

MmCached, // Caching

NULL, // Address

FALSE, // Bugcheck?

NormalPagePriority); // Priority

//
// If we get NULL back, the request didn't work.
// I'm thinkin' that's better than a bug check anyday.
//

if(!userVAToReturn) {
IoFreeMdl(mdl);
ExFreePool(buffer);
return(NULL);
}


#endif

//
// Store away both the mapped VA and the MDL address, so that
// later we can call MmUnmapLockedPages(StoredPointer, StoredMdl)
//

StoredPointer = userVAToReturn;
StoredMdl = mdl;

DbgPrint("UserVA = 0x%0x\n", userVAToReturn);

return(userVAToReturn);

}

在映射完共享缓冲以后,可以在任意进程上下文环境中对它进行访问,并且可以在提升的IRQL上访问(因为是在非分页内存中)。

如果使用这种方法,有一个情况必须注意:你必须保证驱动程序提供一个方法在用户程序退出的时候来取消映射。


Leo 2003-04-03
  • 打赏
  • 举报
回复
谢谢 slwqw2(亚洲之鹰)

你说的方法很好,谢谢!
另外如何实现在关闭设备后,还能与DRIVER通信,例如共享内存.
Leo 2003-04-03
  • 打赏
  • 举报
回复
To ArthurTu(猫王)
1、不清楚你的服务程序是干什么,非要打开设备才能接收数据?
------------------------------------------------------------------------
对于从DRIVER读取数据或PENDING时,需要打开设备


2、“实时”?到哪种程度?Windows下谈不上什么实时。
--------------------------------------------------------------------------
要求像鼠标和键盘一样实时

3、2K下user mode的app不大会影响OS的运作,出错了大不了OS就kill他,driver不出错就好。你是说“APP开启的时候不能阻止系统正常重启或关机.”?
----------------------------------------------------------------------------
如果DeviceIoControl在系统关机时不能返回(例如PENDING IRP),则系统不能正常关机.


danielxuao 2003-04-03
  • 打赏
  • 举报
回复
:)
ArthurTu 2003-04-02
  • 打赏
  • 举报
回复
我是说“一直”工作在dispatch level的DRIVER。

Probably the simplest mechanism is sharing one or more named events. When an application calls CreateEvent(), the named event is automatically created in the Object Manager’s BaseNamedObjects directory. A driver can open, and share, these event objects by calling IoCreateNotificationEvent(), and specifying the same name as was specified in user mode (except, of course, specifying “\BaseNamedObjects” as the directory).
ArthurTu 2003-04-02
  • 打赏
  • 举报
回复
slwqw2(亚洲之鹰)
你的出现应该可以少浪费好多口水:)
vcmfc 2003-04-02
  • 打赏
  • 举报
回复
为什么你的那些处理一定要在dispatch,DPC回调,workitem等,都可以延期到pass level,全在pass level,如果是在dispatch,APP如何访问你?,在如此高的IRQL,APP根本就不可能访问。


OSR:2002:

Sharing is Caring -- Sharing Events Between Kernel-User Mode


用心搜索..............


你有没有看过全部的inside nt????,至少我全看过,有些虽然不懂,但有个印象,一需要我就知道在哪儿查...........


不好意思,口气是不太友好,主要近来太忙了,问题一大堆,烦死了..........


在北京.................
slwqw2 2003-04-02
  • 打赏
  • 举报
回复
1、EVENT和PKEVENT的转换。

case IO_REFERENCE_EVENT:

hEvent = (HANDLE) irpStack->
Parameters.DeviceIoControl.Type3InputBuffer;

status = ObReferenceObjectByHandle(hEvent,
GENERIC_ALL,
NULL,
KernelMode,
&gpEventObject,
&objHandleInfo);
the gpEventObject is a PRKEVENT object, so we can use KeEventXXX and KeWaitForXXX to operate it.

当事件发生时,置信号

KeSetEvent(gpEventObject, 0, FALSE);

当不再需要事件对象时:

case IO_DEREFERENCE_EVENT:
if(gpEventObject)
ObDereferenceObject(gpEventObject);

2、我曾经做过进程启动实时监视的程序,我是这样做的:

[1]、在WDM中建立一个具有名字的Event对象,如下:

//
// 建立通知事件
//
UNICODE_STRING NotifyEventName;
HANDLE hTempEvent;

RtlInitUnicodeString(¬ifyEventName,L"\\BaseNamedObjects\\ProcMonEvent");
pDeviceExtension->ProcessEvent = IoCreateNotificationEvent(¬ifyEventName,&hTempEvent);
KeClearEvent(pDeviceExtension->ProcessEvent);

[2]、在App中使用OpenEvent()来打开那个Event,并建立一个新的线程来监视那个Event,如下:

//
// StartMonitor
//
bool __fastcall TThreadMonitor::StartMonitor()
{
//
// Stop Monitor first
//
if(IsMonitoring)
{
StopMonitor();
}

hEvent = OpenEvent(SYNCHRONIZE,false,EventName.c_str());
if(hEvent == NULL)
{
return false;
}

///
DWORD dwTempThreadId;

hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MonitorThread,
(LPVOID)this,0,&dwTempThreadId
);

IsMonitoring = (hThread != NULL) ;

return IsMonitoring;
}
//---------------------------------------------------------------------------
//
// 有新的进程建立时,WDM触发事件。
//
DWORD WINAPI MonitorThread(TThreadMonitor *CurrentThreadMonitor)
{
DWORD dwResult;

while(true)
{
dwResult = WaitForSingleObject(CurrentThreadMonitor->hEvent,INFINITE);

//
// 停止监视
//
if(!CurrentThreadMonitor->IsMonitoring)
{
break;
}

if(dwResult == WAIT_OBJECT_0)
{
CurrentThreadMonitor->ProcessMonitor->ProcessCreated();
}
}

//
// 在这里释放资源
//
CloseHandle(CurrentThreadMonitor->hEvent);
CloseHandle(CurrentThreadMonitor->hThread);

CurrentThreadMonitor->hEvent = NULL;
CurrentThreadMonitor->hThread = NULL;

return 1;
}
//---------------------------------------------------------------------------


[3]、当WDM需要通知那个APP时,它调用KeSetEvent()触发事件,这样APP也就得到通知了,可以做一些事了........这样算实时吗??????????
Leo 2003-04-02
  • 打赏
  • 举报
回复
工作在dispatch level的DRIVER很多,如声卡,鼠标,键盘,硬盘,光驱....
即使一般的DRIVER,工作在dispatch level的情况也很多,如DPC,COMPLETEROUTE,SPINLOCK...
Leo 2003-04-02
  • 打赏
  • 举报
回复
to ArthurTu(猫王)
用event的方法,能贴出相关代码吗?
app产生的event是handle,但DRIVER里用的是PRKEVENT,两个声明完全不同.强制转换当然可以,但会引起蓝屏(0X0E).你是怎么做的??
洗耳恭听!!
ArthurTu 2003-04-02
  • 打赏
  • 举报
回复
因此,服务程序不能一直打开设备等待数据,而需要实时的通信方式,占用系统资源少,不能影响到系统的正常运做.

1、不清楚你的服务程序是干什么,非要打开设备才能接收数据?
2、“实时”?到哪种程度?Windows下谈不上什么实时。
3、2K下user mode的app不大会影响OS的运作,出错了大不了OS就kill他,driver不出错就好。你是说“APP开启的时候不能阻止系统正常重启或关机.”?
Leo 2003-04-02
  • 打赏
  • 举报
回复
我所做的DRIVER基本上是鼠标驱动,鼠标驱动的回调函数(用于取数据)是工作在DISPATCH LEVEL.由于我的DRIVER不仅把数据传给系统,而且要传给我们特定的服务程序(USER MODE),
因此,服务程序不能一直打开设备等待数据,而需要实时的通信方式,占用系统资源少,不能影响到系统的正常运做.

其实上面的问题我已经解决,但总觉得不够好,所以开贴来让大家讨论这么一个普遍性的问题!
感谢大家发表高见,我会随时开贴给分.
Leo 2003-04-02
  • 打赏
  • 举报
回复
ArthurTu(猫王) & vcmfc(【痛苦的虫虫】)
谢谢你的指点,因为需要更多的人关注"WDM驱动程序和应用程序的通信方法"话题,所以重新开贴给分,请到
http://expert.csdn.net/Expert/topic/1609/1609281.xml?temp=.342663
取分.
ArthurTu 2003-04-02
  • 打赏
  • 举报
回复
我所知道的也就是"Sharing Memory Between Drivers and Applications"。不知有什么局限性不能满足你的要求?

我们所讨论的问题是:
APP应能实时的从DRIVER取得数据(如果DRIVER有数据上传),但DRIVER上传的数据在时间和数量上是不确定的.DRIVER工作在DISPATCH_LEVEL.要求占用系统资源尽量少.APP开启的时候不能阻止系统正常重启或关机.
------------------------
用event的方法不能满足你的要求吗?够了吧?

“DRIVER工作在DISPATCH_LEVEL”,什么driver,居然能一直工作在dispatch level?“实时的从DRIVER取得数据”,这个“实时”怎么定义?
Leo 2003-04-01
  • 打赏
  • 举报
回复
to ArthurTu(猫王) :

我应该在DISPATCH_LEVEL如何访问PAGEG MEMORY
-------------------------------------------
不能

那么你所谓的共享内存是如何实现的?
Leo 2003-04-01
  • 打赏
  • 举报
回复
to vcmfc(【痛苦的虫虫】)

"你不会强制转换??????"



强制转换当然可以,但会引起蓝屏(0X0E).你是怎么做的,不妨把相关的代码贴出来,大家看看你说的是否正确.
另外你所说的OSR的文章是不是这一篇"Sharing Memory Between Drivers and Applications".这篇文章所说的方法有一些局限性.

我们所讨论的问题是:
APP应能实时的从DRIVER取得数据(如果DRIVER有数据上传),但DRIVER上传的数据在时间和数量上是不确定的.DRIVER工作在DISPATCH_LEVEL.要求占用系统资源尽量少.APP开启的时候不能阻止系统正常重启或关机.




ArthurTu 2003-04-01
  • 打赏
  • 举报
回复
vcmfc和ArthurTu两位,我在驱动开发网也经常看到你们,想问一个私人问题,你们现在在什么类型的公司工作阿,待遇如何?呵呵呵呵呵
-------------------------------------------
刚刚下岗。。。


我应该在DISPATCH_LEVEL如何访问PAGEG MEMORY
-------------------------------------------
不能
Leo 2003-03-31
  • 打赏
  • 举报
回复
to vcmfc(【痛苦的虫虫】)

"不用实现,不要忘了,DeviceIoControl不是有个屁参数让你传递事件,实在不行,就分两次,第一次,你APP创建一个event,将句柄传入driver,driver里保存,当driver 需要通知APP,激活事件,app的线程就wait这个事件,一激活,就干活。"

先谢谢了,这个方法我开始提问时就想到了,但一直没有实现.
app产生的event是handle,但DRIVER里用的是PRKEVENT,两个声明完全不同,你是怎么做的?是用DDK写APP吗?这样又会引起编程不必要的难度.


to ArthurTu(猫王)
"我想不会有人傻到用1、2的方法吧?
觉得一般都是用event,app开个线程等。或共享内存。
registry在某些场合也挺有用的。比如app和driver还没有建立联系的时候,就可以通过registry来传递一些简单的数据。"

关于共享内存你是如何实现的?我应该在DISPATCH_LEVEL如何访问PAGEG MEMORY





火焰射手 2003-03-31
  • 打赏
  • 举报
回复
vcmfc和ArthurTu两位大虾,我在驱动开发网也经常看到你们,想问一个私人问题,你们现在在什么类型的公司工作阿,待遇如何?呵呵呵呵呵
vcmfc 2003-03-31
  • 打赏
  • 举报
回复
最后说:

search osr的文章,里面有两篇就是专门讲这个主题的,大哥,好好看一下好吗!!!!!
加载更多回复(10)
Visual C++/Turbo C串口通信编程实践及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信编程 12 第2章 多线程串口编程工具cserialport类 16 2.1 cserialport类的功能及成员函数介绍 16 2.2 应用cserialport类编制基于对话框的应用程序 30 2.3 应用cserialport类编制基于单文档的应用程序 35 2.4 对cserialport类的改进 40 2.4.1 改进一:ascii文本和二进制数据发送方式兼容 40 2.4.2 改进二:也许能解决内存泄漏 43 2.4.3 改进三:彻底关闭串口,释放串口资源 44 第3章 控件mscomm串口编程 46 3.1 mscomm控件介绍 46 3.1.1 vc中应用mscomm控件编程步骤 46 3.1.2 mscomm控件串行通信处理方式 47 3.1.3 mscomm 控件的属性说明 48 3.1.4 mscomm控件错误信息 55 3.2 使用mscomm控件的几个疑难问题 56 3.2.1 使用variant 和safearray 数据类型从串口读写数据 56 .3.2.2 mscomm控件能离开对话框独立存在吗 59 3.2.3 如何发送接收ascii值为0和大于128的字符 60 3.2.4 在同一程序中用mscomm控件控制多个串口的具体操作方法 62 3.2.5 解决使用控件编程时程序占用的内存会不断增大的问题 62 3.2.6 在mscomm控件串口编程时遇到的其他问题 63 3.3 在基于单文档(sdi)程序中应用mscomm控件 63 3.4 应用mscomm控件控制多个串口实例 69 3.5 串口与modem拨号应用简例 76 3.5.1 创建工程 76 3.5.2 代码分析 78 3.5.3 应用 85 第4章 windows api串口编程 87 4.1 windows api串口编程概述 87 4.2 api串口编程中用到的结构及相关概念说明 89 4.2.1 dcb(device control block)结构 89 4.2.2 超时设置commtimeouts结构 92 4.2.3 overlapped异步i/o重叠结构 94 4.2.4 通信错误与通信设备状态 95 4.2.5 串行通信事件 96 4.3 windows api串行通信函数 97 4.4 win32 api串口通信编程的一般流程和特殊实例 116 4.4.1 win32 api串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步i/o读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 cserialport类中的api函数编程应用剖析 119 4.6 win32 api串口编程tty(虚拟终端)实例 128 4.6.1 建立程序工程 128 4.6.2 建立串口设置对话框 129 4.6.3 编写ctermdoc类的相关代码 132 4.6.4 小结 141 4.6.5 在ctermview类中字添加符键入处理代码与串口接收处理代码 142 第5章 串口调试助手v2.2编程 147 5.1 建立scomm程序工程实现界面功能 147 5.2 串口的初始化及关闭 150 5.3 串口数据的发送与接收及十六进制数据的处理 151 5.3.1 十六进数据发送处理 152 5.3.2 手动发送处理 152 5.3.3 自动发送处理 153 5.3.4 接收处理及十六进制显示 154 5.4 其他辅助功能的实现 156 5.4.1 接收数据的文件保存 156 5.4.2 实现小文件发送 158 5.4.3 图钉按钮功能使程序能浮在最上层 161 5.4.4 对话框动画图标的实现 162 5.4.5 超链接功能的实现 164 5.4.6 如何打开帮助网页文件 164 第6章 dos环境下的turbo c串口编程及通用实例gserial类 168 6.1 pc机异步通信适配器8250及其编程操作 169 6.1.1 ins8250内部寄存器及其选择方式 169 6.1.2 波特率设置 169 6.1.3 数据位、奇偶校验、停止位等数据格式设置 170 6.1.4 查询i/o方式相关设置 171 6.1.5 中断i/o通信方式相关设置 171 6.1.6 modem寄存器 172 6.2 comrxtx程序实例 173 6.3 通用实例程序gserial类 175 6.4 用gserial类控制多串口 186 6.5 多串口编程pc机高号中断8259a可编程中断控制器的控制 195 第7章 串口通信用户层协议的编制与数据处理方法 197 7.1 通信协议的编制 197 7.1.1 为什么要编制用户通信协议 197 7.1.2 串口通信中用户层协议编制原则 199 7.1.3 在串口通信中几种常用的用户层协议 200 7.2 串口通信数据包处理方法编程实例 202 7.2.1 编程任务 203 7.2.2 编程步骤 203 7.2.3 程序测试 216 第8章 单片机串口通信 218 8.1 单片机串口硬件系统及c51程序开发 218 8.1.1 较典型的单片机硬件系统实例 218 8.1.2 c51语言及程序简介 220 8.1.3 开发c51程序的利器keil c51 uvision2及串口程序仿真 221 8.2 c51单片机串口通信程序实例 226 8.2.1 实例一 226 8.2.2 实例二 227 第9章 串口与网络结合的解决方案及编程 230 9.1 串口与网络结合的硬件解决方案 230 9.2典型串口与联网的设备 231 9.2.1 nport5400系列产品的特点 231 9.2.2 nport 5400系列产品的典型应用介绍 233 9.2.3 nport5400系列产品的设置与编程测试 235 9.3 与access数据库结合的串口通信实例 237 9.3.1 微机网络检测系统说明 237 9.3.2 创建odbc数据源 238 9.3.3 创建工程 239 9.3.4 程序简介 244 9.4 与winsock结合的串口通信实例 246 9.4.1 客户端应用程序 247 9.4.2 服务器应用程序 252 9.5 在已经编好的串口通信程序中加入网络通信功能 260 9.5.1参照mfc appwizard创建winsockets程序 261 9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程 266 10.1.2 at命令收发短消息实例 273 10.1.3 "实时"接收短消息的方法 281 10.1.4 用串口收发sms短信编程的一些讨论 283 10.2 计算机与rabbit 2000嵌入式系统通信编程实例 286 10.2.1 rabbit 2000微处理器介绍 286 10.2.2 动态c(dynamic c)语言介绍 287 10.2.3 某车载无线调度系统实例介绍 288 10.3 计算机与plc通信程序实例 294 10.4 matlab环境串口编程通信实例 295 10.4.1 matlab串口类serial应用 295 10.4.2 通过串口使matlab simulink与下位机通讯进行控制 299 10.4.3 xpc目标环境下串口通信实现 299 第11章 串口通信基本概念及标准 302 11.1 串口通信基本概念 302 11.1.1 串行通信概述 302 11.1.2 单工、半双工和全双工的定义 305 11.1.3 同步传送与异步传送 306 11.1.4 串行通信协议 306 11.2 rs-232-c串口标准 309 11.2.1 rs-232-c标准 309 11.2.2 rs-232-c串行通信接线实例 312 11.3 rs-422/485串口标准 314 11.3.1 概述 314 11.3.2 rs-422与rs-485串行接口标准 315 11.3.3 rs-422与rs-485的网络安装注意要点 317 11.3.4 rs-232、rs422、rs485电气参数对比 318 11.4 串口调试注意事项 318 11.5 常用数据校验法 318 11.5.1 奇偶校验 318 11.5.2 循环冗余码校验 319 11.6 串口连接和tcp/ip连接对比 320 11.7 现场总线与rs-232、rs-485的本质区别 320 11.8 modem通信技术 320 11.8.1 modem的基本工作原理 320 11.8.2 modem的功能 322 11.8.3 modem的分类 322 11.8.4 modem的安装 324 11.8.5 modem v.92标准介绍 326 11.8.6 modem的速度 327 11.8.7 modem优化方法 328 11.8.8 modem命令/at命令 329 第12章 不占用串口的串口数据捕捉 338 12.1 驱动程序的基本概念:vxd与wdm 338 12.1.1 虚拟设备驱动程序vxd 338 12.1.2 win32驱动程序模型wdm 340 12.1.3 在不同操作系统下选用哪种驱动程序模式 341 12.2 vxd示例程序介绍--vtoolsd中的commhook 341 12.3 串口数据捕捉实例程序 351 12.3.1 编程任务 351 12.3.2 编程步骤 351 12.4 虚拟串口简介 364 附录a turbo c说明 366 附录b ascii码表 376
书名:《Visual C++/Turbo C串口通信编程实践》(电子工业出版社.龚建伟.熊光明)。 内容简介 本书从编程实践的角度详细介绍了Windows环境下和DOS环境下的串口通信的基本方法,并根据当前串口与网络结合发展的趋势,介绍了串口与网络TCP/IP、远程控制与监测相结合的一些解决方案和编程要点。由于编程步骤详尽,初学Visual C++/C(甚至是以前完全没有接触过Visual C++)的读者也能很快编写出Visual C++的串口通信程序。本书配光盘,书中实例源程序和相关资料可在对应章节的文件夹中找到。 本书是从事串口及网络通信的技术人员和学习者的极佳参考资料,也可以作为数据通信课程的辅助教材。 作者简介 龚建伟,工学博士,目前在北京理工大学从事科研究与教学工作。主要从事计算机控制技术、顺人和智慧能车辆技术、数据通信技术的研究。 目录 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验Windows环境下的Visual C++串口通信编程 4 1.3 体验DOS环境下Turbo C串口通信编程 12 第2章 多线程串口编程工具CSerialPort类 16 2.1 CSerialPort类的功能及成员函数介绍 16 2.2 应用CSerialPort类编制基于对话框的应用程序 30 2.3 应用CSerialPort类编制基于单文档的应用程序 35 2.4 对CSerialPort类的改进 40 2.4.1 改进一:ASCII文本和二进制数据发送方式兼容 40 2.4.2 改进二:也许能解决内存泄漏 43 2.4.3 改进三:彻底关闭串口,释放串口资源 44 第3章 控件MSComm串口编程 46 3.1 MSComm控件介绍 46 3.1.1 VC中应用MSComm控件编程步骤 46 3.1.2 MSComm控件串行通信处理方式 47 3.1.3 MSComm 控件的属性说明 48 3.1.4 MSComm控件错误信息 55 3.2 使用MSComm控件的几个疑难问题 56 3.2.1 使用VARIANT 和SAFEARRAY 数据类型从串口读写数据 56 3.2.2 MSComm控件能离开对话框独立存在吗 59 3.2.3 如何发送接收ASCII值为0和大于128的字符 60 3.2.4 在同一程序中用MSComm控件控制多个串口的具体操作方法 62 3.2.5 解决使用控件编程时程序占用的内存会不断增大的问题 62 3.2.6 在MSComm控件串口编程时遇到的其他问题 63 3.3 在基于单文档(SDI)程序中应用MSComm控件 63 3.4 应用MSComm控件控制多个串口实例 69 3.5 串口与MODEM拨号应用简例 76 3.5.1 创建工程 76 3.5.2 代码分析 78 3.5.3 应用 85 第4章 Windows API串口编程 87 4.1 Windows API串口编程概述 87 4.2 API串口编程中用到的结构及相关概念说明 89 4.2.1 DCB(Device Control Block)结构 89 4.2.2 超时设置COMMTIMEOUTS结构 92 4.2.3 OVERLAPPED异步I/O重叠结构 94 4.2.4 通信错误与通信设备状态 95 4.2.5 串行通信事件 96 4.3 Windows API串行通信函数 97 4.4 Win32 API串口通信编程的一般流程和特殊实例 116 4.4.1 Win32 API串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步I/O读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 CSerialPort类中的API函数编程应用剖析 119 4.6 Win32 API串口编程TTY(虚拟终端)实例 128 4.6.1 建立程序工程 128 4.6.2 建立串口设置对话框 129 4.6.3 编写CTermDoc类的相关代码 132 4.6.4 小结 141 4.6.5 在CTermView类中字添加符键入处理代码与串口接收处理代码 142 第5章 串口调试助手V2.2编程 147 5.1 建立SCOMM程序工程实现界面功能 147 5.2 串口的初始化及关闭 150 5.3 串口数据的发送与接收及十六进制数据的处理 151 5.3.1 十六进数据发送处理 152 5.3.2 手动发送处理 152 5.3.3 自动发送处理 153 5.3.4 接收处理及十六进制显示 154 5.4 其他辅助功能的实现 156 5.4.1 接收数据的文件保存 156 5.4.2 实现小文件发送 158 5.4.3 图钉按钮功能使程序能浮在最上层 161 5.4.4 对话框动画图标的实现 162 5.4.5 超链接功能的实现 164 5.4.6 如何打开帮助网页文件 164 第6章 DOS环境下的Turbo C串口编程及通用实例GSerial类 168 6.1 PC机异步通信适配器8250及其编程操作 169 6.1.1 INS8250内部寄存器及其选择方式 169 6.1.2 波特率设置 169 6.1.3 数据位、奇偶校验、停止位等数据格式设置 170 6.1.4 查询I/O方式相关设置 171 6.1.5 中断I/O通信方式相关设置 171 6.1.6 MODEM寄存器 172 6.2 COMRXTX程序实例 173 6.3 通用实例程序GSerial类 175 6.4 用GSerial类控制多串口 186 6.5 多串口编程PC机高号中断8259A可编程中断控制器的控制 195 第7章 串口通信用户层协议的编制与数据处理方法 197 7.1 通信协议的编制 197 7.1.1 为什么要编制用户通信协议 197 7.1.2 串口通信中用户层协议编制原则 199 7.1.3 在串口通信中几种常用的用户层协议 200 7.2 串口通信数据包处理方法编程实例 202 7.2.1 编程任务 203 7.2.2 编程步骤 203 7.2.3 程序测试 216 第8章 单片机串口通信 218 8.1 单片机串口硬件系统及C51程序开发 218 8.1.1 较典型的单片机硬件系统实例 218 8.1.2 C51语言及程序简介 220 8.1.3 开发C51程序的利器Keil C51 uVision2及串口程序仿真 221 8.2 C51单片机串口通信程序实例 226 8.2.1 实例一 226 8.2.2 实例二 227 第9章 串口与网络结合的解决方案及编程 230 9.1 串口与网络结合的硬件解决方案 230 9.2典型串口与联网的设备 231 9.2.1 NPort5400系列产品的特点 231 9.2.2 NPort 5400系列产品的典型应用介绍 233 9.2.3 NPort5400系列产品的设置与编程测试 235 9.3 与Access数据库结合的串口通信实例 237 9.3.1 微机网络检测系统说明 237 9.3.2 创建ODBC数据源 238 9.3.3 创建工程 239 9.3.4 程序简介 244 9.4 与WinSock结合的串口通信实例 246 9.4.1 客户端应用程序 247 9.4.2 服务器应用程序 252 9.5 在已经编好的串口通信程序中加入网络通信功能 260 9.5.1参照MFC AppWizard创建WinSockets程序 261 9.5.2 利用Windows Sockets API和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 SMS编码规范及编码与解码例程 266 10.1.2 AT命令收发短消息实例 273 10.1.3 “实时”接收短消息的方法 281 10.1.4 用串口收发SMS短信编程的一些讨论 283 10.2 计算机与Rabbit 2000嵌入式系统通信编程实例 286 10.2.1 Rabbit 2000微处理器介绍 286 10.2.2 动态C(Dynamic C)语言介绍 287 10.2.3 某车载无线调度系统实例介绍 288 10.3 计算机与PLC通信程序实例 294 10.4 MATLAB环境串口编程通信实例 295 10.4.1 MATLAB串口类Serial应用 295 10.4.2 通过串口使MATLAB Simulink与下位机通讯进行控制 299 10.4.3 xPC目标环境下串口通信实现 299 第11章 串口通信基本概念及标准 302 11.1 串口通信基本概念 302 11.1.1 串行通信概述 302 11.1.2 单工、半双工和全双工的定义 305 11.1.3 同步传送与异步传送 306 11.1.4 串行通信协议 306 11.2 RS-232-C串口标准 309 11.2.1 RS-232-C标准 309 11.2.2 RS-232-C串行通信接线实例 312 11.3 RS-422/485串口标准 314 11.3.1 概述 314 11.3.2 RS-422与RS-485串行接口标准 315 11.3.3 RS-422与RS-485的网络安装注意要点 317 11.3.4 RS-232、RS422、RS485电气参数对比 318 11.4 串口调试注意事项 318 11.5 常用数据校验法 318 11.5.1 奇偶校验 318 11.5.2 循环冗余码校验 319 11.6 串口连接和TCP/IP连接对比 320 11.7 现场总线与RS-232、RS-485的本质区别 320 11.8 MODEM通信技术 320 11.8.1 MODEM的基本工作原理 320 11.8.2 MODEM的功能 322 11.8.3 MODEM的分类 322 11.8.4 MODEM的安装 324 11.8.5 MODEM V.92标准介绍 326 11.8.6 MODEM的速度 327 11.8.7 MODEM优化方法 328 11.8.8 MODEM命令/AT命令 329 第12章 不占用串口的串口数据捕捉 338 12.1 驱动程序的基本概念:VxD与WDM 338 12.1.1 虚拟设备驱动程序VxD 338 12.1.2 Win32驱动程序模型WDM 340 12.1.3 在不同操作系统下选用哪种驱动程序模式 341 12.2 VxD示例程序介绍——VToolsD中的CommHook 341 12.3 串口数据捕捉实例程序 351 12.3.1 编程任务 351 12.3.2 编程步骤 351 12.4 虚拟串口简介 364 附录A Turbo C说明 366 附录B ASCII码表 376 源码链接:http://download.csdn.net/download/nihuichao/10244970
Visual C++/Turbo C串口通信编程实践及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信编程 12 第2章 多线程串口编程工具cserialport类 16 2.1 cserialport类的功能及成员函数介绍 16 2.2 应用cserialport类编制基于对话框的应用程序 30 2.3 应用cserialport类编制基于单文档的应用程序 35 2.4 对cserialport类的改进 40 2.4.1 改进一:ascii文本和二进制数据发送方式兼容 40 2.4.2 改进二:也许能解决内存泄漏 43 2.4.3 改进三:彻底关闭串口,释放串口资源 44 第3章 控件mscomm串口编程 46 3.1 mscomm控件介绍 46 3.1.1 vc中应用mscomm控件编程步骤 46 3.1.2 mscomm控件串行通信处理方式 47 3.1.3 mscomm 控件的属性说明 48 3.1.4 mscomm控件错误信息 55 3.2 使用mscomm控件的几个疑难问题 56 3.2.1 使用variant 和safearray 数据类型从串口读写数据 56 .3.2.2 mscomm控件能离开对话框独立存在吗 59 3.2.3 如何发送接收ascii值为0和大于128的字符 60 3.2.4 在同一程序中用mscomm控件控制多个串口的具体操作方法 62 3.2.5 解决使用控件编程时程序占用的内存会不断增大的问题 62 3.2.6 在mscomm控件串口编程时遇到的其他问题 63 3.3 在基于单文档(sdi)程序中应用mscomm控件 63 3.4 应用mscomm控件控制多个串口实例 69 3.5 串口与modem拨号应用简例 76 3.5.1 创建工程 76 3.5.2 代码分析 78 3.5.3 应用 85 第4章 windows api串口编程 87 4.1 windows api串口编程概述 87 4.2 api串口编程中用到的结构及相关概念说明 89 4.2.1 dcb(device control block)结构 89 4.2.2 超时设置commtimeouts结构 92 4.2.3 overlapped异步i/o重叠结构 94 4.2.4 通信错误与通信设备状态 95 4.2.5 串行通信事件 96 4.3 windows api串行通信函数 97 4.4 win32 api串口通信编程的一般流程和特殊实例 116 4.4.1 win32 api串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步i/o读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 cserialport类中的api函数编程应用剖析 119 4.6 win32 api串口编程tty(虚拟终端)实例 128 4.6.1 建立程序工程 128 4.6.2 建立串口设置对话框 129 4.6.3 编写ctermdoc类的相关代码 132 4.6.4 小结 141 4.6.5 在ctermview类中字添加符键入处理代码与串口接收处理代码 142 第5章 串口调试助手v2.2编程 147 5.1 建立scomm程序工程实现界面功能 147 5.2 串口的初始化及关闭 150 5.3 串口数据的发送与接收及十六进制数据的处理 151 5.3.1 十六进数据发送处理 152 5.3.2 手动发送处理 152 5.3.3 自动发送处理 153 5.3.4 接收处理及十六进制显示 154 5.4 其他辅助功能的实现 156 5.4.1 接收数据的文件保存 156 5.4.2 实现小文件发送 158 5.4.3 图钉按钮功能使程序能浮在最上层 161 5.4.4 对话框动画图标的实现 162 5.4.5 超链接功能的实现 164 5.4.6 如何打开帮助网页文件 164 第6章 dos环境下的turbo c串口编程及通用实例gserial类 168 6.1 pc机异步通信适配器8250及其编程操作 169 6.1.1 ins8250内部寄存器及其选择方式 169 6.1.2 波特率设置 169 6.1.3 数据位、奇偶校验、停止位等数据格式设置 170 6.1.4 查询i/o方式相关设置 171 6.1.5 中断i/o通信方式相关设置 171 6.1.6 modem寄存器 172 6.2 comrxtx程序实例 173 6.3 通用实例程序gserial类 175 6.4 用gserial类控制多串口 186 6.5 多串口编程pc机高号中断8259a可编程中断控制器的控制 195 第7章 串口通信用户层协议的编制与数据处理方法 197 7.1 通信协议的编制 197 7.1.1 为什么要编制用户通信协议 197 7.1.2 串口通信中用户层协议编制原则 199 7.1.3 在串口通信中几种常用的用户层协议 200 7.2 串口通信数据包处理方法编程实例 202 7.2.1 编程任务 203 7.2.2 编程步骤 203 7.2.3 程序测试 216 第8章 单片机串口通信 218 8.1 单片机串口硬件系统及c51程序开发 218 8.1.1 较典型的单片机硬件系统实例 218 8.1.2 c51语言及程序简介 220 8.1.3 开发c51程序的利器keil c51 uvision2及串口程序仿真 221 8.2 c51单片机串口通信程序实例 226 8.2.1 实例一 226 8.2.2 实例二 227 第9章 串口与网络结合的解决方案及编程 230 9.1 串口与网络结合的硬件解决方案 230 9.2典型串口与联网的设备 231 9.2.1 nport5400系列产品的特点 231 9.2.2 nport 5400系列产品的典型应用介绍 233 9.2.3 nport5400系列产品的设置与编程测试 235 9.3 与access数据库结合的串口通信实例 237 9.3.1 微机网络检测系统说明 237 9.3.2 创建odbc数据源 238 9.3.3 创建工程 239 9.3.4 程序简介 244 9.4 与winsock结合的串口通信实例 246 9.4.1 客户端应用程序 247 9.4.2 服务器应用程序 252 9.5 在已经编好的串口通信程序中加入网络通信功能 260 9.5.1参照mfc appwizard创建winsockets程序 261 9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程 266 10.1.2 at命令收发短消息实例 273 10.1.3 "实时"接收短消息的方法 281 10.1.4 用串口收发sms短信编程的一些讨论 283 10.2 计算机与rabbit 2000嵌入式系统通信编程实例 286 10.2.1 rabbit 2000微处理器介绍 286 10.2.2 动态c(dynamic c)语言介绍 287 10.2.3 某车载无线调度系统实例介绍 288 10.3 计算机与plc通信程序实例 294 10.4 matlab环境串口编程通信实例 295 10.4.1 matlab串口类serial应用 295 10.4.2 通过串口使matlab simulink与下位机通讯进行控制 299 10.4.3 xpc目标环境下串口通信实现 299 第11章 串口通信基本概念及标准 302 11.1 串口通信基本概念 302 11.1.1 串行通信概述 302 11.1.2 单工、半双工和全双工的定义 305 11.1.3 同步传送与异步传送 306 11.1.4 串行通信协议 306 11.2 rs-232-c串口标准 309 11.2.1 rs-232-c标准 309 11.2.2 rs-232-c串行通信接线实例 312 11.3 rs-422/485串口标准 314 11.3.1 概述 314 11.3.2 rs-422与rs-485串行接口标准 315 11.3.3 rs-422与rs-485的网络安装注意要点 317 11.3.4 rs-232、rs422、rs485电气参数对比 318 11.4 串口调试注意事项 318 11.5 常用数据校验法 318 11.5.1 奇偶校验 318 11.5.2 循环冗余码校验 319 11.6 串口连接和tcp/ip连接对比 320 11.7 现场总线与rs-232、rs-485的本质区别 320 11.8 modem通信技术 320 11.8.1 modem的基本工作原理 320 11.8.2 modem的功能 322 11.8.3 modem的分类 322 11.8.4 modem的安装 324 11.8.5 modem v.92标准介绍 326 11.8.6 modem的速度 327 11.8.7 modem优化方法 328 11.8.8 modem命令/at命令 329 第12章 不占用串口的串口数据捕捉 338 12.1 驱动程序的基本概念:vxd与wdm 338 12.1.1 虚拟设备驱动程序vxd 338 12.1.2 win32驱动程序模型wdm 340 12.1.3 在不同操作系统下选用哪种驱动程序模式 341 12.2 vxd示例程序介绍--vtoolsd中的commhook 341 12.3 串口数据捕捉实例程序 351 12.3.1 编程任务 351 12.3.2 编程步骤 351 12.4 虚拟串口简介 364 附录a turbo c说明 366 附录b ascii码表 376

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧