目标(目的+标准)
串口通讯例程
按键开关例程
内容(详细,精准)
1清楚例程目的
2硬件部分
3软件部分:
什么是波特率?什么是分数波特率?
波特率就是调制速率,即单位时间内载波调制状态的变化次数。用来表示单片机在串口通讯时的速度。
上面这句话很难理解波特率是什么。。(什么是调制,什么是载波,什么是调制状态的变化,都有什么状态可以变化?如何进行变化?。。。)
我们避开晦涩难懂的专业词汇,举例子说明波特率是什么。
首先我们先说明一个概念:串口的信息传递速率有时钟频率和波特率共同决定。如何决定呢?举一个例子:
假设系统时钟50MHz,波特率为115200。
①系统时钟50M很好理解,即为时钟周期为1/50M(s)。
同时我们假设:1个时钟周期可以计数1次,那么50M的时钟1s可以计50*10^6个数,这也就是说,每计1个数,需要花费1/50M(s).
②接下来是波特率115200,它的意思是1s传输115200个二进制数,(115200bit)
那么传输1bit需要1/115200 (s) = 8.68 (us)
①+②我们同时考虑时钟频率和波特率:
每传输1bit数据,系统时钟就会数15010^6/115200 = 434个数
也就是说,我们算出了每传输1bit数据,时钟就会计数434次,那么知道这个有什么用呢?
我们先暂且把这个问题放到一边,先看看串口传输是怎么一回事。
③串口传输,先上图:
我们在进行串口数据传输时,往往是以一个字符帧为单位进行传输的。
什么是字符帧呢?从图中很好理解,一个字符帧由起始位、有效数据位,奇偶检验位(可以没有)、停止位组成。
在这里,起始位和停止位是必须的(这两个位就像高中生物里mRNA的起始密码子和终止密码子一样)
有效数据位有8个bit,我们敏锐的发现就是1个Byte(字节)
而奇偶检验位是用于在接收数据时判断接受的数据是否正确,至于如何判断,去翻翻数电课本吧。。
到这里,我们知道了一个字符帧会包含10个bit(不含奇偶检验)而在①+②处,我们推出了每传输1bit数据,时钟会计数434次,那么每传输一个Byte(8个bit)的有效数据,时钟就会计数434*10次,所需的时间为8.68 us * 10 = 86.8 us.
而我们知道一般用ASC II码来表示一个字符,这一个Byte就可以用来存储一个字符,这样的一组码(8个bit)也叫码元。注意啦,比特率和波特率的区别就在于此,波特率指每秒钟传送的码元数,而比特率指每秒种传送的bit数。
在这里我们也能够推导出到波特率的计算公式:
A.波特率115200 = 115200 (位/秒)【这里仅考虑单片机里的波特率】
B.如果没有奇偶检验位,就是将10个bit打包位一个Byte
波特率115200 = 115200 (位/秒) = 115200/10 = 11520(字节/秒)
C.再除以1024,就是KB
波特率115200 = 11520 (字节/秒) = 11.25 (KB/秒)
④采样数据
我们需要知道在哪里采样?什么时候取采样?
看到了那个有效数据位么?我们就是在有效数据里的8个bit分别进行采样。为了保证采样得到的数据是准确无误的,一般在每个bit的最中间进行采样(图)
由上面那张图,我们可以清楚的看到采样的数据为:10101010,化成16进制就是0xAA,这里没有对应ASCII码就是字符 - -||
⑤回答这个问题:
我们算出了每传输1bit数据,时钟就会计数434次,那么知道这个有什么用呢?
其实并没有什么用,我们只想利用这个434来当作一个flag,它用来把控串口通信的进度而已。