之前已經實現了在stm32中移植printf函數和scanf函數,相信很多網友也已經熟練掌握這個技能了。最近在項目中遇到了問題,需要在串口助手中向下位機stm32寫整型或者浮點型數據。這個時候只能使用串口中斷接收函數。
void USART1_IRQHandler(void)
{
uint8_t ch;
while(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
ch=USART_ReceiveData(USART1);
}
}
但是很快發現程序這樣寫過于簡陋,只能接收單個字符,不符合我的要求,然后參考網上例程又將串口接收中斷函數進行改動。改為如下形式:
#define RxBufferSize 100 //接收數組定義盡量大點
uint8_t RxBuffer1[RxBufferSize ];
__IO uint8_t RxCounter= 0x00; //接收計數
uint8_t NbrOfDataToRead = RxBufferSize ;
/***************以上變量均為全局變量******************/
void USART1_IRQHandler(void)
{
while(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RxBuffer1[RxCounter++] = USART_ReceiveData(USART1);
if(RxCounter1 == NbrOfDataToRead1) //如果達到最大計數,則不進行接收,中斷關閉
{
USART_ITConfig(USARTy, USART_IT_RXNE, DISABLE);
}
}
}
上面的方面實現了將串口中斷接收到的字符保存在數組中,可是問題還是來了,就是保存在數組中的數據是單個字符,并不能是我需要的整型或者浮點型數據,不能直接使用。感覺又白忙活了一天。
又在網上找資料,有人提了頭文件#include "stdio.h"中的 sscanf函數,其函數原型為:
#pragma __scanf_args
extern _ARMABI int sscanf(const char * __restrict /*s*/,
const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1,2)));
/*
* is equivalent to fscanf except that the argument s specifies a string
* from which the input is to be obtained, rather than from a stream.
* Reaching the end of the string is equivalent to encountering end-of-file
* for the fscanf function.
* Returns: the value of the macro EOF if an input failure occurs before any
* conversion. Otherwise, the scanf function returns the number of
* input items assigned, which can be fewer than provided for, or
* even zero, in the event of an early matching failure.
看到了這里終于找到出路了,sscanf()函數的作用很強大,這里不再贅述,感興趣的網友可以自己百度下,介紹的很詳細,我在這里只提及它的一個功能,就是可以把字符數組轉換成字符串,大家想想,只要能夠得到字符串,那么剩下的就簡單多了。話不多說,直接來干貨,下面給出如何將串口中斷函數接收到的字符數組轉換成字符串:
void USART1_IRQHandler(void)
{
static __IO uint8_t i=0;
char str1[100];
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
ch[i++] = USART_ReceiveData(USART1);
if(ch[i-1] == '*')
{
sscanf(ch,"%[^*]",str1); //利用sscanf函數把字符數組轉換成字符串,"%[^*]"表示取數據到*為止
convalue=atof(str1); //利用atof函數把字符串轉換成浮點型數據
i=0;
}
}
}
上面的程序就是終極程序了,我來大概說明下:同理我先把接收的數據放到字符數組ch[]里面,我的結束標志‘*’,當判斷接收到‘*'時,表示接收完畢,然后進入if語句,利用sscanf函數,把字符數組轉換成字符串str1,然后我用函數atof()把字符串str1轉換成浮點型數據并賦值給全局變量convalue,以便隨時調用。
這樣我就可以在串口上發送數據,通過串口中斷接收函數,得到數據。
上一篇:STM32中的一些小坑-ADC通道設置-寫FLASH
下一篇:STM32F1XX系列 HAL庫 CAN大量收發數據
推薦閱讀
史海拾趣
隨著全球LED市場的日益成熟,競爭也日趨激烈。面對這一形勢,Cree通過收購和出售的方式,逐漸調整了其在LED市場的主要業務。這一戰略調整使得Cree能夠專注于更高端、更具技術含量的LED產品研發和生產,從而保持了其在行業內的領先地位。
隨著科技的不斷進步,Axon' Cable公司逐漸將業務拓展至航空航天領域。公司研發出了一系列高性能、高可靠性的數據網絡系統和連接器產品,成功應用于眾多重要的航空航天項目中。這些產品的成功應用不僅提升了Axon' Cable在航空航天領域的知名度,也為公司帶來了豐厚的利潤和更廣闊的發展空間。
Axon' Cable公司自1965年在法國成立起,便致力于通訊連接器的研發與生產。在創業初期,公司面臨著資金短缺、技術瓶頸和市場競爭的諸多挑戰。然而,Axon' Cable憑借其堅定的信念和不懈的努力,逐步突破了技術難關,并成功開發出了一系列具有競爭力的產品。這些產品在市場上得到了廣泛認可,為公司的后續發展奠定了堅實的基礎。
CAROLCABLE公司的創立,標志著電子線纜行業迎來了一位新的競爭者。在電子科技飛速發展的時代背景下,創始人憑借對線纜技術的深刻理解和市場需求的敏銳洞察,決定創立CAROLCABLE公司。公司初期,面臨著資金短缺、技術瓶頸和市場認知度低等多重挑戰。然而,創始人憑借著堅定的信念和不懈的努力,帶領團隊克服了一個又一個困難。他們積極研發新產品,優化生產工藝,提高產品質量,逐漸在市場上站穩了腳跟。
隨著公司業務的不斷拓展,CAROLCABLE開始與一些知名的電子企業建立合作關系,為其提供高質量的線纜產品。這些合作不僅為公司帶來了穩定的訂單和收入,也進一步提升了CAROLCABLE在行業內的知名度和影響力。
Advanced Power Solutions公司自創立之初,就致力于電源管理技術的研發。在一次偶然的實驗中,公司的研發團隊發現了一種新的電源轉換技術,可以顯著提高能源利用效率。公司迅速投入資源,完善這項技術,并成功將其應用于新產品中。這款高效能的產品迅速在市場上獲得了認可,為公司帶來了可觀的收益,也奠定了公司在電源管理領域的領先地位。
一般我們習慣于把HDL綜合、仿真、然后選定合適的FPGA器件實現,系統能正常工作,也就OK了。對于想把FPGA做的更高深和細致,切實發揮FPGA效用的工程師來說,僅僅做到這些可能還不夠,詳細閱讀了一些代碼,也接觸了一些通信類公司內做FPGA算法的高手 ...… 查看全部問答∨ |
|
大家好,請問有沒有哪位使用過斷點寄存器,如何對其進行初始化呢,我使用的是s12的freescale的芯片。 有類似的經驗均可。 想通過設置斷點寄存器,實現斷點的設置,可是試驗沒有成功,不知如何進行,請大家幫忙! 謝謝!… 查看全部問答∨ |
我的winbase.h文件讓我寫錯了 改不回去了 誰安裝了EVC 麻煩把這個文件粘貼給我唄 謝謝大家了 郵箱:zhaofei_33101@163.com 文件路徑C:\\Program Files\\Windows CE Tools\\wce420\\POCKET PC 2003\\Include\\Armv4 winbase.h … 查看全部問答∨ |
還是老話題,bootload,嘿嘿 RO(包括只讀的code和數據啦)在init.S中我知道過程了 但是為什么我怎么沒有找到RW的copy過程,這個肯定是需要的吧。 因為這個RW連同RO生成個bin文件都被放到nand中,沒有對于RW的復制,怎么運行程序。 (雖然我在 ...… 查看全部問答∨ |
|
請教大家個問題,在看ZLG在M3中移植uC/OS-ii時,資料上有這樣一句話:系統時鐘節拍中斷和PendSV中斷的優先級一并設為最低.的確他的例程也是這樣設置的. NVIC_SYSPRI2 EQU &n ...… 查看全部問答∨ |
stm32f407 fsmc 驅動 320×240點tft 偶爾閃爍 基本上,標題都說了問題。 補充一下背景 程序上了 rtx——不過是封裝好的,我不用動; 板上倒沒啥特別的東西 就是有兩路 磁保繼電器驅動,但是和 主電源是隔離的。 而且也試了磁保繼電器動作時,也沒發現屏幕會閃。 但是在做實驗的房間 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 將低功耗設計進行到底——評論、轉發贏大禮!
- 芯幣競拍:感恩教師節專場
- Keysight示波器主題月有獎系列活動之 注冊大獎天天抽 搶樓踩中亦有獎
- Microchip有獎直播:VectorBlox™ SDK 報名中
- 有獎直播|ADI 慣性MEMS應用那些事
- 借助 Microchip 生態系統中的 PIC® 和 AVR® 單片機開啟嵌入式到云端之旅 系列在線研討會
- 帶你零起點入門STM32(專為嵌入式應用而開發的內核)
- 福祿克首款熱成像萬用表Fluke-279FC 即將上市!填寫問卷贏好禮嘍!
- EEWorld Datasheet 伴你同行!快來領取200芯積分福利啦~
- 泰克福袋:示伴功倍,萬能福袋派送中