极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19597|回复: 7

Arduino直接使用IO模拟UART问题

[复制链接]
发表于 2015-6-10 13:14:56 | 显示全部楼层 |阅读模式
最近因为调试一个小软件,需要使用电脑连接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发送每位时的电平持续时间应该怎么计算?
回复

使用道具 举报

 楼主| 发表于 2015-6-10 19:13:05 | 显示全部楼层
自己顶起来
回复 支持 反对

使用道具 举报

发表于 2015-6-10 22:03:00 | 显示全部楼层
为什么不用软串口库?
回复 支持 反对

使用道具 举报

发表于 2015-6-11 00:03:10 | 显示全部楼层
用1、2引脚
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-11 09:22:09 来自手机 | 显示全部楼层
suoma 发表于 2015-6-11 00:03
用1、2引脚

1,2脚因为已经使用在另一个设备上了,要不就不用整这个IO直接操作了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-11 09:22:47 来自手机 | 显示全部楼层
mc.six 发表于 2015-6-10 22:03
为什么不用软串口库?

可以发个给我吗?还真没用过
回复 支持 反对

使用道具 举报

发表于 2015-6-11 17:08:32 | 显示全部楼层
本帖最后由 mc.six 于 2015-6-11 17:09 编辑
左手 发表于 2015-6-11 09:22
可以发个给我吗?还真没用过


http://www.arduino.cc/en/Reference/SoftwareSerial

可以参考官方说明
回复 支持 反对

使用道具 举报

发表于 2015-6-11 18:46:38 | 显示全部楼层
左手 发表于 2015-6-11 09:22
1,2脚因为已经使用在另一个设备上了,要不就不用整这个IO直接操作了

换回1、2,专用的RX、TX
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 20:05 , Processed in 0.073634 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表