波特率位时间计算
- 波特率9600,数据位8,无效验,1停止位。
/**1 个起始位,8 个数据位,0 个校验位,1 个停止位,
* :8,N,1;8 个数据位,一个停止位,无校验位。
* 波特率:9600,位宽度:8,停止位:1
* 传输一个字节(8 位)的数据,在总线上产生 10 个电平变换,也就是串行总线上,需要 10 位,才能发送 1 个字节数据
* 1 秒可以发送 9600 位,那么用 9600/10 ,就是1秒可以发送 960 个字节数据,
* 则每发送一个字节需要的时间就是:1/960 ~= 0.00104166…s ~= 1.0416667 ms。
*/
- 波特率为
9600
位时间处理函数
在Keil编译环境下测试
/*STC15系列库函数与例程测试版V2.0\库函数*/
void BitTime(void)
{
u16 i;
i = ((MAIN_Fosc / 100) * 104) / 130000L - 1; //MAIN_Fosc主时钟晶振频率
while(--i);
}
-
如果波特率位9600的2倍,19200的波特率那么位处理时间函数,就是将原来的
104
除以2
-
波特率19200,数据位8,无效验,1停止位。
void BitTime(void)
{
u16 i;
i = ((MAIN_Fosc / 100) * 52) / 130000L - 1; //MAIN_Fosc主时钟晶振频率
while(--i);
}
- 波特率4800,数据位8,无效验,1停止位。
void BitTime(void)
{
u16 i;
i = ((MAIN_Fosc / 100) * 208) / 130000L - 1; //MAIN_Fosc主时钟晶振频率
while(--i);
}
- 波特率115200,数据位8,无效验,1停止位。也就是9600的12倍
如果下面的
8
参数改为9
会出现乱码。
void BitTime(void)
{
u16 i;
i = ((MAIN_Fosc / 100) * 8) / 130000L - 1; //MAIN_Fosc主时钟晶振频率
while(--i);
}
VSCode PlatformIO编译环境下的位处理函数差异
- 波特率
9600
,软串口调试模式下测试
void BitTime(void)
{
uint16_t i;
i = (16 * 80) / 13 - 2; //i=96
while(--i);
}
- 波特率
19200
(也就是9600的2倍速率),软串口调试模式下测试
void BitTime(void)
{
uint16_t i;
i = (16 * 40) / 13 - 3; //i=46
while(--i);
}
- 波特率
4800
(也就是9600的1/2倍速率),软串口调试模式下测试
void BitTime(void)
{
uint16_t i;
i = (16 * 160) / 13 -3; //后面捡2或者都3都可以
while(--i);
}
在
VSCode PlatformIO
编译环境下,其他波特率尝试了测试了好多参数都是乱码。
综上所述,在VSCode PlatformIO编译环境下,代码执行效率要低一些,为什么这么说,在相同波特率9600情况下,位处理时间Keil环境下是104
,在VSCode PlatformIO
编译环境下是80
。
- 在以VSCode PlatformIO编译环境下开发STC系列单片机时,如果使用软串口作为调试输出,注意位处理时间不能按照在
Keil
环境下的相关参数照搬,否则输出将会是乱码。 - 在以VSCode PlatformIO编译环境下开发STC系列单片机时,软串口的波特率设置最好是以波特率:
9600
为基准来设置,或者以9600的合适倍率的波特率进行设置。例如2倍的19200
,4800
。