如何判断串口数据发送完毕
平台:s3c2440 + wince5.0
在串口驱动文件pdds3c2440_ser.cpp中
[code=C/C++][/code]
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循环后数据不是都发送完了吗?
为什么会对最后一个字节造成影响呢?
要怎么处理才能准确地判断数据已经正确的发送完呢?用USTART寄存器吗?
[解决办法]
无论如何也不能在这里改TXD啊
这个函数里只是发送数据到寄存器
还没完成发送
当然不能操作TXD!
[解决办法]
理论上只要把数据放到(m_pReg2440Uart->Write_UTXH(*pTxBuffer);)串口发送寄存器,数据就直接发送出去了。但是数据发送是有过程的,就像楼主说的加一个延时就ok了。你的问题是想知道要判断串口数据发送完,有很多方法。不知道楼主要判断这个干啥。
这要看你对时时性要求高不高。
不高的话,就像你说的加个延时就行了。
当然还可以判断串口寄存器的(相应管脚)是否有数据。
拿你这个程序来看的话,你的for循环最后一次数据写进去后。跳出了for循环,在此时你改变TXD的模式,很可能出现你说的数据错误。数据写进了寄存器,但是还没有发送完。
而且,你这个操作时一个函数。就像楼上说的。
具体的你可以看看相应芯片的串口相关章节,说的很详细。
[解决办法]
不建议在应用层操作TxD,因为应用层只是把数据发到驱动的缓冲中了。用STATUS时可以判断,但如果你在应用层操作,那么你的串口肯定不能满速率工作
[解决办法]
读串口缓冲区标志位
[解决办法]
加延时后读取串口缓冲区标志位