标题: 请朋友们帮我看下这个模拟串口接收单片机程序,有一点不理解 [打印本页]

作者: ZHAOBAO511    时间: 2022-1-18 18:04
标题: 请朋友们帮我看下这个模拟串口接收单片机程序,有一点不理解
case 0:if(usart4.receive_juge_cnt == 5)//起始位
                                                        {
                                                                if(UART4_RX_READ)//错误的起始位
                                                                {
                                                                        usart4.receive_juge_cnt = 0xffff;
                                                                }
                                                                usart4.receive_bit_cnt++;
                                                        }
                                break;
                        case 1:if(usart4.receive_juge_cnt == 15)//bit0
                                                        {
                                                                usart4.receive_temp >>= 1;
                                                                if(UART4_RX_READ) usart4.receive_temp |= 0x8000;
                                                                usart4.receive_bit_cnt++;//判断下一个bit
                                                        }
                                break;
usart4.receive_juge_cnt ++;
上面的程序在中断运行,9600波特率,每10US中断一次,问题是+5次就能判断是起始位?然后在15次就能判断是第一位?只看到判断为高时,没看到判断为低时,而我们在发送时宽度变化很大的。


作者: 人工置顶员    时间: 2022-1-18 22:51
顶一下
作者: tzs233    时间: 2022-1-19 09:09
了解一下波特率的概念。9600波特率的话每秒可以传输9600个二进制位,也就是9600/8个英文字母的数据量,也就是1200个字节,大约1.2KB。
就算你10us中断一次,期间也能发送96个二进制位,够用了。不够你把波特率设置再高点。
作者: 小黑屋525    时间: 2022-1-19 09:34
既然要找问题,先得弄清楚串口的原理,,串口在不发送数据的时候是空闲状态(引脚为高电平),当需要发送数据的时候,TX端先发送起始位(发送一位低电平),波特率9600,发送一位的时间就是1000000 / 9600 = 104uS,10uS的中断检测5次就是相当于50uS检测一次,当然就可以判断起始位了啊,至于你说的判断高电平,进不了高电平的判断自然就是低电平了啊,这点逻辑还是应该要有,,,最后的一点就是,9600的波特率,宽度就尽量靠近104uS发送一个bit,并不是一味地宽就有效,就相当于9600的接受速率,接受的4800的当然会出问题了。
作者: ZHAOBAO511    时间: 2022-1-19 11:49
人工置顶员 发表于 2022-1-18 22:51
顶一下

谢谢参与。
作者: ZHAOBAO511    时间: 2022-1-19 11:49
tzs233 发表于 2022-1-19 09:09
了解一下波特率的概念。9600波特率的话每秒可以传输9600个二进制位,也就是9600/8个英文字母的数据量,也就 ...

谢谢,这个是接收程序,我再看看。
作者: ZHAOBAO511    时间: 2022-1-19 11:50
小黑屋525 发表于 2022-1-19 09:34
既然要找问题,先得弄清楚串口的原理,,串口在不发送数据的时候是空闲状态(引脚为高电平),当需要发送数 ...

谢谢,您这个应该是最佳答案,基本给了我一个思路,我自己再找找。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1