WinCE下的串口驱动分析
Command | Note |
IOCTL_PSL_NOTIFY | 在调用驱动的进程退出时产生,并不是串行驱动专有的IO命令。这里会调用 ProcessExiting函数进行处理。这个函数的内容放到后面来看。 |
IOCTL_SERIAL_SET_BREAK_ON | 中断(暂停)serial当前的发送或是接收,具体实现在PDD中 |
IOCTL_SERIAL_SET_BREAK_OFF | 从中断(暂停)状态恢复,具体实现在PDD中 |
IOCTL_SERIAL_SET_DTR | 将DTR引线拉高。(直接调用PDD实现) |
IOCTL_SERIAL_CLR_DTR | 将DTR引线拉低。(直接调用PDD实现) |
IOCTL_SERIAL_SET_RTS | 将RTS引线拉高。(直接调用PDD实现) |
IOCTL_SERIAL_CLR_RTS | 将RTS引线拉低。(直接调用PDD实现) |
IOCTL_SERIAL_SET_XOFF | 软件流模式下中止数据发送(Xflow控制) |
IOCTL_SERIAL_SET_XON | 软件流模式下启动数据发送(XFlow控制) |
IOCTL_SERIAL_GET_WAIT_MASK | 获取当前的事件对象 |
IOCTL_SERIAL_SET_WAIT_MASK | 设置事件对象,这个过程相对比较麻烦,要将当前获得的事件对象mask设置到所有的Open实例中,这和前面的 EvaluateEventFlag过程相似。 |
IOCTL_SERIAL_WAIT_ON_MASK | 等待与提供的事件相同的事件发生,实现实体是 WaitCommEvent后面再讨论。 |
IOCTL_SERIAL_GET_COMMSTATUS | 清除异常并返回当前状态(由PDD实现) |
IOCTL_SERIAL_GET_MODEMSTATUS | 获取modem状态(由PDD实现) |
IOCTL_SERIAL_GET_PROPERTIES | 获取通讯************************(由PDD实现) |
IOCTL_SERIAL_SET_TIMEOUTS | 设置超时时间(包含PDD实现) |
IOCTL_SERIAL_GET_TIMEOUTS | 获取超时时间 |
IOCTL_SERIAL_PURGE | 清除制定的发送或接收缓冲内的数据(含PDD实现) |
IOCTL_SERIAL_SET_QUEUE_SIZE | 不明,若知道请告知 |
IOCTL_SERIAL_IMMEDIATE_CHAR | 为扩展功能,在发送数据前设置一个标志数 |
IOCTL_SERIAL_GET_DCB | 获取DCB数据结构 |
IOCTL_SERIAL_SET_DCB | 设置DCB数据结构 |
IOCTL_SERIAL_ENABLE_IR | 启动红外模式(由PDD实现) |
IOCTL_SERIAL_DISABLE_IR | 禁用红外模式(由PDD实现) |
到这里MDD的主要函数都已经介绍过了,下面几个函数是在DeviceIOControl中用到的。这里顺便也来看一下:
ProcessExiting
该函数在IOCTL_PSL_NOTIFY命令的执行过程中被调用,之前的情景是使用驱动的进程在被取消的过程中,在这里主要是清除所有正在会话中的线程。以便直接kill掉该进程。
WaitCommEvent
事实上该函数为SerialAPI WaitCommEvent在驱动内的实现,其作用为阻塞线程直道某一固定的串口通告(事件消息)发生。在具体的实现中,是用WaitForSingleObject来实现阻塞。在进入阻塞之前,函数适用一个循环主体首先查询是否存在已有的通告与等待通告相符,若没有就等待下一次事件发生,待事件发生再次进行检查。如此循环达到阻塞的目的。
ApplyDCB
DCB数据结构是描述串行口波特率,流控制,奇偶效验等资料的载体。该函数是MDD设置DCB数据结构至驱动内部和硬件的手段,这里使用了大量的PDD操作来完成硬件设置。
总结:
在驱动实现方面,除去所谓Multi-Open的处理外,串口的MDD并没有什么特别的之处,在掌握了硬件行为和应用软件行为后很容易能读懂其间的代码。
嵌入式新闻 嵌入式资料 嵌入式培训 嵌入式linux 嵌入式系统 嵌入式开发 嵌入式 相关文章:
- 煤矿井下综合自动化系统中的应用(04-06)
- 软件Overlay:程序编写与调试(01-20)
- USB数据通信接□模块的程序设计(10-17)
- 东江产业园:力争2017年产值达千亿(09-30)
- 硅谷数模的SlimPort扩大了Nexus7的显示屏选择(08-01)
- Lonworks控制网络技术在城市排水泵站自动化中的应用(06-06)