stm32串口发送可以进入中断但没有数据显示 2C

程序功能是:若接收到数据0x55,则发送接收到的数据(0x55)。

但现在问题是:通过串口助手发送0x55,已经进入接收中断接受到数据,然后通过SendData函数发送数据,能进入发送中断,但是串口助手却没有显示0x55(好像是数据并没有发送出去)

/*头文件*/
#ifndef HEAD_H
#define HEAD_H

#include
#include
#include
#include
#include
#include "stm32f10x_flash.h"
//#include
//#include

void NVIC_Configuration(void);
void RCC_Configuration(void);
void Usart_Initial(void);
void gpio_Init(void);
void Delayms(uint16_t ms);

extern uint16_t rece;

#endif

/*函数*/
#include "head.h"

void NVIC_Configuration(void){ //ÖжÏÓÅÏȼ¶ÉèÖÃ
NVIC_InitTypeDef NVIC_InitStruc;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStruc.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruc.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruc.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruc.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStruc);

}

void RCC_Configuration(void){
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(RCC_WaitForHSEStartUp() == SUCCESS) {
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY==RESET)) {}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08){}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
}

void Usart_Initial(void){
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockStructure;

USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Parity  = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;

// USART_ClockStructure.USART_Clock = USART_Clock_Disable;
// USART_ClockStructure.USART_CPHA = USART_CPHA_2Edge;
// USART_ClockStructure.USART_CPOL = USART_CPOL_Low;
// USART_ClockStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockStructInit(&USART_ClockStructure);

USART_Init(USART1,&USART_InitStructure);
USART_ClockInit(USART1,&USART_ClockStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

// USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
// USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
// USART_WakeUpConfig(USART1, USART_WakeUp_IdleLine);
USART_Cmd(USART1,ENABLE);

}

void gpio_Init(void){

GPIO_InitTypeDef GPIO_InitSTA;
GPIO_InitTypeDef GPIO_InitSTB;

/* GPIO_PinLockConfig(GPIOB,GPIO_Pin_12);*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitSTA.GPIO_Mode = GPIO_Mode_Out_PP;  //TxD1
GPIO_InitSTA.GPIO_Pin = GPIO_Pin_9;
GPIO_InitSTA.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_Init(GPIOA,&GPIO_InitSTA);

GPIO_InitSTA.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //RxD1
GPIO_InitSTA.GPIO_Pin = GPIO_Pin_10;

// GPIO_InitSTA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitSTA);

GPIO_InitSTB.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitSTB.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitSTB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitSTB);

GPIO_SetBits(GPIOA,GPIO_Pin_9 | GPIO_Pin_10);     
GPIO_SetBits(GPIOB,GPIO_Pin_12 | GPIO_Pin_13);    

}

void Delayms(uint16_t ms){
uint16_t i = 0;
uint16_t j = 0;

for(j = 0;j < ms;j ++){
  for(i = 0;i < 12000;i ++){

  }  
}

}

/*主程序,串口usart1中断函数*/
#include "head.h"
#include "stdio.h"
#include "stm32f10x_it.h"

uint16_t rece = 0;

int main(void){

NVIC_Configuration();
RCC_Configuration();
Usart_Initial();
gpio_Init();

USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
GPIO_WriteBit(GPIOB,GPIO_Pin_12 | GPIO_Pin_13,Bit_RESET); 
while(1){

// GPIO_WriteBit(GPIOB,GPIO_Pin_12 | GPIO_Pin_13,Bit_SET);
// Delayms(1000);
GPIO_WriteBit(GPIOB,GPIO_Pin_12 | GPIO_Pin_13,Bit_RESET);
Delayms(1000);
// USART_SendData(USART1,0x55);
// Delayms(1000);
// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){};
}
}

void USART1_IRQHandler(void)
{
/*
if(USART_GetITStatus(USART1, USART_IT_PE) != RESET)
{
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
rece = USART_ReceiveData(USART1);
}
*/

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET); //若发送0x55,引脚电平会变

// USART_SendData(USART1, 0xff);
// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){};
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
/* Disable USART1 RXNE Interrupt */
rece = USART_ReceiveData(USART1);

USART_ClearFlag(USART1,USART_IT_RXNE);
// USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
if(rece == 0x55){
// GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_SendData(USART1,rece);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET){};
// printf("hello");
}
}
}

1个回答

应该有例程吧
http://www.openedv.com/thread-13912-1-1.html
参考别人的看看哪没注意到

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
stm32串口中断和定时器中断冲突

串口1每1秒给32发一串数据,通过中断接收;串口而是被动的,只有32给他发送数据0x01,它才给32回一串数据,定时器中断产生定时时长,用来发送那个0x01,现在的问题是32在定时器和串口同时工作的情况下,接收到的串口数据有错。

