找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1600|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

這個(gè)單片機(jī)串口通信嵌套程序看不懂,求講解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:424805 發(fā)表于 2019-3-26 23:01 | 只看該作者 回帖獎勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)嵌套函數(shù)我看不懂,哪位大佬講一下?

單片機(jī)源程序如下:
  1. /************************************************************
  2. 程序功能:串口4發(fā)送一個(gè)字符
  3. ************************************************************/
  4. void Usart4_SendByte( USART_TypeDef * pUSARTx, u8 ch)
  5. {
  6.     /* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)到USART */
  7.     USART_SendData(pUSARTx,ch);
  8.     /* 等待發(fā)送數(shù)據(jù)寄存器為空 */
  9.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET)
  10.     {
  11.         ;
  12.     }
  13. }
  14. /************************************************************
  15. 程序功能:串口4發(fā)送字符串
  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.     /* 等待發(fā)送完成 */
  27.     while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  28.         {}
  29. }
  30. /************************************************************
  31. 程序功能:串口4發(fā)送一個(gè)16位數(shù)
  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.     /* 發(fā)送高八位 */
  41.     USART_SendData(pUSARTx,temp_h);
  42.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET)
  43.     {
  44.         ;
  45.     }
  46.     /* 發(fā)送低八位 */
  47.     USART_SendData(pUSARTx,temp_l);
  48.     while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET)
  49.     {
  50.         ;
  51.     }
  52. }
  53. /************************************************************
  54. 程序功能:重定向c庫函數(shù)printf到串口,重定向后可使用printf函數(shù)
  55. ************************************************************/
  56. int fputc(int ch, FILE *f)
  57. {
  58.     /* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)到串口 */
  59.     USART_SendData(DEBUG_USART4, (uint8_t) ch);
  60.     /* 等待發(fā)送完畢 */
  61.     while (USART_GetFlagStatus(DEBUG_USART4, USART_FLAG_TXE) == RESET)
  62.     {
  63.         ;
  64.     }
  65.     return (ch);
  66. }
  67. /************************************************************
  68. 程序功能:重定向c庫函數(shù)scanf到串口,重寫向后可使用scanf、getchar等函數(shù)
  69. ************************************************************/
  70. int fgetc(FILE *f)
  71. {
  72.     /* 等待串口輸入數(shù)據(jù) */
  73.     while (USART_GetFlagStatus(DEBUG_USART4, USART_FLAG_RXNE) == RESET)
  74.     {
  75.         ;
  76.     }
  77.     return (int)USART_ReceiveData(DEBUG_USART4);
  78. }
復(fù)制代碼

所有資料51hei提供下載:
新建文本文檔.rar (754 Bytes, 下載次數(shù): 8)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:424805 發(fā)表于 2019-3-27 13:19 | 只看該作者
快來看一下,哪位會的?
回復(fù)

使用道具 舉報(bào)

板凳
ID:246251 發(fā)表于 2019-3-28 09:55 | 只看該作者
有什么不懂得,這不是很簡答嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:424805 發(fā)表于 2019-3-30 00:19 | 只看該作者
new_hand 發(fā)表于 2019-3-28 09:55
有什么不懂得,這不是很簡答嗎

真的不懂,這個(gè)程序不經(jīng)過串口中斷,直接以scanf接收數(shù)據(jù),printf發(fā)送數(shù)據(jù)。但是最上面那三個(gè)函數(shù)的形參是怎么從scanf里接收數(shù)據(jù)并判斷的?
回復(fù)

使用道具 舉報(bào)

5#
ID:170498 發(fā)表于 2019-3-31 20:37 | 只看該作者
zeroL 發(fā)表于 2019-3-30 00:19
真的不懂,這個(gè)程序不經(jīng)過串口中斷,直接以scanf接收數(shù)據(jù),printf發(fā)送數(shù)據(jù)。但是最上面那三個(gè)函數(shù)的形參 ...

    1.他是將fgetc重定向了,將串口接收的數(shù)據(jù)重定向到c庫函數(shù)fgetc,可以通過這個(gè)函數(shù)接收一個(gè)字符,scanf調(diào)用了這個(gè)函數(shù),因此可以使用scanf接收串口的數(shù)據(jù)。printf發(fā)送同理。
    2.發(fā)送和接收不一定要用中斷來處理。發(fā)送是MCU主動,因此一般發(fā)送不用中斷。接收的話一般要用中斷,試想一下,要是MCU在處理別的任務(wù)時(shí)有數(shù)據(jù)要接收,如果此時(shí)等待當(dāng)前任務(wù)處理完才去接收的話,會錯(cuò)過信息。一次接收一般要用中斷。
    3.這個(gè)是野火的代碼,如果還是不明白可以去野火stm32論壇找他們的視頻教程,很詳細(xì)。
    4.這里要用scanf的話要把串口接收中斷關(guān)掉哦
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表