找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1154|回复: 4
打印 上一主题 下一主题
收起左侧

这个单片机串口通信嵌套程序看不懂,求讲解

[复制链接]
跳转到指定楼层
楼主
ID:424805 发表于 2019-3-26 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个嵌套函数我看不懂,哪位大佬讲一下?

单片机源程序如下:
  1. /************************************************************
  2. 程序功能:串口4发送一个字符
  3. ************************************************************/
  4. void Usart4_SendByte( USART_TypeDef * pUSARTx, u8 ch)
  5. {
  6.     /* 发送一个字节数据到USART */
  7.     USART_SendData(pUSARTx,ch);
  8.     /* 等待发送数据寄存器为空 */
  9.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET)
  10.     {
  11.         ;
  12.     }
  13. }
  14. /************************************************************
  15. 程序功能:串口4发送字符串
  16. ************************************************************/
  17. void Usart4_SendString( USART_TypeDef * pUSARTx, char *str)
  18. {
  19.     unsigned int k=0;
  20.     do
  21.     {
  22.         Usart4_SendByte( pUSARTx, *(str + k) );
  23.         k++;
  24.     }
  25.     while(*(str + k)!='\0');
  26.     /* 等待发送完成 */
  27.     while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  28.         {}
  29. }
  30. /************************************************************
  31. 程序功能:串口4发送一个16位数
  32. ************************************************************/
  33. void Usart4_SendHalfWord( USART_TypeDef * pUSARTx, u16 ch)
  34. {
  35.     uint8_t temp_h, temp_l;
  36.     /* 取出高八位 */
  37.     temp_h = (ch&0XFF00)>>8;
  38.     /* 取出低八位 */
  39.     temp_l = ch&0XFF;
  40.     /* 发送高八位 */
  41.     USART_SendData(pUSARTx,temp_h);
  42.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET)
  43.     {
  44.         ;
  45.     }
  46.     /* 发送低八位 */
  47.     USART_SendData(pUSARTx,temp_l);
  48.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET)
  49.     {
  50.         ;
  51.     }
  52. }
  53. /************************************************************
  54. 程序功能:重定向c库函数printf到串口,重定向后可使用printf函数
  55. ************************************************************/
  56. int fputc(int ch, FILE *f)
  57. {
  58.     /* 发送一个字节数据到串口 */
  59.     USART_SendData(DEBUG_USART4, (uint8_t) ch);
  60.     /* 等待发送完毕 */
  61.     while (USART_GetFlagStatus(DEBUG_USART4, USART_FLAG_TXE) == RESET)
  62.     {
  63.         ;
  64.     }
  65.     return (ch);
  66. }
  67. /************************************************************
  68. 程序功能:重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
  69. ************************************************************/
  70. int fgetc(FILE *f)
  71. {
  72.     /* 等待串口输入数据 */
  73.     while (USART_GetFlagStatus(DEBUG_USART4, USART_FLAG_RXNE) == RESET)
  74.     {
  75.         ;
  76.     }
  77.     return (int)USART_ReceiveData(DEBUG_USART4);
  78. }
复制代码

所有资料51hei提供下载:
新建文本文档.rar (754 Bytes, 下载次数: 8)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:424805 发表于 2019-3-27 13:19 | 只看该作者
快来看一下,哪位会的?
回复

使用道具 举报

板凳
ID:246251 发表于 2019-3-28 09:55 | 只看该作者
有什么不懂得,这不是很简答吗
回复

使用道具 举报

地板
ID:424805 发表于 2019-3-30 00:19 | 只看该作者
new_hand 发表于 2019-3-28 09:55
有什么不懂得,这不是很简答吗

真的不懂,这个程序不经过串口中断,直接以scanf接收数据,printf发送数据。但是最上面那三个函数的形参是怎么从scanf里接收数据并判断的?
回复

使用道具 举报

5#
ID:170498 发表于 2019-3-31 20:37 | 只看该作者
zeroL 发表于 2019-3-30 00:19
真的不懂,这个程序不经过串口中断,直接以scanf接收数据,printf发送数据。但是最上面那三个函数的形参 ...

    1.他是将fgetc重定向了,将串口接收的数据重定向到c库函数fgetc,可以通过这个函数接收一个字符,scanf调用了这个函数,因此可以使用scanf接收串口的数据。printf发送同理。
    2.发送和接收不一定要用中断来处理。发送是MCU主动,因此一般发送不用中断。接收的话一般要用中断,试想一下,要是MCU在处理别的任务时有数据要接收,如果此时等待当前任务处理完才去接收的话,会错过信息。一次接收一般要用中断。
    3.这个是野火的代码,如果还是不明白可以去野火stm32论坛找他们的视频教程,很详细。
    4.这里要用scanf的话要把串口接收中断关掉哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表