99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

STM32--HAL庫--UART使用

寫在前面的話歡迎大家在評論區指正錯誤,該博文是我在這幾天使用hal庫的時候碰到的問題的記錄,對于暫時沒有寫的像dma、阻塞接收等函數,在后期如果我用道的話,我也會在該博文里面更新。當讓也歡迎大家在評論區指正。

函數在這里不介紹關于DMA的操作,只是用有關串口的阻塞和非阻塞函數。

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

以上4個分別是串口的阻塞接受,發送和非阻塞的接受和發送。(關于阻塞和非阻塞,阻塞的過程cpu是需要等待的,而非阻塞的過程相當于中斷)

關于在使用的時候遇到的問題發送HAL_UART_Transmit在發送方面,使用HAL_UART_Transmit阻塞數據發送的時候,一定要計算好發送數據的時間。如果發送時間到了,但是數據還沒有發送完成的話,會導致沒有發送的數據丟失。

HAL_UART_Transmit_IT該函數是以中斷的方式發送的數據,是非阻塞的。在使用的時候,可以寫成類似printf的函數。在這里我參照的是正點原子庫函數版本改過來的。

void u2_printf(char *str,...)
{
	uint16_t j; 
	va_list ap; 
	va_start(ap,str);
	vsprintf((char*)USART2_T_M,str,ap);
	va_end(ap);
	HAL_UART_Transmit_IT(&huart2,(uint8_t *)USART2_T_M,strlen((const char*)USART2_T_M));
}

但是該函數還存在問題,在字符串中默認0x00是一個字符串的接受。所以自己寫的這種類printf的函數并不能在字符串中間加入0x00進行數據發送。(0x00一般在某些模塊的數據通信中會使用到)但是使用半主機模式下的printf函數可以解決該問題。

使用printf函數這一部分代碼我參照的是正點原子的給出的代碼,直接改過來使用的。使用的是半主機模式下的printf函數。

#if 1
#pragma import(__use_no_semihosting)             
//標準庫需要的支持函數                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定義_sys_exit()以避免使用半主機模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定義fputc函數 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循環發送,直到發送完畢   
    USART1->DR = (uint8_t) ch;      
	return ch;
}
#endif

在這里面,通過更改USART1修改映射串口。

接收阻塞模式下的接收函數沒有測試過,就不在這里寫了。以后有機會用到了,會進行添加。

HAL_UART_Receive_IT使用中斷的方式進行接受數據,在這里需要注意的一個點是,使用中斷的方式接收到數據之后,需要在中斷里面在調用一次HAL_UART_Receive_IT函數,重新開啟下一次數據接收,否則會導致,接收完一次數據之后,不會接收下一次數據。

HAL_UART_Receive_IT(&huart2,&usart2_rdata,1);  
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  
{
	if(huart->Instance == USART2)  //串口屏,接收中斷
	{
	HAL_UART_Receive_IT(&huart2,&usart2_rdata,1);
	}
}

在這里我是用的是,接收一個字符后就會觸發一次中斷。當然也可以一次接收多個字符數據。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 6
收藏 3
關注 11
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 人妻少妇精品无码专区 | 亚洲国产综合精品中久 | 国产内射合集颜射 | 日韩不卡一二区 | 亚洲美女视频 | 97夜夜澡人人爽人人喊中国片 | 国产在线精品无码不卡手机免费 | 成人国产一区二区三区精品麻豆 | 91国在线高清视频 | 国产夫妻自拍av | 美国黄色片子 | 超级碰碰人妻中文字幕 | 午夜天堂精品 | 欧美日韩精品一区二区三区在线观看 | 色播影院性播影院私人影院 | 人人爽人人爽人人片A免费 国产国语农村妇女偷人视频 | 欧美精品亚洲一区 | 日本成本人片免费网站 | 日本天堂视频在线观看 | 中国精品视频久久久久久 | 日比视频在线观看 | yellow高清在线观看大全 | 日本不卡一区二区三区 | 动漫精品h| 国产熟女一区二区三区四区五区 | 欧美综合一区二区 | 我的妺妺h伦浴室无码视频 国产激情无码视频在线播放性色 | 黄色网站免费观看视频 | 亚洲AV无码AV男人的天堂不卡 | 中国少妇内射XXXXⅩ | 92国产精品午夜福利免费 | 日本A级作爱片金瓶双艳 | 久久勉费视频 | 一本久久知道综合久久 | 久久99精品久久久久久水蜜桃 | 亚洲韩国精品无码一区二区三区 | 四虎成人免费视频在线播放 | 精品AV无码国产一区二区 | 国语国产精精品国产国语清晰对话 | 夜福利视频 | 在线看福利中文字幕人妻 |