【STC单片机】在不同编译环境下波特率位时间计算差异

波特率位时间计算


  • 波特率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);
}

【STC单片机】在不同编译环境下波特率位时间计算差异

VSCode PlatformIO编译环境下的位处理函数差异

  • 波特率9600,软串口调试模式下测试
void BitTime(void)
{
	 uint16_t  i;
     i = (16 * 80) / 13 - 2; //i=96
	while(--i);
}

【STC单片机】在不同编译环境下波特率位时间计算差异

  • 波特率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倍的192004800

STC15库函数可以在官方的《STC15系列库函数与例程测试版V2.0》里面,\库函数

【STC单片机】在不同编译环境下波特率位时间计算差异

【STC单片机】在不同编译环境下波特率位时间计算差异

上一篇:详解RecyclerView下拉刷新与上拉更多


下一篇:习题13(结构体)