simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:1493回复:3

串口问题,一个驱动要支持多个物理串口。

楼主#
更多 发布于:2007-11-16 10:57
小弟现在在搞串口驱动,本来是很简单的东西,但是对wince不是很精通,所以问几个问题。

ARM926的SOC上面,出了4个串口,uart0作为调试串口,打印调试信息的,用的都是查询方式。

现在要支持uart1~uart3,当然不再做调试串口,而是可能接写GPS模块之类的东西。

现在遇到的问题就是:

1、一个驱动要支持3个串口,初始化的时候我把3个串口硬件都初始化了。这样感觉不妥,毕竟还没有一定都使用所有串口。问题就是,如何知道当createfile时,传入的是串口号?

2、如果以上实现不了,只能将每个串口都写一个驱动,那样显得很冗余,虽然也是正确的。

zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
沙发#
发布于:2007-11-16 13:33
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial1]
   "DeviceArrayIndex"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial2]
   "DeviceArrayIndex"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial3]
   "DeviceArrayIndex"=dword:2
利用这个注册表项,在实现
CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
{
    CSerialPDD * pSerialPDD = NULL;
    switch (DeviceArrayIndex) {
      case 0:
        pSerialPDD = new CPddSerial1(lpActivePath,pMdd, pHwObj);
        break;
      case 1:
        pSerialPDD = new CPddSerial2(lpActivePath,pMdd, pHwObj);
        break;
case 2:
        pSerialPDD = new CPddSerial3(lpActivePath,pMdd, pHwObj);
        break;

    }
    if (pSerialPDD && !pSerialPDD->Init()) {
        delete pSerialPDD;
        pSerialPDD = NULL;
    }    
    return pSerialPDD;
}
这些类都继承自CSerialPDD,你接下来就是重载Init()等需要分别实现的虚函数,这样你的三个串口都可以用这个驱动DLL。
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-16 14:25
多谢大侠指点,我再研究一下。

一定要用微软的MDD和PDD吗?我可否简单的就一个驱动,然后上层直接用createfile的方式调用?
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-11-25 21:21
PDD与MDD只是微软把与硬件无关的代码做了一个抽象,从而减少程序开发的难度,
本质上并没有什么区别.
学海无涯
游客

返回顶部