[51单片机] IO口模拟UART通信的问题

[复制链接]
1557|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 | 显示全部楼层
不管怎么样的模拟串口程序,其有一个共同的特征就是得有一个精确控制的检测周期来进行数据的读入,这必须匹配输入波特率。
离开这个概念,所以的串口包括硬件串口都不能正常工作。
对于有精确时钟控制的软串口程序,其判断停止位时间,不可能落在数据位上面。
coody 发表于 2019-6-25 23:29 | 显示全部楼层
我从90年代就经常用定时器查询做模拟串口(3倍波特率,比如2400bps,就用7200HZ查询)。90年代多通道的串口不容易获得,模拟串口速度慢点,但是稳定可靠。现在的MCU速度快,轻松模拟8个9600bps的全双工串口。
 楼主| shaorc 发表于 2019-6-28 15:59 | 显示全部楼层
叶春勇 发表于 2019-6-25 14:18
RxdEnd不可能是直接检测高电平的来设置的。
是根据波特率来的。比如起始位触发RxdEnd=0接收,然后是8bit数 ...

谢谢你的回答
 楼主| shaorc 发表于 2019-6-28 15:59 | 显示全部楼层
ayb_ice 发表于 2019-6-25 14:40
那应该是个位变量,是由其它代码在控制,结束时置1结束位是高电平,不代表高电平就是结束
...

谢谢你的回答
 楼主| shaorc 发表于 2019-6-28 15:59 | 显示全部楼层
tianxj01 发表于 2019-6-25 17:03
不管怎么样的模拟串口程序,其有一个共同的特征就是得有一个精确控制的检测周期来进行数据的读入,这必须匹 ...

谢谢你的回答
 楼主| shaorc 发表于 2019-6-28 16:00 | 显示全部楼层
coody 发表于 2019-6-25 23:29
我从90年代就经常用定时器查询做模拟串口(3倍波特率,比如2400bps,就用7200HZ查询)。90年代多通道的串口 ...

谢谢你的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

613

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部