stm32获取串口扫描枪数据

初学stm32,实现功能:串口2连接扫描枪,获取一维码信息后通过串口1打印;目前已实现串口2通过串口调试助手发送数据,串口1能够在串口调试助手上打印接收到的数据,stm32通过pc串口调试助手模拟发送接收数据正常,扫描枪与pc串口助手发送接收数据正常,存在问题:stm32与扫描枪无法通信,串口2连接扫描枪后发送数据,串口1无法打印,debug发现串口2中断无数据接收。![图片说明](https://img-ask.csdn.net/upload/201809/17/1537175779_974945.jpg)

STM32 串口收发数据出错

#include "stm32f10x.h" #include <stdio.h> /************************************************* 函数: void RCC_Configuration(void) 功能: 复位和时钟控制 配置 参数: 无 返回: 无 **************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量 RCC_DeInit(); //复位RCC外部设备寄存器到默认值 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好 if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好 { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后 FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时 RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz RCC_PLLCmd(ENABLE); //使能PLL时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟 while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟 { } } } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures NVIC and Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //通道设置为串口3中断 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断响应优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断 NVIC_Init(&NVIC_InitStructure); //初始化 } /******************************************************************************* 函数名:USART3_Configuration 输 入: 输 出: 功能说明: 初始化串口硬件设备,启用中断 配置步骤: (1)打开GPIO和USART3的时钟 (2)设置USART3两个管脚GPIO模式 (3)配置USART3数据格式、波特率等参数 (4)使能USART3接收中断功能 (5)最后使能USART3功能 */ void USART3_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 第1步:打开GPIO和USART部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第3步:将USART Rx的GPIO配置为浮空输入模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第4步:配置USART3参数*/ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); /* 若接收数据寄存器满,则产生中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 第5步:使能 USART3, 配置完毕 */ USART_Cmd(USART3, ENABLE); /* 如下语句解决第1个字节无法正确发送出去的问题 */ USART_ClearFlag(USART3, USART_FLAG_TC); // 清标志 } /*******************************************************************/ /* */ /* STM32向串口3发送1字节 */ /* */ /* */ /*******************************************************************/ void Uart3_PutChar(u8 ch) { USART_SendData(USART3, (u8) ch); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } /*******************************************************************/ /* */ /* STM32在串口3接收1字节 */ /* 说明:串口3接收中断 */ /* */ /*******************************************************************/ void USART3_IRQHandler(void) { u8 dat; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收数据寄存器满 { dat = USART_ReceiveData(USART3); Uart3_PutChar(dat); } } /************************************************* 函数: int main(void) 功能: main主函数 参数: 无 返回: 无 **************************************************/ int main(void) { u8 abc[]={0x11,0x12,0x13,0x14}; u8 i; RCC_Configuration(); NVIC_Configuration(); USART3_Configuration(); for(i=0;i<4;i++) {Uart3_PutChar(abc[i]);} while(1); }

STM32串口接收数据有时候会出错

void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStruct ; USART_InitTypeDef USART_InitStruct ; NVIC_InitTypeDef NVIC_InitStruct ; #ifdef DMA_EN DMA_InitTypeDef DMA_InitStructure ; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //DMA1通道5配置 DMA_DeInit(DMA1_Channel6); //USART2_RX DMA1 channel 6 //外设地址 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR); //内存地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART_Rev_Buffer; //dma传输方向单向 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置DMA在传输时缓冲区的长度 DMA_InitStructure.DMA_BufferSize = 40 ;//UART_RX_LEN; //设置DMA的外设递增模式,一个外设 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的内存递增模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //外设数据字长 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //内存数据字长 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //设置DMA的传输模式 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的优先级别 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //设置DMA的2个memory中的变量互相访问 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel6,&DMA_InitStructure); //使能通道6 DMA_Cmd(DMA1_Channel6,ENABLE); #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); USART_DeInit(USART2) ; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 ; //USART1-TX GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 ; //USART1-RX GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ; GPIO_Init(GPIOA,&GPIO_InitStruct); USART_InitStruct.USART_BaudRate = 115200 ; USART_InitStruct.USART_WordLength = USART_WordLength_8b ; USART_InitStruct.USART_StopBits = USART_StopBits_1 ; USART_InitStruct.USART_Parity = USART_Parity_No ; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; USART_Init(USART2,&USART_InitStruct) ; NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0 ; //抢占优先级 3 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; //子优先级 3 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStruct); USART_ITConfig(USART2,USART_IT_IDLE,ENABLE) ; /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 如下语句解决第1个字节无法正确发送出去的问题 */ //USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送外城标志,Transmission Complete*/ USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); // 开启串口DMA接收 USART_Cmd(USART2, ENABLE); } void USART2_IRQHandler(void) { uint8_t temp = 0; uint8_t i = 0; if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) { //USART_ClearFlag(USART1,USART_IT_IDLE); temp = USART2->SR; temp = USART2->DR; //清USART_IT_IDLE标志 DMA_Cmd(DMA1_Channel6,DISABLE); temp = 40 - DMA_GetCurrDataCounter(DMA1_Channel6); //接收到数据的长度 for(i=0;i<temp;i++) { printf(" %x ",USART_Rev_Buffer[i]); } printf("\r\n"); printf("\r\n"); //if(temp == USART_Rev_Buffer[4]+5) //{ // USART_FLAG_RX = 1 ; //标志位置1 //USART_TX = 0 ; //} //设置传输数据长度 DMA_SetCurrDataCounter(DMA1_Channel6,40); //打开DMA DMA_Cmd(DMA1_Channel6,ENABLE); } __nop(); } ![图片说明](https://img-ask.csdn.net/upload/201704/13/1492079684_720557.png)

STM32串口如何实现一个发数据,另外一个接收数据

在keil5在编程环境下,想要实现的功能是:利用中断,让串口四接收数据,串口一发送数据 部分代码如下: int main(void) { //初始化USART1和UART4 配置模式为 115200 8-N-1,通过USART1发送数据,通过UART4接收数据 Debug_USART1_Config(); Debug_UART4_Config(); while(1) { } } 、、、、、、、、、中断函数如下、、、、、、、、、 相关宏定义 #define DEBUG_R_USART_IRQHandler UART4_IRQHandler #define DEBUG_R_USART_IRQ UART4_IRQn //串口四的中断程序:用于接收数据 void DEBUG_R_USART_IRQHandler(void) { if(USART_GetITStatus(UART4,USART_IT_RXNE)!=RESET) { USART_ClearFlag(UART4,USART_IT_RXNE); // USART_ClearITPendingBit(UART4,USART_IT_RXNE); //清除中断标志 ucTemp = USART_ReceiveData(UART4); } } //串口一的中断程序:用于发送数据 void DEBUG_T_USART_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { USART_ClearFlag(USART1,USART_IT_RXNE); //清除标志 // USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断预处理位 USART_SendData(USART1,ucTemp); } } 、、、、、、、、中断函数的配置、、、、、、、、、 //接收串口引脚定义 /*******************************************************/ #define DEBUG_USART UART4 #define DEBUG_USART_CLK RCC_APB1Periph_UART4 #define DEBUG_USART_BAUDRATE 115200 //串口波特率 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA #define DEBUG_USART_RX_PIN GPIO_Pin_1 #define DEBUG_USART_RX_AF GPIO_AF_UART4 #define DEBUG_USART_RX_SOURCE GPIO_PinSource1 #define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA #define DEBUG_USART_TX_PIN GPIO_Pin_0 #define DEBUG_USART_TX_AF GPIO_AF_UART4 #define DEBUG_USART_TX_SOURCE GPIO_PinSource0 #define DEBUG_R_USART_IRQHandler UART4_IRQHandler #define DEBUG_R_USART_IRQ UART4_IRQn /************************************************************/ //发送串口引脚定义 /*******************************************************/ #define DEBUG_T_USART USART1 #define DEBUG_T_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_T_USART_BAUDRATE 115200 //串口波特率 #define DEBUG_T_USART_RX_GPIO_PORT GPIOA #define DEBUG_T_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA #define DEBUG_T_USART_RX_PIN GPIO_Pin_10 #define DEBUG_T_USART_RX_AF GPIO_AF_USART1 #define DEBUG_T_USART_RX_SOURCE GPIO_PinSource10 #define DEBUG_T_USART_TX_GPIO_PORT GPIOA #define DEBUG_T_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA #define DEBUG_T_USART_TX_PIN GPIO_Pin_9 #define DEBUG_T_USART_TX_AF GPIO_AF_USART1 #define DEBUG_T_USART_TX_SOURCE GPIO_PinSource9 #define DEBUG_T_USART_IRQHandler USART1_IRQHandler #define DEBUG_T_USART_IRQ USART1_IRQn /************************************************************/ static void NVIC_Configuration(void) //串口四的中断参数的配置 { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置UART4为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = DEBUG_R_USART_IRQ; /* 抢断优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } static void T_NVIC_Configuration(void) //串口一的中断参数的配置 { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置USART1为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; /* 抢断优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } 、、、、、、、、有关串口的配置、、、、、、、、 void Debug_UART4_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE); /* 使能 USART 时钟 */ RCC_APB1PeriphClockCmd(DEBUG_USART_CLK, ENABLE); /* GPIO初始化 */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 配置Tx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ; GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure); /* 配置Rx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN; GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); /* 连接 PXx 到 USARTx_Tx*/ GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF); /* 连接 PXx 到 USARTx__Rx*/ GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF); /* 配置串DEBUG_USART 模式 */ /* 波特率设置:DEBUG_USART_BAUDRATE */ USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; /* 字长(数据位+校验位):8 */ USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 停止位:1个停止位 */ USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 校验位选择:不使用校验 */ USART_InitStructure.USART_Parity = USART_Parity_No; /* 硬件流控制:不使用硬件流 */ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* USART模式控制:同时使能接收和发送 */ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 完成USART初始化配置 */ USART_Init(DEBUG_USART, &USART_InitStructure); /* 嵌套向量中断控制器NVIC配置 */ NVIC_Configuration(); /* 使能串口接收中断 */ USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE); //使能了接收中断,那么ORE中断也同时被开启了。 /* 使能串口 */ USART_Cmd(DEBUG_USART, ENABLE); } void Debug_USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); /* 使能 USART 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* GPIO初始化 */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 配置Tx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ; GPIO_Init(DEBUG_T_USART_TX_GPIO_PORT, &GPIO_InitStructure); /* 配置Rx引脚为复用功能 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = DEBUG_T_USART_RX_PIN; GPIO_Init(DEBUG_T_USART_RX_GPIO_PORT, &GPIO_InitStructure); /* 连接 PXx 到 USARTx_Tx*/ GPIO_PinAFConfig(DEBUG_T_USART_RX_GPIO_PORT,DEBUG_T_USART_RX_SOURCE,DEBUG_T_USART_RX_AF); /* 连接 PXx 到 USARTx__Rx*/ GPIO_PinAFConfig(DEBUG_T_USART_TX_GPIO_PORT,DEBUG_T_USART_TX_SOURCE,DEBUG_T_USART_TX_AF); /* 配置串DEBUG_USART 模式 */ /* 波特率设置:DEBUG_USART_BAUDRATE */ USART_InitStructure.USART_BaudRate = DEBUG_T_USART_BAUDRATE; /* 字长(数据位+校验位):8 */ USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 停止位:1个停止位 */ USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 校验位选择:不使用校验 */ USART_InitStructure.USART_Parity = USART_Parity_No; /* 硬件流控制:不使用硬件流 */ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* USART模式控制:同时使能接收和发送 */ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 完成USART初始化配置 */ USART_Init(DEBUG_T_USART, &USART_InitStructure); /* 嵌套向量中断控制器NVIC配置 */ T_NVIC_Configuration(); /* 使能串口接收中断 */ USART_ITConfig(DEBUG_T_USART, USART_IT_RXNE, ENABLE); /* 使能串口 */ USART_Cmd(DEBUG_T_USART, ENABLE); } 未解决:串口一和串口四都可以单独收发,但是我想要实现一个串口收,另外一个串口发的功能,,,,,,,,求助啊,,,,,,试了好多可能性了

STM32为什么用串口接收数据不全,时常丢失?

``` ```#include "stm32f10x.h" #include "usart.h" #include "delay.h" void My_USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; //①使能GPIOA和串口1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //②初始化GPIOA两个引脚 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); //③串口初始化 //波特率 USART_InitStrue.USART_BaudRate=115200; //硬件控制 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //奇偶验证 USART_InitStrue.USART_Parity=USART_Parity_No; //停止位 USART_InitStrue.USART_StopBits=USART_StopBits_1; //字长 USART_InitStrue.USART_WordLength=USART_WordLength_8b; USART_Init(USART1,&USART_InitStrue); //串口使能 USART_Cmd(USART1,ENABLE);//③ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接受中断 USART_ITConfig(USART1,USART_IT_ORE,ENABLE);//开启溢出中断 //初始化中断 NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStrue.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStrue); } u8 usart_buf[4][USART_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节 static volatile u16 count=0;//接收状态标记 static volatile int p=0; void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//开启接收中断 { USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志中断位 p = (count / USART_REC_LEN) % 4; usart_buf[p][count % USART_REC_LEN] = USART_ReceiveData(USART1); count++; } } int main(void) { //要使用中断,先要中断分组,一般在主函数的开头 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); My_USART1_Init(); delay_init(); while(1){ if(count > 0){ if(count % 256 == 0){ for(int i = 0; i < 256; i++){ USART_SendData(USART1,usart_buf[p][i]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } printf("\r\n\r\n"); delay_ms(100); } } }; } ![图片说明](https://img-ask.csdn.net/upload/201910/31/1572495626_268037.png)

stm32的5个串口同时使用问题

stm32的5个串口同时用到,如何处理各个串口的数据,需要注意哪些问题

使用stm32f1通过串口接收上位机信息产生中断来控制电机,但是中断打不开,想请大佬看看是为什么?

主要思路是在串口通信助手中发送“1”,然后串口接收中断打开,在串口通信助手中打印“中断开始”的信息。但是这句“中断开始”信息没有显示,想请大佬看看shi'wei'shen'm usart.c ``` #include "stm32f10x.h" #include "usart.h" //已检查 无误 static void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); } //串口初始化函数已检查 无误 void USART1_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //看io口和usart的时钟 //RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE); 函数用错了 //RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //初始化串口USART1输入输出的io口 //输出 推挽复用输出 PA9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //初始化PA9 GPIO_Init( GPIOA , &GPIO_InitStructure ); //输出 浮空输入 PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //初始化PA10 GPIO_Init( GPIOA , &GPIO_InitStructure ); //初始化串口 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Parity = USART_Parity_No; USART_Init(USART1,&USART_InitStructure); //串口中断优先级配置 NVIC_Config(); //串口接收中断 因为是接受上位机消息后驱动电机转动,所以使用接受中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口使能 USART_Cmd( USART1,ENABLE); } /* 使用串口发送一个字节 */ void USART_SendByte(USART_TypeDef* pUSARTx,uint16_t Data) { USART_SendData( pUSARTx, Data); while( USART_GetFlagStatus( pUSARTx,USART_FLAG_TXE) == RESET); } /* 发送字符串(来自野火教程) */ void USART_SendStr( USART_TypeDef* pUSARTx , uint8_t *str) { uint8_t i=0; do { USART_SendByte( pUSARTx, *(str+i)); i++; }while( *(str+i) != '\0' ); while( USART_GetFlagStatus( pUSARTx,USART_FLAG_TC) == RESET); } ///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); } ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { /* 等待串口输入数据 */ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1); } ``` usart.h ``` #ifndef __USART_H #define __USART_H #include "stm32f10x.h" #include <stdio.h> void USART1_Init(void); void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data); void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str); #endif /* __USART_H */ ``` main.c ``` #include "stm32f10x.h" #include "moto.h" #include "usart.h" int main(void) { USART1_Init(); USART_SendStr( USART1 , "000\n"); //USART1_Init(); while(1){} } ``` 中断服务函数 ``` #include "stm32f10x_it.h" #include "usart.h" u8 Start_Flag=1; //电机启动/锁定标志 u16 Pluse_High=10; //脉冲高电平中断次数 1->10us u16 Pluse_Period=200;//脉冲周期中断次数 (转速) //脉冲中断服务函数------------------------------------------------------------ u32 TimeCount=0;//进中断计数 u16 a=0; void SysTick_Handler(void) { } void USART_IT_Handler(void) { //USART_SendStr( USART1 , "test\n"); if(USART_GetITStatus( USART1 ,USART_IT_RXNE)!=RESET) { printf("中断开始\n");//这句信息在串口通信助手中不显示 while(1) { if( USART_ReceiveData(USART1) == 1 ); break; } GPIO_SetBits(GPIOE,GPIO_Pin_5); while(a>1000)//让方向信号的输出略大于脉冲信号 {a++;} DJ_Init(); while(1){TIM4_Int_Init(10-1,84-1);} } } ```

stm32f103c8t6串口 usart1只能发送不能接受

这几天一直在搞毕设,需要通过串口用电脑控制单片机,用的是usart1,调了好几天,死活就是只能发送数据,不能接受数据,下面是我的配置函数和串口中断处理函数,求指导!!! //串口引脚初始化 void Init_Usart(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } //串口配置函数 void Usart_Configuration(uint32_t BaudRate) { USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitStructure.USART_BaudRate =BaudRate ; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_Cmd(USART1, ENABLE); } //串口中断处理函数 void USART1_IRQHandler(void) { uint8_t ReceiveDate; if(!(USART_GetITStatus(USART1,USART_IT_RXNE))) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); ReceiveDate=USART_ReceiveData(USART1); printf("%d",(char *)ReceiveDate); printf("\n\r"); } } //串口中断NVIC配置函数 void Init_NVIC(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); } 调了好几天了,实在是高不出来了,求大神指导!!!!!!!跪谢!!

RT-thread操作系统移植到stm32f407后串口发送乱码

我使用的是RT-thread 1.2.2版本,代码是从官网百度网盘上下载的.我把源代码打开后找到bsp文件夹,发现里面有stm32f40x的移植工程,于是惊喜万分,没有做任何修改就把工程下载到了我自己的stm32f407 开发板上,led显示的状态正常,可就是串口发回来的数据全是乱码...从网站上看了看好多人的东西,对这个现象好像没有描述,不知各位前辈有没有遇到类似的情况的?还望赐教!

ESP8266与STM32通讯接收不到数据

ESP8266跟STM32通讯。ESP8266经过USB转串口手机发送的数据可以在串口助手里打印出来,STM32的串口和中断程序通过串口助手也可以响应中断,但是把ESP8266接到STM32的串口上,进行串口通讯STM32就不能读取到手机发送的数据。求大神指点,谢谢了

stm32L0同时使用两个串口问题

项目需要同时使用两个串口和外界通信。用的是20脚的stm32L0,因为引脚太少,每个引脚的复用功能就很多。 突然发现LPUART1和USART2两个外设的TX引脚竟然共用一个引脚(如下方数据手册截图所示),想求问各位大神这个芯片还能两个串口同时用么,需要怎样配置呀? 另:一个引脚上这么多Alternate functions是不是只能通过外设时钟来控制具体是哪个外设在工作? ![图片说明](https://img-ask.csdn.net/upload/201910/22/1571744755_267880.png)

stm32 PVD掉电检测,进不了中断

芯片是stm32f103C8T6,PVD掉电检测,中断服务函数是通过串口发送数据。可是并没有发送,不知道是没有进入中断,还是进入了中断,但电压值过低,串口发送数据失败。求大神看看,写了好久没解决问题。代码如下: void PVD_Init(void) { SystemInit(); EXTI_InitTypeDef EXTI_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//PWRʹÄÜ /* Configure EXTI Line16(PVD Output) to generate an interrupt on rising and falling edges */ EXTI_ClearITPendingBit(EXTI_Line16); EXTI_InitStructure.EXTI_Line = EXTI_Line16; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void PVD_NVIC(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the PVD Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void PVD_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line16) != RESET) { GPIO_SetBits(GPIOA,GPIO_Pin_1); start();//串口发送数据 EXTI_ClearITPendingBit(EXTI_Line16); } } int main() { ..... PWR_PVDLevelConfig(PWR_PVDLevel_2V9); PWR_PVDCmd(ENABLE); PVD_Init(); PVD_NVIC(); .... while(1) { ; } }

STM32 HAL 使用串口中断HAL_UART_Transmit_IT函数问题

用HAL_UART_Transmit_IT 函数在主循环里发送一个字节的数据,之后用HAL_Delay(5000);延迟继续发送,但是一直以很快的速度重复发送,没有进入delay

stm32重定向scanf到串口 这里怎么使用呢?

int fgetc(FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1); }

求一段串口发送接收数据的小案例,并且用checksum验证其接受的数据完整性

本人刚接触STM32,学习到串口接受发送,基本的代码代码都会写,比如 串口初始化,接受中断函数。串口也能进行简单的数据发送接收。 老师说要用checksum验证数据正确性,我在网上看了很多教程,原理还是 清楚了一些,比如原码反码补码,但是不怎么清楚把它运用到实际案例中 所以求一段用到checksum和检验的串口发送接收小案例。 尽量附上注释,让小白融会贯通一下。 如下图:只能简单的一些代码 ![图片说明](https://img-ask.csdn.net/upload/201911/09/1573272465_291606.png) 利用串口调试助手: ![图片说明](https://img-ask.csdn.net/upload/201911/09/1573272487_708205.png) 感谢感谢,感觉道阻且长啊

串口中断接收标志位在初始化后就置1

源码先贴上来: 串口部分: #include<SM59A16U1.h> #include"uart.h" sbit LED1=P1^4; unsigned char a; unsigned char flag; void configure_uart0(void) { P3_2=0; //485接收模式 S0CON|=0x50; //设置为串口0模式1,使能串口接收 PCON|=0x80; // PFCON&=0xcf; AUX|=0x80; S0RELH =0x03; S0RELL =0xDC; IEN0|=0x90; //开总中断和串口中断 // TI = 0; //发送标志初始化 RI = 0; LED1=1; } void uart0_TX(void) { P3_2=1; //485发送模式 if(flag==1) { flag=0; S0BUF=a; while(!TI); TI=0; LED1=1; } P3_2=0; //485接收模式 } void uart0_Rec(void) interrupt d_UART0_Vector { IEN0&=0xef; //关闭串口0中断 if(RI&&(S0BUF!=0)) { a=S0BUF; LED1=0; flag=1; RI=0; } else { TI=0; } IEN0|=0x10; //打开串口0中断 } 主函数部分: #include<SM59A16U1.h> #include"uart.h" void main() { configure_uart0(); while(1) { uart0_TX(); } } 问题是这样的:在仿真时候,如果全速运行,在configure_uart0()完成后,串口0的中断标志位RI就自动置1了,RI不应该是单片机接收到数据才置1的吗?请教大神

STM32F103CB使用MAX485接收不到

PC向主机串口1发送的数据,由串口2经MAX485转发,从机接收数据并通过MAX485到串口2,最后控制继电器。目前发现串口1发送485发送的数据正常,从机用示波器测量MAX485和串口2处有信号,但是从机芯片无法接收。主机从机发送正常,单独使用串口2发送到串口1也正常。 串口2是PA2和PA3,使用PA4做MAX485控制引脚 #define RS485_TX GPIO_SetBits(GPIOA,GPIO_Pin_4) //485发送使能(在使用时注意有响应延时) #define RS485_RX GPIO_ResetBits(GPIOA,GPIO_Pin_4) //485接收使能(在使用时注意有响应延时) #define USART2_RX_EN 1 //0:不接收;1:接收 #define USART_REC_LEN 200 //定义最大接收字节数 200 u16 USART_RX_STA; // 串口1接收状态标志 u8 USART_RX_BUF[USART_REC_LEN]; //串口1接收缓冲 /** //功能:RS485串口2初始化 //参数:bound:波特率 //返回值:None **/ void RS485_Init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); /*************************************GPIO Config****************************************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); #if USART2_RX_EN /*************************************USART Config*****************************************/ USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2,&USART_InitStructure); USART_Cmd(USART1, ENABLE); //使能串口外设 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口接收中断 USART_ClearFlag(USART1, USART_FLAG_TC); //软件清除发送完成标志位 /**************************************NVIC Config*****************************************/ NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif RS485_RX; //485默认接收 } //********************串口2中断服务函数**********// void USART2_IRQHandler() { u16 temp; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断,必须以0x0d,0x0a结尾 { temp = USART_ReceiveData(USART2); //读取接收到的数据 if((USART_RX_STA & 0x8000) == 0) //接收未完成 { if(USART_RX_STA & 0x4000) //如果接收到了0x0d { if(temp != 0x0a) USART_RX_STA = 0; //接受错误,重新开始接收 else { USART_RX_STA |= 0x8000; //接收完成 } } else //未收到0x0d { if(temp == 0x0d) USART_RX_STA |= 0X4000; else { USART_RX_BUF[USART_RX_STA & 0X3FFF] = temp; USART_RX_STA++; if(USART_RX_STA > (USART_REC_LEN - 1)) USART_RX_STA = 0; //接收数据错误,重新开始接收 } } } }else if(USART_GetFlagStatus(USART2,USART_FLAG_IDLE)!=RESET) { USART_ClearFlag(USART2,USART_FLAG_IDLE); } } int main() { u16 t = 0; u8 length; u16 times=0; SysTick_Init(); Delay_us(100); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC优先级分组2:2位抢占优先级,2位响应优先级 UART1_Init(115200); UART2_Init(9600); RS485_Init(9600); printf("\r\n01 finsh\r\n"); printf("\r\n等待接收\r\n"); while(1) { if(USART_RX_STA & 0x8000) { RS485_RX; Delay_ms(100); length = USART_RX_STA&0X3fff; //获取数据长 printf("\r\nyour massage is:\r\n"); for(t=0;t<length;t++) { Delay_us(1000); SendByte(USART1,USART_RX_BUF[t]);//自己写的发送函数,正常 } printf("\r\n发送完成\r\n"); RS485_RX; USART_RX_STA=0; }else { times++; if(times % 5000 == 0) { printf("\r\nlab\r\n"); printf("ALIENTEK\r\n\r\n"); } if(times % 200 == 0) printf("\r\n waitting \r\n"); if(times % 30 == 0) printf("\r\nsystem runing\n");//提示系统正在运行 Delay_ms(10); } } }

关于串口接收数据缓冲问题

我用串口测试实时接收一个2k采样率的正弦波并显示波形,不管是我自己写的程序还是Labview 都出现了同一个问题,就是一开始波形的频率是对的,然后我进入中断一会,回来继续接收数据 感觉波形被压缩了一样,突然来了一大堆数据,过一会就会恢复正常。这是缓存区哪里的问题呢?接收缓冲,传输缓冲?

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Vue + Spring Boot 项目实战(十九):Web 项目优化解决方案

快来一起探索如何打脸我们的破项目,兄弟姐妹们把害怕打在公屏上!

你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪

CopyOnWriteArrayList.java和ArrayList.java,这2个类的构造函数,注释中有一句话 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public ArrayList(Collection&lt;? ...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

CSDN:因博主近期注重写专栏文章(已超过150篇),订阅博主专栏人数在突增,近期很有可能提高专栏价格(已订阅的不受影响),提前声明,敬请理解!

CSDN:因博主近期注重写专栏文章(已超过150篇),订阅博主专栏人数在突增,近期很有可能提高专栏价格(已订阅的不受影响),提前声明,敬请理解! 目录 博客声明 大数据了解博主粉丝 博主的粉丝群体画像 粉丝群体性别比例、年龄分布 粉丝群体学历分布、职业分布、行业分布 国内、国外粉丝群体地域分布 博主的近期访问每日增量、粉丝每日增量 博客声明 因近期博主写专栏的文章越来越多,也越来越精细,逐步优化文章。因此,最近一段时间,订阅博主专栏的人数增长也非常快,并且专栏价

一个HashMap跟面试官扯了半个小时

一个HashMap能跟面试官扯上半个小时 关注 安琪拉的博客 1.回复面试领取面试资料 2.回复书籍领取技术电子书 3.回复交流领取技术电子书 前言 HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。 开场 面试官: 你先自我介绍一下吧! 安琪拉: 我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

培训班出来的人后来都怎么样了?(二)

接着上回说,培训班学习生涯结束了。后面每天就是无休止的背面试题,不是没有头脑的背,培训公司还是有方法的,现在回想当时背的面试题好像都用上了,也被问到了。回头找找面试题,当时都是打印下来天天看,天天背。 不理解呢也要背,面试造飞机,上班拧螺丝。班里的同学开始四处投简历面试了,很快就有面试成功的,刚开始一个,然后越来越多。不知道是什么原因,尝到胜利果实的童鞋,不满足于自己通过的公司,嫌薪水要少了,选择...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

近日,有网友在某职场社交平台吐槽,自己裸辞两个月了,但是找工作却让自己的心态都要崩溃了,全部无果,不是已查看无回音,就是已查看不符合。 “工作八年,两年一跳,裸辞两个月了,之前月薪60K,最近找工作找的心态崩了!所有招聘工具都用了,全部无果,不是已查看无回音,就是已查看不符合。进头条,滴滴之类的大厂很难吗???!!!投简历投的开始怀疑人生了!希望 可以收到大厂offer” 先来看看网...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

程序员是做全栈工程师好?还是专注一个领域好?

昨天,有位大一的同学私信我,说他要做全栈工程师。 我一听,这不害了孩子么,必须制止啊。 谁知,讲到最后,更确定了他做全栈程序员的梦想。 但凡做全栈工程师的,要么很惨,要么很牛! 但凡很牛的,绝不是一开始就是做全栈的! 全栈工程师听起来好听,但绝没有你想象的那么简单。 今天听我来给你唠,记得帮我点赞哦。 一、全栈工程师的职责 如果你学习编程的目的只是玩玩,那随意,想怎么学怎么学。...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!

A站 AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站。A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量互动弹幕,是中国弹幕文化的发源地;拥有大量超粘性的用户群体,产生输出了金坷垃、鬼畜全明星、我的滑板鞋、小苹果等大量网络流行文化,也是中国二次元文化的发源地。 B站 全称“哔哩哔哩(bilibili...

十个摸鱼,哦,不对,是炫酷(可以玩一整天)的网站!!!

文章目录前言正文**1、Kaspersky Cyberthreat real-time map****2、Finding Home****3、Silk – Interactive Generative Art****4、Liquid Particles 3D****5、WINDOWS93****6、Staggering Beauty****7、Ostagram图片生成器网址****8、全历史网址*...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

用了这个 IDE 插件,5分钟解决前后端联调!

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!作者 |李海庆我是一个 Web 开发前端工程师,受到疫情影响,今天是我在家办公的第78天。开发了两周,...

大厂的 404 页面都长啥样?最后一个笑了...

每天浏览各大网站,难免会碰到404页面啊。你注意过404页面么?猿妹搜罗来了下面这些知名网站的404页面,以供大家欣赏,看看哪个网站更有创意: 正在上传…重新上传取消 腾讯 正在上传…重新上传取消 网易 淘宝 百度 新浪微博 正在上传…重新上传取消 新浪 京东 优酷 腾讯视频 搜...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

Java14 新特性解读

Java14 已于 2020 年 3 月 17 号发布,官方特性解读在这里:https://openjdk.java.net/projects/jdk/14/以下是个人对于特性的中文式...

前端还能这么玩?(女朋友生日,用前端写了一个好玩的送给了她,高兴坏了)

前端还能这么玩?(女朋友生日,用前端写了一个好玩的送给了她,高兴坏了)

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

工作两年简历写成这样,谁要你呀!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 最近有伙伴问小傅哥,我的简历怎么投递了都没有反应,心里慌的很呀。 工作两年了目前的公司没有什么大项目,整天的维护别人的代码,有坑也不让重构,都烦死了。荒废我一身技能无处施展,投递的简历也没人看。我是不动物园里的猩猩,狒狒了! 我要加班,我要996,我要疯狂编码,求给我个机会… ...

相关热词 c#跨线程停止timer c#批量写入sql数据库 c# 自动安装浏览器 c#语言基础考试题 c# 偏移量打印是什么 c# 绘制曲线图 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行
立即提问