viYjk99
驱动牛犊
驱动牛犊
  • 注册日期2009-05-16
  • 最后登录2010-05-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望71点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2330回复:2

驱动中如何判断FIFO中串口数据全部发送完毕

楼主#
更多 发布于:2009-09-28 22:54
平台:s3c2440 + wince5.0
在串口驱动文件pdds3c2440_ser.cpp中
void CPdd2440Uart::XmitInterruptHandler(PUCHAR pTxBuffer, ULONG *pBuffLen) 
{ 
        ...... 

        for (DWORD dwByteWrite=0; dwByteWrite<dwWriteSize && dwDataAvaiable!=0;dwByteWrite++) 
       { 
               m_pReg2440Uart->Write_UTXH(*pTxBuffer); //数据写到串口发送寄存器 
               pTxBuffer ++; 
               dwDataAvaiable--; 
       } 

      ...... 

}

上面的for ()循环是把dwWriteSize个数据从串口发送出去,是不是for循环结束后,数据就完全从串口发送出去了呢?在测试中发现,如果在for循环后立即把TxD功能引脚改变为输入,会出现串口只发送部分数据出去,增加了一点延时就好了,for循环后数据不是都发送完了吗,为什么还会对数据造成影响呢?要怎么处理才能准确地判断数据已经正确的发送完呢?用UTRSTAT寄存器吗?

发送过程是否是
m_pReg2440Uart->Write_UTXH(*pTxBuffer) ---->  FIFO  ----> 移位寄存器 ---> TXD管脚
如果是这样,出现这种情况,就是说,for 循环后,数据还在寄存器中,还没完全从TXD管脚发送出去

viYjk99
驱动牛犊
驱动牛犊
  • 注册日期2009-05-16
  • 最后登录2010-05-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望71点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-09-29 21:32
怎么没人来帮帮忙呀
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-09-30 16:11
for循环结束,只是代表数据送入缓冲区了,等待底层发送。如果此时直接改变txd的功能引脚,是会影响数据发送的。最保险的方法就是检查寄存器。
游客

返回顶部