这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » [经验]STM32串口发送数据和接收数据方式总结

共15条 1/2 1 2 跳转至

[经验]STM32串口发送数据和接收数据方式总结

工程师
2021-09-16 19:50:13     打赏
串口发送数据
1、串口发送数据最直接的方式就是标准调用库函数 




  1. void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


复制代码

第一个参数是发送的串口号,第二个参数是要发送的数据了。但是用过的朋友应该觉得不好用,一次只能发送单个字符,所以我们有必要根据这个函数加以扩展:




  1. void Send_data(u8 *s) {

  2. while(*s!='\0')


  3.   while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET); 

  4.   USART_SendData(USART1,*s);

  5.   s++;

  6. }

  7. }


复制代码

以上程序的形参就是我们调用该函数时要发送的字符串,这里通过循环调用USART_SendData来一 一发送我们的字符串。




  1. while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET);


复制代码

这句话有必要加,他是用于检查串口是否发送完成的标志,如果不加这句话会发生数据丢失的情况。这个函数只能用于串口1发送。有些时候根据需要,要用到多个串口发送那么就还需要改进这个程序。如下:




  1. void Send_data(USART_TypeDef * USARTx,u8 *s) {

  2. while(*s!='\0')


  3.   while(USART_GetFlagStatus(USARTx,USART_FLAG_TC )==RESET); 

  4.   USART_SendData(USARTx,*s);

  5.   s++;

  6. }

  7. }


复制代码

这样就可实现任意的串口发送。但有一点,我在使用实时操作系统的时候(如UCOS,Freertos等),需考虑函数重入的问题。
当然也可以简单的实现把该函数复制一下,然后修改串口号也可以避免该问题。然而这个函数不能像printf那样传递多个参数,所以还可以在改进,最终程序如下:




  1. void USART_printf ( USART_TypeDef * USARTx, char * Data, ... ) {

  2. const char *s;

  3. int d;   

  4. char buf[16];


  5. va_list ap;

  6. va_start(ap, Data);


  7. while ( * Data != 0 )     // 判断是否到达字符串结束符  {                              

  8.   if ( * Data == 0x5c )  //'\'   {           

  9.    switch ( *++Data )

  10.    {

  11.     case 'r':                 //回车符     USART_SendData(USARTx, 0x0d);

  12.     Data ++;

  13.     break;


  14.     case 'n':                 //换行符     USART_SendData(USARTx, 0x0a); 

  15.     Data ++;

  16.     break;


  17.     default:

  18.     Data ++;

  19.     break;

  20.    }    

  21.   }

  22.   

  23.   else if ( * Data == '%')

  24.   {           //    switch ( *++Data )

  25.    {    

  26.     case 's':            //字符串     s = va_arg(ap, const char *);

  27.     

  28.     for ( ; *s; s++) 

  29.     {

  30.      USART_SendData(USARTx,*s);

  31.      while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );

  32.     }

  33.     

  34.     Data++;

  35.     

  36.     break;


  37.     case 'd':   

  38.      //十进制     d = va_arg(ap, int);

  39.     

  40.     itoa(d, buf, 10);

  41.     

  42.     for (s = buf; *s; s++) 

  43.     {

  44.      USART_SendData(USARTx,*s);

  45.      while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );

  46.     }

  47.     

  48.     Data++;

  49.     

  50.     break;

  51.     

  52.     default:

  53.     Data++;

  54.     

  55.     break;

  56.     

  57.    }   

  58.   }

  59.   

  60.   else USART_SendData(USARTx, *Data++);

  61.   

  62.   while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET );

  63.   

  64. }

  65. }


复制代码

该函数就可以像printf使用可变参数,方便很多。通过观察函数但这个函数只支持了%d,%s的参数,想要支持更多,可以仿照printf的函数写法加以补充。





关键词: STM32     串口     发送     数据     接收     数据     方式         

工程师
2021-09-20 23:37:20     打赏
2楼

非常感谢您的分享


专家
2021-10-19 08:09:27     打赏
3楼

不错,值得学习,谢谢分享


专家
2021-10-19 08:15:10     打赏
4楼

学习了


专家
2021-10-19 08:20:35     打赏
5楼

感谢分享


专家
2021-10-19 08:29:21     打赏
6楼

谢谢分享


专家
2021-10-19 08:31:18     打赏
7楼

谢谢分享


专家
2021-10-26 09:05:19     打赏
8楼

不错,谢谢分享


院士
2021-10-26 09:08:31     打赏
9楼

谢谢分享


专家
2021-10-26 09:13:54     打赏
10楼

谢谢分享


共15条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]