Serial Communication
串口通信,一种发送消息的通信方式。
串,指的是发数据的方式:一位一位串行发,并行是可能有多路通道,每路同时发一个数据,多路同时到达。
串口通信有单工 Simplex,半双工 Half Duplex,全双工 Full Duplex。
两种传输方式:同步 Synchronous,共用一个时钟;异步 Asynchronous,有各自的时钟。
同步很简单,发送方接收方比如都规定时钟信号下降沿收发。
异步:需要通过异步通讯协议 Asynchronous Comm. Protocol 来协调。
1位起始位标志开始传输,7/8/9位数据位,1位可选奇偶校验位,1位停止位。
RT两方需要有相同的波特率。
当然这只是最简单的串口通信因为只有双方。如果更多方通信我们需要校验地址来判断是哪个发给哪个;数据需要更复杂的校验方式。
异步通信不需要同步时钟之类电路,开销小,但是开发起来难度大一些因为需要起始结束位啥的。
RS232
异步通信,Reversed Polarity 标准电压(-3-15是1,315是0.还有一些其他标准比如TTL是+5为1,-5为0.)
发送数据有两种类型,ascii码和二进制,都得转化为二进制传输。
uart
针对stm32f401.
全双工异步串口。
为了处理RT缓冲数据(因为发收数据需要时间)我们可以通过缓冲区数组,头指针表示已经发到的位置,尾指针表示要发的数据的结尾。增加新数据,尾指针++;发一个数据,头指针++直到碰到尾。
原来发送方一直是发高电平,start frame 起始帧是1帧低电平来表示开始发数据了。
如何判断是1帧低电平?通过在这一帧里多次采样判断是不是真的是一帧低电平。
为什么多次采样?因为异步两个信号有一定的偏移,多次采样准,能确定是不是真的一整帧都低电平。
采样是有一定采样率的,不是说真的能像模拟信号一样一直采。
采样率 oversampling=16: 这个是最大可以达到的采样频率而不是真的一帧采了16次。
接收方首先第一次检测到0位,开始怀疑:有可能是串口有消息。这是start frame的第一次采样。
然后每隔一帧检测一次,3 5 7检测3次,如果2个都是0,说明确实有可能。
然后连着检测8910,如果还是2个0,说明确实是start frame。
8采样率因为采样间隔长了,更容易碰到左右边界的高电平,所以容错率低。但是速度更快。
计算
波特率计算:
T x / R x ( b a u d ) = f P C L K 8 ∗ ( 2 − O V E R 8 ) ∗ U S A R T D I V T_x/R_x(baud)=\frac{f_{PCLK}}{8*(2-OVER8)*USARTDIV} Tx/Rx(baud)=8∗(2−OVER8)∗USARTDIVfPCLK
OVER8是过采样率,fPCLK是时钟频率。
USARTDIV是一个浮点数
USARTDIV浮点数怎么存储?通过算法转化为十六进制。
小数部分用一个16进制位表示,比如例1是C也就是12,转换后即为12/16也就是0.75.
例2转换为一位16进制,就是0.62*16约等于10也就是A。
整数部分直接转换十六进制即可,例2的25转为19,例1的27转为1B。
然后整数小数部分拼接起来(最多3个整数位,1个小数位,32位寄存器)。