stm串口通信常见问题及解决含第一个字符不能够成功发送

笔者由于项目的需求,做起了stm与PC的串口通信工作。由于是新手,一路上磕磕绊绊,踩了不少坑,这儿做下记录(ennn~,几天不写博客,感觉自己懒了),大家可以参考~

一):分频系数要写正确

          下面是初始化函数:

void Init_UART1(void)
{
    UART1_CR1=0x00;
    UART1_CR3=0x00;
    
    UART1_BRR2=0x00;//2M的计算方式,2000 000/9600=00D0h,BRR2为高四,低四
    UART1_BRR1=0x0D;//BRR1为中间的八位
    
    UART1_CR2=0x08;
}

其中一定要根据自己系统时钟频率来计算相应的分频系数 。以stm8s103f3p6为例,内部有16MHz的高速振荡器,启动后系统用的是它的八分频作为系统时钟源,要想得到9600kbs的波特率,则用两者相除即可。需要注意的UART1_BRR2为高四,低四位,UART1_BRR2为中间的八位。如果写的不正确,则很有可能出现乱码。

二):头文件stdio.h一定要包含

尽管编译的时候,没有包含stdio.h是能通过的,但是却不能够正确输出。笔者起初没有包含,结果愣是奇怪,费了近一天工夫,一步步地调试,还是不行,一脸懵逼,怀疑人生,结果对比别人的工程,然后就#include一下,发现奇迹般地好了。。心里默念三遍:头文件stdio.h一定要包含!头文件stdio.h一定要包含!头文件stdio.h一定要包含!

三):printf转串口实现

具体代码可参考如下:

void UART1_Send(unsigned char dat)
{
    UART1_DR=dat;
    while((UART1_SR&0x40)==0); 
}

int putchar(int c)  
{   
   if('\n'==(char)c)
   {
    UART1_Send('\r');
   }
    UART1_Send((unsigned char)c);
    return (c);  
}

为了使接收端正确地换行,仅有'\n'是不够的,遇到'\n'时,要加上'\r',即'\r\n'代表换行~

四):串口通信第一个字符不能够成功发送

按照上面的步骤,你便发现终于能够比较正确完美地在电脑上看到printf的信息了,但是细心的你仔细一看貌似第一个字母没有打印出来。笔者当时也是如此,愣是调试了近一天时间,还是不知道问题出现在哪了,茫然不知所措,,,然后上网找到了这篇文章串口发送的第一个字节数据会丢失及解决办法,并查阅了书籍,默认情况下UART_SR中的TC为1,代表发送已经完成,可以通过UART_SR,然后写入UART_DR进行清除。因此可以有两个简单的办法,一个是调整发送函数代码的顺序如下:

void UART1_Send(unsigned char dat)
{  
    while((UART1_SR&0x40)==0); 
    UART1_DR=dat;
}
这样就相当于先读UART_SR后写UART_DR。另一个办法就是在通信之前,写一条读的语句如下:
(void)UART1_SR;
printf("\n test start...\n");
一言以蔽之,这两个办法都是可以的,个人比较推荐第一种方法,第二种给人感觉高大上,但是有助于加深记忆↖(^ω^)↗

你可能感兴趣的:(stm开发)