STM8S003 UART1发送接收异常

文章讨论了UART1发送接收过程中遇到的不完整性问题,原因可能是程序中额外发送了停止位0。作者建议审查代码,特别是字符串发送函数,并指出可能的故障点如接口问题、波特率设置和电磁干扰。
摘要由CSDN通过智能技术生成

UART1发送接收不完整

网上找的UART1例程有Bug,在每次发送完String以后,额外发送了停止位0

具体症状为,在每次发送完String以后会截断一部分后续的输出

int putchar (char c)
{
  UART1_SendData8(c);
  while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
 
  return (c);
}

void putstring(char* string)
{
	while(*string)
	{
	    putchar(*string);
		string ++;
	}
    putchar(0); // <======== 需要移除
}

其他可能的情况

  1. TX线过长
  2. TX接口连接不良,接口有脏污
  3. 串口工具没有接地或者不良
  4. 可能的电磁干扰

有示波器的话比较容易调试出来,在115200这样的波特率下,基本不会出现因为波特率过高导致时钟不匹配的问题,或者干扰,当然按照文档来看,是由一定的误码率的,平时短时间应该遇不到

测试上来看,发送后检测UART1_FLAG_TXE,不需要额外检测UART1_FLAG_TC

例程

int putchar (char c)
{
  UART1_SendData8(c);
  while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
 
  return (c);
}

void putstring(char* string)
{
	while(*string)
	{
	    putchar(*string);
		string ++;
	}
}

static void CLK_Config(void)
{
    CLK_DeInit();
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);      //f_Master = HSI/1 = 16MHz
    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);            //f_CPU = f_Master/1 = 16MHz
    while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)!=SET);     //wait until HSI ready
}

void UART_Config(void){
  //PD5 UART TX
  //PD6 UART RX
  UART1_DeInit();
  UART1_Init((uint32_t)115200, 
             UART1_WORDLENGTH_8D, 
             UART1_STOPBITS_1, 
             UART1_PARITY_NO,
             UART1_SYNCMODE_CLOCK_DISABLE, 
             UART1_MODE_TXRX_ENABLE
             );
  UART1_Cmd(ENABLE);
}

void main(void)
{
  CLK_Config();
  UART_Config();        //PD5 UART TX           PD6 UART RX
  
  /* Infinite loop */
  while (1)
  {
    putstring("Channel 2: ");   
    putstring("\r\n");
    putstring("Channel 3: "); 
    putstring("\r\n");
    delay_ms(1000);
  }
}

网上找的程序在不知道使用场景时,需要逐行审查,不然容易掉坑里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值