beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1701回复:5

串口设置中SetCommState对应WDM层的那个函数?

楼主#
更多 发布于:2002-07-09 17:02
我想自己写一个串口函数,应该怎么得到波特率等属性的设置信息呢?
只要能解决问题,就一定给分。 希望高手赐教!
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-09 17:16
SetCommState估计也是对应devicoiocontrol之类的动东,
只不过封装了一层。
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
ynzhang
驱动牛犊
驱动牛犊
  • 注册日期2001-09-18
  • 最后登录2002-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-10 16:58
SetCommState call devicoiocontrol(不是DDK,是SDK)
deviceIocontrol 产生一个device_io_control irp 给驱动程序
win2000是这样,win98 中使用的vxd 所以有一点点不同.

fly_zho
驱动小牛
驱动小牛
  • 注册日期2002-12-03
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-10 17:22
SetCommState call devicoiocontrol(不是DDK,是SDK)
deviceIocontrol 产生一个device_io_control irp 给驱动程序
win2000是这样,win98 中使用的vxd 所以有一点点不同.

 

严重赞同!!!
我是小龙女! 靠!你不信,不信拉倒! 反正我们恐龙家的女儿也不愁嫁...
wangxdong
驱动小牛
驱动小牛
  • 注册日期2002-07-08
  • 最后登录2003-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-16 18:14
可以发送IRP给LowerDevice即串口设备系统io结构支持分层,如一个核心态驱动能发送IRP给其他驱动,而且能发送给更多的驱动,这样,请求能通过多层驱动进行处理。
为阐明这种机制,请看下面关于内核态驱动如何将一个请求发送给一个串口设备,该请求要获得波特率。
首先,产生一个KlowerDevice的实例,请求将传给它。本例中为\\Device\\Serial1 (COM2).
ULONG Unit = 1;
KUnitizedName uname(L\"\\\\Device\\\\Serial\", Unit);
pSerialPort =
new (NonPagedPool) KLowerDevice((PWSTR)uname,
FILE_ALL_ACCESS);
if (pSerialPort &&
NT_SUCCESS(pSerialPort->ConstructorStatus()))
下一步,分配一个IRP并对其初始化,KIrp::Allocate的参数为IRP中栈定位的数字,该值是IRP要发送的设备的功能
注意IRP栈位置的建立应为next位置,不是当前的
SERIAL_BAUD_RATE GetBaud; // global static
//------------------------------------------
KIrp I =
KIrp::Allocate(pSerialPort->StackRequirement());
I.MajorFunction(NEXT) = IRP_MJ_DEVICE_CONTROL;
I.MinorFunction(NEXT) = 0;
I.IoctlCode(NEXT) = IOCTL_SERIAL_GET_BAUD_RATE;
I.IoctlInputBufferSize(NEXT) = 0;
I.IoctlOutputBufferSize(NEXT) =
sizeof(SERIAL_BAUD_RATE);
I.IoctlBuffer() = &GetBaud;
现在,当低级设备完成IRP时,调用例程来结束,这是必须的,以便驱动能释放IRP
I.SetCompletionRoutine(
DeviceIoCompleteRoutine,
NULL );
很容易将完成线程作为一个类成员,见宏MEMBER_COMPLETEIRP.
驱动然后调用低层设备,将IRP传给他(见KLowerDevice::Call).
status = pSerial->Call(I);
如果线程运行在PASSIVE_LEVEL,而且你希望调用在IRP完成后再返回,那么用CallWaitComplete.
当串口设备完成了调用,系统调用完成线程,完成线程去除IRP栈,返回STATUS_MORE_PROCESSING_REQUIRED 防止系统试图处理该IRP。
NTSTATUS DeviceIoCompleteRoutine (
PDEVICE_OBJECT DeviceObject,
PIRP pIrp,
PVOID Context)
{
// the baud rate is in global GetBaud.
KIrp::Deallocate(pIrp);
return STATUS_MORE_PROCESSING_REQUIRED;

请多多指教!
funny
驱动小牛
驱动小牛
  • 注册日期2003-04-17
  • 最后登录2021-07-30
  • 粉丝0
  • 关注0
  • 积分1012分
  • 威望178点
  • 贡献值0点
  • 好评度123点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-03-08 14:20
上楼的,不错,要是能用DDK写出来就更好了
驱动现在,成就未来
游客

返回顶部