最近因为调试一个小软件,需要使用电脑连接UART,同时使用一组UART连接WIFI模块发送数据,因此在做用IO口直接模拟UART时序,发送成功了,但是存在一点问题没想明白,发上来大家帮帮忙看看。主要代码如下 :
uint frametime;
frametime=1000000/19200;//波特率19200,52us
void vuart_send_byte(char cbuf)
{
CLR_TX;
_delay_us(frametime);//拉低后保持1位时间,启动发送
for(int i=0;i<8;i++)
{
if(cbuf&0x01)
SET_TX;
else
CLR_TX;
cbuf>>=1;
_delay_us(frametime);
}
SET_TX;
_delay_us(frametime);//发送停止位
return;
}
代码这样发送不成功,能接收到数据,但是明显波特率不对,数据采样出来不对。修改frametime=52-4;后可正确接收到数据,问题是为什么要减4us,是否是因为除了操作IO口电平外的指令外的其它指令占用的CPU时钟周期?试了一下,-3,-4,-5都可以正常接收,-2,-1等会出现数据错误。
另外还有问题是,就算是52-4us,接收端接收时波特率也只是9600,用波特率19200也不能正确接收数据,为什么呢?这个UART发送每位时的电平持续时间应该怎么计算? |