標(biāo)題: 這個單片機(jī)串口通信嵌套程序看不懂,求講解 [打印本頁]

作者: zeroL    時間: 2019-3-26 23:01
標(biāo)題: 這個單片機(jī)串口通信嵌套程序看不懂,求講解
這個嵌套函數(shù)我看不懂,哪位大佬講一下?

單片機(jī)源程序如下:
  1. /************************************************************
  2. 程序功能:串口4發(fā)送一個字符
  3. ************************************************************/
  4. void Usart4_SendByte( USART_TypeDef * pUSARTx, u8 ch)
  5. {
  6.     /* 發(fā)送一個字節(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ā)送一個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ā)送一個字節(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)




作者: zeroL    時間: 2019-3-27 13:19
快來看一下,哪位會的?
作者: new_hand    時間: 2019-3-28 09:55
有什么不懂得,這不是很簡答嗎
作者: zeroL    時間: 2019-3-30 00:19
new_hand 發(fā)表于 2019-3-28 09:55
有什么不懂得,這不是很簡答嗎

真的不懂,這個程序不經(jīng)過串口中斷,直接以scanf接收數(shù)據(jù),printf發(fā)送數(shù)據(jù)。但是最上面那三個函數(shù)的形參是怎么從scanf里接收數(shù)據(jù)并判斷的?
作者: 老馬工作室    時間: 2019-3-31 20:37
zeroL 發(fā)表于 2019-3-30 00:19
真的不懂,這個程序不經(jīng)過串口中斷,直接以scanf接收數(shù)據(jù),printf發(fā)送數(shù)據(jù)。但是最上面那三個函數(shù)的形參 ...

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1