打印
[51单片机]

IO口模拟UART通信的问题

[复制链接]
1260|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shaorc|  楼主 | 2019-6-25 10:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

如上图,是串行发送8位数据的时序图
下图的程序是利用51单片机的IO口模拟UART串行通信

红色箭头所指的程序,是表示判断数据是否接收完毕
结合时序图来看,while(!RxdEnd);语句是判断数据是否接收完毕,
若接收完毕,则代表RxdEnd这个标志位等于1,即检测到停止位
如果8位数据中出现1,会不会使得程序误以为接受到的1是停止位的1,从而误以为接收完成了?



使用特权

评论回复

相关帖子

沙发
叶春勇| | 2019-6-25 14:18 | 只看该作者
RxdEnd不可能是直接检测高电平的来设置的。
是根据波特率来的。比如起始位触发RxdEnd=0接收,然后是8bit数据,然后是停止位。这个要靠定时器来同步的。也就是说至少要过了10位时间才能触发RxdEnd=1

使用特权

评论回复
板凳
ayb_ice| | 2019-6-25 14:40 | 只看该作者
那应该是个位变量,是由其它代码在控制,结束时置1结束位是高电平,不代表高电平就是结束

使用特权

评论回复
地板
tianxj01| | 2019-6-25 17:03 | 只看该作者
不管怎么样的模拟串口程序,其有一个共同的特征就是得有一个精确控制的检测周期来进行数据的读入,这必须匹配输入波特率。
离开这个概念,所以的串口包括硬件串口都不能正常工作。
对于有精确时钟控制的软串口程序,其判断停止位时间,不可能落在数据位上面。

使用特权

评论回复
5
coody| | 2019-6-25 23:29 | 只看该作者
我从90年代就经常用定时器查询做模拟串口(3倍波特率,比如2400bps,就用7200HZ查询)。90年代多通道的串口不容易获得,模拟串口速度慢点,但是稳定可靠。现在的MCU速度快,轻松模拟8个9600bps的全双工串口。

使用特权

评论回复
6
shaorc|  楼主 | 2019-6-28 15:59 | 只看该作者
叶春勇 发表于 2019-6-25 14:18
RxdEnd不可能是直接检测高电平的来设置的。
是根据波特率来的。比如起始位触发RxdEnd=0接收,然后是8bit数 ...

谢谢你的回答

使用特权

评论回复
7
shaorc|  楼主 | 2019-6-28 15:59 | 只看该作者
ayb_ice 发表于 2019-6-25 14:40
那应该是个位变量,是由其它代码在控制,结束时置1结束位是高电平,不代表高电平就是结束
...

谢谢你的回答

使用特权

评论回复
8
shaorc|  楼主 | 2019-6-28 15:59 | 只看该作者
tianxj01 发表于 2019-6-25 17:03
不管怎么样的模拟串口程序,其有一个共同的特征就是得有一个精确控制的检测周期来进行数据的读入,这必须匹 ...

谢谢你的回答

使用特权

评论回复
9
shaorc|  楼主 | 2019-6-28 16:00 | 只看该作者
coody 发表于 2019-6-25 23:29
我从90年代就经常用定时器查询做模拟串口(3倍波特率,比如2400bps,就用7200HZ查询)。90年代多通道的串口 ...

谢谢你的分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

608

帖子

5

粉丝