之前已經(jīng)實現(xiàn)了在stm32中移植printf函數(shù)和scanf函數(shù),相信很多網(wǎng)友也已經(jīng)熟練掌握這個技能了。最近在項目中遇到了問題,需要在串口助手中向下位機(jī)stm32寫整型或者浮點型數(shù)據(jù)。這個時候只能使用串口中斷接收函數(shù)。
void USART1_IRQHandler(void)
{
uint8_t ch;
while(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
ch=USART_ReceiveData(USART1);
}
}
但是很快發(fā)現(xiàn)程序這樣寫過于簡陋,只能接收單個字符,不符合我的要求,然后參考網(wǎng)上例程又將串口接收中斷函數(shù)進(jìn)行改動。改為如下形式:
#define RxBufferSize 100 //接收數(shù)組定義盡量大點
uint8_t RxBuffer1[RxBufferSize ];
__IO uint8_t RxCounter= 0x00; //接收計數(shù)
uint8_t NbrOfDataToRead = RxBufferSize ;
/***************以上變量均為全局變量******************/
void USART1_IRQHandler(void)
{
while(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RxBuffer1[RxCounter++] = USART_ReceiveData(USART1);
if(RxCounter1 == NbrOfDataToRead1) //如果達(dá)到最大計數(shù),則不進(jìn)行接收,中斷關(guān)閉
{
USART_ITConfig(USARTy, USART_IT_RXNE, DISABLE);
}
}
}
上面的方面實現(xiàn)了將串口中斷接收到的字符保存在數(shù)組中,可是問題還是來了,就是保存在數(shù)組中的數(shù)據(jù)是單個字符,并不能是我需要的整型或者浮點型數(shù)據(jù),不能直接使用。感覺又白忙活了一天。
又在網(wǎng)上找資料,有人提了頭文件#include "stdio.h"中的 sscanf函數(shù),其函數(shù)原型為:
#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()函數(shù)的作用很強大,這里不再贅述,感興趣的網(wǎng)友可以自己百度下,介紹的很詳細(xì),我在這里只提及它的一個功能,就是可以把字符數(shù)組轉(zhuǎn)換成字符串,大家想想,只要能夠得到字符串,那么剩下的就簡單多了。話不多說,直接來干貨,下面給出如何將串口中斷函數(shù)接收到的字符數(shù)組轉(zhuǎn)換成字符串:
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函數(shù)把字符數(shù)組轉(zhuǎn)換成字符串,"%[^*]"表示取數(shù)據(jù)到*為止
convalue=atof(str1); //利用atof函數(shù)把字符串轉(zhuǎn)換成浮點型數(shù)據(jù)
i=0;
}
}
}
上面的程序就是終極程序了,我來大概說明下:同理我先把接收的數(shù)據(jù)放到字符數(shù)組ch[]里面,我的結(jié)束標(biāo)志‘*’,當(dāng)判斷接收到‘*'時,表示接收完畢,然后進(jìn)入if語句,利用sscanf函數(shù),把字符數(shù)組轉(zhuǎn)換成字符串str1,然后我用函數(shù)atof()把字符串str1轉(zhuǎn)換成浮點型數(shù)據(jù)并賦值給全局變量convalue,以便隨時調(diào)用。
這樣我就可以在串口上發(fā)送數(shù)據(jù),通過串口中斷接收函數(shù),得到數(shù)據(jù)。
上一篇:STM32中的一些小坑-ADC通道設(shè)置-寫FLASH
下一篇:STM32F1XX系列 HAL庫 CAN大量收發(fā)數(shù)據(jù)
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- ROHM推出“PFC+反激控制參考設(shè)計”,助力實現(xiàn)更小巧的電源設(shè)計!
- 實現(xiàn)自我溝通和與世界溝通的新方式
- 上汽集團(tuán)將推10萬級半固態(tài)電池車型
- Bourns 推出其最小封裝尺寸 AEC-Q200 認(rèn)證車規(guī)級厚膜電阻
- 特斯拉大量使用激光雷達(dá)!
- 為何只有特斯拉采用PC芯片,而其他車企采用手機(jī)級車規(guī)芯片?
- 孚能科技:全固態(tài)電池進(jìn)入中試生產(chǎn)階段,計劃年底建成 0.2GWh 中試線
- 三星顯示獲梅賽德斯-邁巴赫S級48英寸OLED屏幕訂單
- Clearmotion全主動懸掛系統(tǒng)將搭載保時捷,蔚來ET9已應(yīng)用
- R-SARC上車國產(chǎn)車型 京西智行讓智能底盤科技平權(quán)
- 有獎直播|魏德米勒 OMNIMATE® 聯(lián)接技術(shù)的創(chuàng)新發(fā)展
- EEWorld邀你來拆解(第五期):拆拆排插學(xué)評電路
- 有獎直播:新能源行業(yè)中的電學(xué)測試與校準(zhǔn)應(yīng)用
- 【EEWORLD第二十四屆】2011年03月社區(qū)明星人物揭曉!
- EEWORLD大學(xué)堂3月精彩視頻&課程快報
- 羅德與施瓦茨-車載以太網(wǎng)及其一致性測試方案 回饋您的需求 看視頻贏好禮
- 【已結(jié)束】直播“戴”“芯”:英飛凌可穿戴設(shè)備保姆級解決方案
- Microchip有獎問答 | 新品 MCU 獨立于內(nèi)核的外設(shè)(CIP)技術(shù)解密
- 有獎直播|物聯(lián)網(wǎng)時代的典型應(yīng)用
- 【EEWORLD帶你DIY】數(shù)字示波器V2.0火熱進(jìn)行中......
- 蘋果將推出內(nèi)置獨立音頻+冷卻系統(tǒng)Apple Watch
- AI技術(shù)走進(jìn)校園 理應(yīng)去粗取精
- 谷歌對隱私問題下重手!能否避免Facebook重蹈覆轍
- 蘋果公布人工智能車輛門鎖專利
- 高通工程師獲歐洲專利局終身成就獎提名
- 新易盛:具豐富5G系列產(chǎn)品 部分產(chǎn)品已出貨
- 靶材利用率高于80%,上方自研G8.6代新型顯示PVD裝備順利發(fā)貨
- 潘九堂:小米向華為、聯(lián)想、格力等優(yōu)秀企業(yè)學(xué)習(xí)
- 三星又投3.6億美元在印度建立生產(chǎn)線
- 5G帶動移動業(yè)務(wù),韓SKT 19年將擁有700萬5G用戶