微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > WinCE串口驱动分析

WinCE串口驱动分析

时间:04-11 来源: 点击:
COM_Read
COM_Read是获取串口所接收到数据的操作,在前面的IST中没有看到对RX buffer进行修改Read标记的操作,也就是这儿来完成的。该函数有三个参数,第一个参数是从上面的COM_OPEN通过设备管理器交换来的,后两个参数与文件系统的使用方法完全一样,一个是接受缓冲指针,另一个是长度。代码的开始照样是例行公事的参数检查,包括对存取权限,OpenCnt等。之后计算超时时间,如果设定了超时读取动作会在超时后返回,不管是否读到了足够长度的数据。随后就是简单对软件缓冲进行读取的操作了,读取的操作是在RX_CS中完成的。下面要处理器的主要就是几种异常的情形,读取过程中设备被关闭/取消读取和超时。最后在读取的过程中需要处理的就只是流控制的成本了。首先是软件流的情形,如果缓冲的状态由高于分位点至分位点以下就发出XON标记,启动发送端的发送。而硬件流的情形无论是RTS还是DTR与软件流的相类似,同样由一个分为点(50%)来决定发出启动发送端的信号,仅仅是这里使用的具体措施的不同。这些硬件信号的发出都是由PDD来完成的,其中包括HWSetRTS和HWSetDTR(2选一)。至此Read的流程就结束了。
COM_Write
COM_Write是与COM_Read相对应的操作。所传递的参数的形式也是很相似的,仅仅是数据流向的不同。在程序的开始,同样也是参数检查,内容与COM_Read一致。在数据检查完成之后进入临界区(保障多线程下的独占)将送入的目标地址和长度设置为TX buffer,待到数据发送完成事件后调用DoTxData来启动发送。这里启动发送的目的在于获得硬件中断维持发送流程。在这里DoTxData是作为两种状态来执行的,在通过COM_Write的执行的过程中是在device.exe所创建的线程空间内执行的,但由系统中断事件主动启动的过程中属于IST本身的的进程空间,这样在COM_Write中调用DoTxData之前设置的权限代码(由GetCurrentPermissions获得)就可以由TxBufferInfo传递到IST中去使得中断过程也具备了访问缓冲的权限(结合前面说明IST的流程)。当提交中断处理发送后待到pSerialHead->hTransmitEvent被设置或是异常或超时后就结束了发送流程,在这部分的最后。与COM_Read类似需要处理一些异常情况,当然如果使用了硬件流控制还需要在这里清除掉发送请求信号,当这些状态处理完成以后发送EV_TXEMPTY事件通告所有open的句柄发送结束就完成了该部分的流程。
COM_PowerUp/ COM_PowerDown
这两个函数的调用都由CE的电源事件来引发,MDD并没有对这两个函数进行处理,仅仅是将其传递给PDD。
COM_IOControl
该函数用于实现向设备发送命令的功能。由于代码本身没有什么流程或逻辑性可言,全都是单独的实现,下面就用列表的方式大致的说一下这些命令字和其实现。
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中用到的。这里顺便也来看一下:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top