中级会员
- 积分
- 406
- 金钱
- 406
- 注册时间
- 2018-11-20
- 在线时间
- 25 小时
|
先贴出中断函数:
- [plain] view plain copy
- void USART1_IRQHandler(void){
- IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) {
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- USART1_Buffer[i++]=USART_ReceiveData(USART1); //USART1_Buffesh是一个自己定义的接收数组
- if(i>3){
- SendFlag = 1;
- }
- }
- if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){ //USART_IT_TC这里也可替换
- if(Open_Send_Flag){ //这是一个发送的标志
- uart1_sendstring(temp_data);
- USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC
- Open_Send_Flag = 0;
- }
- else{
- USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC
- }
- }
- }
复制代码
发送字符串的函数:
- [plain] view plain copy
- void uart1_sendstring(uint8_t* cp)
- {
- while((*cp)!='\0')
- {
- Usart1_Send_isr(*cp);
- cp++;
- }
- }
复制代码
发送单个字符的函数:
- [plain] view plain copy
- void Usart1_Send_isr(uint8_t ch){
- USART_SendData(USART1, (uint8_t)ch);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断
- }
复制代码
然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //USART_IT_TC
之后再贴出两个简单的串口接收和发送的测试小例子:
第一种:中断接收并把接收到的数据直接发送。
- [plain] view plain copy
- void USART1_IRQHandler(void){
- unsigned char RxData;
- if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- RxData=USART_ReceiveData(USART1);
- RxData = RxData + 1;
- USART_SendData(USART1,RxData);
- }
- }
复制代码
优点:简单,适合很少量数据传输。
缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。
第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。
- [plain] view plain copy
- void USART1_IRQHandler(void){
- if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- USART1_Buffer[i++]=USART_ReceiveData(USART1);
- }
- if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){
- Flag = 1;
- }
- if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){ //溢出,不明白?
- USART_CleaRFlag(USART1,USART_FLAG_ORE);
- USART_ReceiveData(USART1);
- }
- if(Flag){
- for(j = 0;j<20;j++){
- USART_SendData(USART1,USART1_Buffer[j]);
- }
- }
- }
复制代码
相关的stm32串口以及中断相关的资料
|
|