1.串口是如何发送数据的?
一般说来,串口发送数据是往数据寄存器sbuf填写数据,一个字节一个字节的写入,如果有串口中断,那么发送完一个字节的数据,就会进入串口中断一次,进入串口中断一定要清中断标志位,否则串口会一直进入串口中断,具体表现可能是:发送10个字节的数据,只有一个字节数据是正确的。
2.关于字节序:大端。小端
大端模式:指数据的高字节保存在内存的低地址
小端模式:指数据的高字节保存在内存的高地址
Bit-endian
0x00000001 -- 12
0x00000002 -- 34
0x00000003 -- 56
0x00000004 -- 78
Little-endian
0x00000001 -- 78
0x00000002 -- 56
0x00000003 -- 34
0x00000004 -- 12
//验证方法:
#include "stdio.h"
int main(void)
{
unsigned int X = 0x12345678;
char* a = &X; //则a指向X的低地址,
printf("%d\n",a[0]);
printf("%d\n",a[1]);
printf("%d\n",a[2]);
printf("%d\n",a[3]);
}
//打印a[0],a[1],a[2],a[3],若为0x12,0x34,0x56,0x78;则代表为大端模式,反之为小端。
3.关于LSB和MSB:
LSB:低位在前发送。MSB高位在前发送。
举例:比如我要发送0x75;转到位字节则为 0111 0101 ,如果是MSB,发送的位的顺序即为0111 0101,若为LSB,则发送的顺序就是1010 1110。
如何验证:这个有条件就可以看示波器,看发送0x75,实际的波形是怎么样的。
4.关于串口波特率和起始位,数据位,校验位,停止位:
https://blog.csdn.net/a371132/article/details/90727740//这篇文章写得很详细,补充一点点。
如果波特率为9600,那么代表一秒传输9600Bytes,那么1000ms/9600 = 0.104ms传输一个字节数据,那么一位应该是104ms/8 =130us,也就是说如果按9600B/s的速率传输数据,示波器上一位的数据的周期为130us左右。
示波器波形:起始位(1)----数据位(8)----校验位(1)----停止位(1)
(以发送0x7E,MSB,8N1为例)波形为 0 0111 1110 1 ,每一位的波形(波特率 ==9600的话)周期为130us左右。