欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1610|回復: 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)



回復

使用道具 舉報

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里接收數據并判斷的?
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表