wulin 发表于 2023-6-5 06:05
我的理解: 波特率就是传输二进制的速率,这里选用的是1200,每秒传送1200个比特位,1 / 1200 = 833 us,833us传输一个比特位。每次溢出后进入中断,代表已经时间已经达到一个码元位,如果向下面理解那么传输的比特不应该是对的???? 接收代码的理解: 1.当遇到低电平RXB的时候,代表UART通信开始接收,先把RING = 1 , 比特计数器RCNT = 4 , 比特数RBIT = 9。 2.下次再进入中断,RCNT自动减1,经过4次中断进入后,直到RCNT = 0,然后赋值RCNT = 3,比特数RBT减少一位,这时候认为数据是有效的,把RXB电平的数据记录到RDAT中。 3. 每个比特位都需要RCNT减3次后才把RXB的数据赋值给RDAT。同时,把RBIT数据也减1,直到等于0就代表接收完毕,然后恢复RING = 0。 |
哈兰德 发表于 2023-6-5 01:30 参考9楼给你的代码,这是典型的3分波特率,每个位的间隔为3次中断,收到起始信号时为4个时间中断,就是从1.333的位置开始接受。 |
【PIN_RXD引脚的高低电平这里是如何控制的?】 由发送方进行控制。 控制的逻辑依据串行协议。 接收方由单片机内部嵌入的UART硬件完成,当然也会按照同样的协议进行解码。 |
wulin 发表于 2023-6-5 06:05 TL1 = 0xE8; T0可以用吗 |
大漠落日 发表于 2023-6-5 09:25 就是接收部分的 TL0 = 256 - ((256 - TH0)>>1); 不理解怎么改 |
有逻辑分析仪,厉害 |
用硬件接收,看你的状态,还没有完全搞明白串口通信与接收的采样位关系。先用硬件串口吧,软件要实现一时半会你可能调试不出结果。 |
哈兰德 发表于 2023-6-4 20:48 软件模拟串口示例
|
188610329 发表于 2023-6-5 00:13 接收部分,是从每个比特位的中间部分接收的,不太理解如何从1.3-1.5接收 |
你接收程序有问题, 接收到起始位后,要 错位 半个时间位才能 正确收到数据,即要在收到起始位后,经过1.3~ 1.5个位 的时间后 才开始接收 第一位数据。所以,广泛会用 3分波特率 或4分波特率方式。 |
我理解如下: PIN_RXD是接收数据的引脚,1就是高,0就是低。 以接收 1010 0101为例子举例。 1 . 数据确定是从起始位开始后,RxdBuf = 0; 2.1 RxdBuf = 0 , PIN_RXD这时候接收为高电平,RxdBuf |= 1000 0000 ===> RxdBuf = 1000 0000 2.2 PIN_RXD 接收低电平 ,RxdBuf = 0100 0000 (右移了一位) 2.3 PIN_Rxd接收高电平 , RxdBuff >>= 0010 0000 ==>1010 0000 2.4 PIN_Rxd低, RxdBuf ==> 0101 0000 2.5 Pin_Rxd为低 , RxdBuf ==> 0010 1000 2.6 Pin_Rxd高, Rxdbuf ===>1001 0100 2.7 Pin_Rxd低,RxdBuf ===> 0100 1010 2.8 Pin_Rxd高, RxdBuf ==> 1010 0101 3.发送停止位 |
沙发,详情见下面回复 |