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); // <======== 需要移除
}
其他可能的情况
- TX线过长
- TX接口连接不良,接口有脏污
- 串口工具没有接地或者不良
- 可能的电磁干扰
有示波器的话比较容易调试出来,在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);
}
}
网上找的程序在不知道使用场景时,需要逐行审查,不然容易掉坑里