⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 windowsce_net 420串口驱动分析(3)--jesse.htm

📁 WinCE下串口编程应用实例
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                  style="mso-tab-count: 1">         
                  </SPAN>PUCHAR<SPAN style="mso-tab-count: 1">&nbsp; 
                  </SPAN>TxCharBuffer;<SPAN 
                  style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  </SPAN>/* @field Start of buffer */</SPAN> </P>
                  <P class=MsoNormal><SPAN lang=EN-US><SPAN 
                  style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  </SPAN>CRITICAL_SECTION<SPAN 
                  style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  </SPAN>CS;<SPAN 
                  style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  </SPAN>/* @field Critical section */</SPAN> </P>
                  <P class=MsoNormal><SPAN lang=EN-US>} TX_BUFFER_INFO, 
                  *PTX_BUFFER_INFO;</SPAN> </P>
                  <P class=MsoNormal><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面来看看代码的具体内容。首先是对</SPAN><SPAN 
                  lang=EN-US>OpenCnt</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的检查,也就是设备是否被打开。若当会话已经关闭也就没有必要继续将数据送出了,并同时重置缓冲器的各个标志位。整个流程比较简单,在需要流控制时设置</SPAN><SPAN 
                  lang=EN-US>RTS</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或检查</SPAN><SPAN 
                  lang=EN-US>Xflow</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的情况后将数据送入硬件缓冲器</SPAN><SPAN 
                  lang=EN-US>.</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果在没有数据需要发送的情况下简单的清除中断标示并发出发送结束事件就可以了。至于</SPAN><SPAN 
                  lang=EN-US>SetProcPermissions</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置的目的在于获得访问其它线程数据空间的手段。</SPAN> 
                  </P>
                  <P class=MsoNormal><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">至于所谓的</SPAN><SPAN 
                  lang=EN-US>Modem</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN 
                  lang=EN-US>Line</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的情况则全部交给</SPAN><SPAN 
                  lang=EN-US>PDD</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来处理,我们后面再讨论。在这些全部都处理完了以后如果前面处理了接收,则发出接收(有可用的数据用于接收)的消息,让程序开始接收。后面还跟进了一个</SPAN><SPAN 
                  lang=EN-US>EvaluateEventFlag </SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数,这个函数用于产生标准的</SPAN><SPAN 
                  lang=EN-US>Communication Events EV_RXFLAG</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,而且由于该驱动程序本身支持</SPAN><SPAN 
                  lang=EN-US>mult-open</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式,所以需要将该事件送发到所有的实例中去。在</SPAN><SPAN 
                  lang=EN-US>ist</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">期间有一些互锁、临界区的操作,因为不影响流程,同步化的内容这里我没有提。中断服务的分析大致就是如此,没有涉及到逻辑环节在后面的</SPAN><SPAN 
                  lang=EN-US>PDD</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分再进行讨论。</SPAN> 
                  </P>
                  <P class=MsoNormal><SPAN lang=EN-US><SPAN 
                  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; 
                  </SPAN></SPAN></P>
                  <P class=MsoNormal><B 
                  style="mso-bidi-font-weight: normal"><SPAN 
                  lang=EN-US>COM_Read<O:P></O:P></SPAN></B> </P>
                  <P class=MsoNormal><SPAN lang=EN-US>COM_Read</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是获取串口所接收到数据的操作,在前面的</SPAN><SPAN 
                  lang=EN-US>IST</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中没有看到对</SPAN><SPAN 
                  lang=EN-US>RX buffer</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行修改</SPAN><SPAN 
                  lang=EN-US>Read</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标记的操作,也就是这儿来完成的。该函数有三个参数,第一个参数是从上面的</SPAN><SPAN 
                  lang=EN-US>COM_OPEN</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过设备管理器交换来的,后两个参数与文件系统的使用方法完全一样,一个是接受缓冲指针,另一个是长度。代码的开始照样是例行公事的参数检查,包括对存取权限,</SPAN><SPAN 
                  lang=EN-US>OpenCnt</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。之后计算超时时间,如果设定了超时读取动作会在超时后返回,不管是否读到了足够长度的数据。随后就是简单对软件缓冲进行读取的操作了,读取的操作是在</SPAN><SPAN 
                  lang=EN-US>RX_CS</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中完成的。下面要处理器的主要就是几种异常的情形,读取过程中设备被关闭</SPAN><SPAN 
                  lang=EN-US>/</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">取消读取和超时。最后在读取的过程中需要处理的就只是流控制的成本了。首先是软件流的情形,如果缓冲的状态由高于分位点至分位点以下就发出</SPAN><SPAN 
                  lang=EN-US>XON</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标记,启动发送端的发送。而硬件流的情形无论是</SPAN><SPAN 
                  lang=EN-US>RTS</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是</SPAN><SPAN 
                  lang=EN-US>DTR</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与软件流的相类似,同样由一个分为点</SPAN><SPAN 
                  lang=EN-US>(50%)</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来决定发出启动发送端的信号,仅仅是这里使用的具体措施的不同。这些硬件信号的发出都是由</SPAN><SPAN 
                  lang=EN-US>PDD</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成的,其中包括</SPAN><SPAN 
                  lang=EN-US>HWSetRTS</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN 
                  lang=EN-US>HWSetDTR(2</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选一</SPAN><SPAN 
                  lang=EN-US>)</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。至此</SPAN><SPAN 
                  lang=EN-US>Read</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的流程就结束了。</SPAN> 
                  </P>
                  <P class=MsoNormal><SPAN lang=EN-US><O:P>&nbsp;</O:P></SPAN> 
                  </P>
                  <P class=MsoNormal><B 
                  style="mso-bidi-font-weight: normal"><SPAN 
                  lang=EN-US>COM_Write<O:P></O:P></SPAN></B> </P>
                  <P class=MsoNormal><SPAN lang=EN-US>COM_Write</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是与</SPAN><SPAN 
                  lang=EN-US>COM_Read</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相对应的操作。所传递的参数的形式也是很相似的,仅仅是数据流向的不同。在程序的开始,同样也是参数检查,内容与</SPAN><SPAN 
                  lang=EN-US>COM_Read</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一致。在数据检查完成之后进入临界区</SPAN><SPAN 
                  lang=EN-US>(</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保障多线程下的独占</SPAN><SPAN 
                  lang=EN-US>)</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将送入的目标地址和长度设置为</SPAN><SPAN 
                  lang=EN-US>TX buffer</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,待到数据发送完成事件后调用</SPAN><SPAN 
                  lang=EN-US>DoTxData</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来启动发送。这里启动发送的目的在于获得硬件中断维持发送流程。在这里</SPAN><SPAN 
                  lang=EN-US>DoTxData</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是作为两种状态来执行的,在通过</SPAN><SPAN 
                  lang=EN-US>COM_Write</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的执行的过程中是在</SPAN><SPAN 
                  lang=EN-US>device.exe</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所创建的线程空间内执行的,但由系统中断事件主动启动的过程中属于</SPAN><SPAN 
                  lang=EN-US>IST</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身的的进程空间,这样在</SPAN><SPAN 
                  lang=EN-US>COM_Write</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用</SPAN><SPAN 
                  lang=EN-US>DoTxData</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前设置的权限代码</SPAN><SPAN 
                  lang=EN-US>(</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由</SPAN><SPAN 
                  lang=EN-US>GetCurrentPermissions</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得</SPAN><SPAN 
                  lang=EN-US>)</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以由</SPAN><SPAN 
                  lang=EN-US>TxBufferInfo</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">传递到</SPAN><SPAN 
                  lang=EN-US>IST</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中去使得中断过程也具备了访问缓冲的权限</SPAN><SPAN 
                  lang=EN-US>(</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结合前面说明</SPAN><SPAN 
                  lang=EN-US>IST</SPAN><SPAN 
                  style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的流程</SPAN><SPAN 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -