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);
}

未解决:串口一和串口四都可以单独收发,但是我想要实现一个串口收,另外一个串口发的功能,,,,,,,,求助啊,,,,,,试了好多可能性了

qq_35762361
qq_35762361 回复 自娱自乐。: 请问一下楼主是怎么解决的,遇到了一样的问题了
9 个月之前 回复
qq_43792862
自娱自乐。 回复weixin_43351668: 已解决
10 个月之前 回复
weixin_43351668
weixin_43351668 请问楼主解决了吗
11 个月之前 回复

1个回答

ucTemp是什么?没有看到这个的定义

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
stm32串口发送可以进入中断但没有数据显示
程序功能是:若接收到数据0x55,则发送接收到的数据(0x55)。 但现在问题是:通过串口助手发送0x55,已经进入接收中断接受到数据,然后通过SendData函数发送数据,能进入发送中断,但是串口助手却没有显示0x55(好像是数据并没有发送出去) /*头文件*/ #ifndef __HEAD_H__ #define __HEAD_H__ #include <misc.h> #include <stm32f10x_usart.h> #include <stm32f10x_gpio.h> #include <STM32F10x_rcc.h> #include <stdint.h> #include "stm32f10x_flash.h" //#include <stm32100e_eval.h> //#include <stm32_eval.h> 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"); } } }
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多机通讯,安卓板为上位机,下位机为几个STM32串口接收数据(应该是2~10个)
1:STM32多机通讯,安卓板为上位机,下位机为几个STM32串口接收数据(应该是2~10个),请大神指教, 2:要有程序代码提供(最好是有寄存器配置版本的。如是库函数版的请说清楚)
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); }
ESP8266与STM32通讯接收不到数据
ESP8266跟STM32通讯。ESP8266经过USB转串口手机发送的数据可以在串口助手里打印出来,STM32的串口和中断程序通过串口助手也可以响应中断,但是把ESP8266接到STM32的串口上,进行串口通讯STM32就不能读取到手机发送的数据。求大神指点,谢谢了
SerialChart 接收不到stm32传来的数据
SerialChart可以打开串口,但data栏就是接收不到数据... 其他的串口调试助手都能够接收到数据,哪位大神帮帮解答一下~
STM32F103串口接蓝牙总是发送了一段数据就不再发送了
使用STM32F103C8T6的板子,usart1,PA9.PA10的管脚,蓝牙模块接线正确。 使用串口调试助手只能够在板子一上电,蓝牙刚刚连接上的瞬间接收到一部分数据,此后USB转串口的那个模块的灯就一直红着,处于别的蓝牙连接不上,但是自己又不发送数据的状态。 以下是我的部分代码,请大神们给些建议,非常感谢。
STM32串口调试助手接收HEX格式FF
STM32发送数据,可是串口调试助手一直接收的是FF,换波特率接受干脆就停止了。请问是怎么回事啊,有没有可能是串口线坏掉了
STM32串口通信,串口调试助手中可以实现收发,自己编的串口助手就只能收不能发,有大神知道怎么办吗?
如题,最近做一个这样的调试,用32的开发板向电脑发送数据,用普通的串口调试助手就可以正常收发。 实际如下:32设备收到发来的信号,然后再将另外一组数据发送到调试助手 ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540282792_7501.png) 然后在普通的串口调试助手上就是这样的; 我自己根据博客上的代码写了个差不多的串口工具,用的是Communications control ,version6.0这个控件写的。 但是结果上来说,如果32定时自己向这个工具发数据的话是可以发的,工具也能收到并且显示出来,但是用这个工具向32发数据32却收不到。 因此我又用了虚拟串口,用电脑上的串口调试助手和我写的工具互相收发,双方也都是能收到数据,也能互相发送数据,请大神帮我看看到底是那里出了问题! 串口工具收到32的数据: ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540283320_110440.png) 但是这个串口工具向32发送时32却收不到数据。 为了验证串口可以发送,我用了虚拟串口,如下: ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540283543_713052.png) STM32的程序如下: void UART1_Send_Array() // { unsigned char i=0; // unsigned char t=0; // num=8; for(i=0;i<num;i++) { USART_SendData(USART1,send_array[t]); // while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);// t++; } } if(USART_RX_STA&0x8000) { UART1_Send_Array(); USART_RX_STA=0; LED0=!LED0; } 以及初始化等 #if EN_USART1_RX //Èç¹ûʹÄÜÁ˽ÓÊÕ //´®¿Ú1ÖжϷþÎñ³ÌÐò //×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó u8 USART_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú. //½ÓÊÕ״̬ //bit15£¬ ½ÓÊÕÍê³É±êÖ¾ //bit14£¬ ½ÓÊÕµ½0x0d //bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ u16 USART_RX_STA=0; //½ÓÊÕ״̬±ê¼Ç void uart_init(u32 bound){ //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.9 //USART1_RX GPIOA.10³õʼ»¯ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.10 //Usart1 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ //USART ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ 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); //³õʼ»¯´®¿Ú1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖÐ¶Ï USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1 } void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò { u8 Res; #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ) { Res =USART_ReceiveData(USART1); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É { if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d { if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼ else USART_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË } else //»¹Ã»ÊÕµ½0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ } } } } #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS. OSIntExit(); #endif } #endif 主要就是设置GPIO口,设置波特率等等 VS2010的主要程序如下: void CSerialTestDlg::OnCbnSelchangeComboCom() { // TODO: 在此添加控件通知处理程序代码 int nSel; nSel = m_comboCom.GetCurSel();//获取组合框控件的列表框中选中项的索引 m_ctrlComm.put_CommPort(nSel+1);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号) m_ctrlComm.put_PortOpen(TRUE);//打开串口 m_ctrlComm.put_RThreshold(2);//收到两个字节引发OnComm事件 m_ctrlComm.put_InputMode(1);//输入模式选为二进制 m_ctrlComm.put_Settings(_T("9600,n,8,1"));//设置串口参数,波特率,无奇偶校验,位停止位,位数据位 m_ctrlComm.put_InputMode(1); // 以二进制方式检取数据 m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0 m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据 m_setOk = true; //标记串口设置OK } BEGIN_EVENTSINK_MAP(CSerialTestDlg, CDialogEx) ON_EVENT(CSerialTestDlg, IDC_MSCOMM1, 1, CSerialTestDlg::OnComm, VTS_NONE) END_EVENTSINK_MAP() void CSerialTestDlg::OnComm() { // TODO: 在此处添加消息处理程序代码 VARIANT variant_inp; //Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。 COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed. CString strtemp; if(m_ctrlComm.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.get_Input(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k);//字符型 strtemp.Format(_T("%x"),bt); //8位数组显示,就是现在strtemp中是51 00 00 00 0 m_strRXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容 } void CSerialTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 if (m_setOk == true) //判断是否打开并初始化串口 { UpdateData(TRUE); //读取编辑框内容 m_ctrlComm.put_Output(COleVariant(m_strTXData)); //发送数据 } else { MessageBox(_T("请先选择COM口")); } } void CSerialTestDlg::OnBnClickedButtonCleanup() { // TODO: 在此添加控件通知处理程序代码 m_strRXData=""; UpdateData(FALSE);//更新编辑框内容 } 请求大神帮我看一下大概是哪里出现了问题!
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 串口接收指令无反应。
C#上位机通过串口给STM32发送指令,结果发现发送指令下位机偶尔有反应,大多数情况下没反应,只有多次点击有时会返回一次数据。代码如下 ``` 上位机发送部分 char[] a = new char[1];//设置标志位 a[0] = 'a'; serialPort1.Write(a, 0, 1); ``` STM32处理部分: ``` while(1) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET) { UART_data=USART_ReceiveData(USART1);//接收串口数据 if(UART_data=='a')//进行判断 { USART_SendData(USART1,a);//a为之前定义的一个变量 b也是 } if(UART_data=='b') { USART_SendData(USART1,b); } while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==Bit_RESET); } } ```
STM32通过Uart与ARM通讯,arm_uart接收数据漏码,怎么整?
ARM发送<20字符的数据给stm32,stm32接收到数据后返回<5000字符的数据 ARM收到的数据有<10%的概率出现漏码(少了<20字符)。 arm后台运行7条线程的程序,主要是视频处理+uart通讯+tcp通讯 stm32的uart_tx连接电脑串口数据是正常的,到了arm就漏码了 先贴arm_uart的代码 uart_init ![图片说明](https://img-ask.csdn.net/upload/201811/08/1541647884_643074.png) uart_recv ![图片说明](https://img-ask.csdn.net/upload/201811/08/1541648073_111038.png) 我有个怀疑点,uart通讯用的是115200波特率,arm晶振用的是24MHz,stm32用12MHz 会不会是时钟周期没对上导致漏码?
stm32串口中断和定时器中断冲突
串口1每1秒给32发一串数据,通过中断接收;串口而是被动的,只有32给他发送数据0x01,它才给32回一串数据,定时器中断产生定时时长,用来发送那个0x01,现在的问题是32在定时器和串口同时工作的情况下,接收到的串口数据有错。
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)
菜鸡求教,本人用stm32f103做串口通讯实验,接收时出现数据丢失。
任务是用stm32f103向一块超声波模块发送一个16进制指令 内容为55 aa 01 01 01 01 模块返回一个55 aa 01 01 xx xx xx的数据(xx为测量数据) 结果是串口监视串口显示打印接收到的数据只有55 aa(本应该是55 aa 01 01 xx xx xx的数据) ![图片说明](https://img-ask.csdn.net/upload/201912/18/1576657506_250765.png) 经过检查模块确实发送了7个16进制数回来,但为啥单片机只收到两个呢? 跪求大佬帮忙! 具体代码为 ``` u8 rece[100]; u16 dist=0; u8 relen=0; int main(void) { u8 t=0; u8 send[6]; u8 len=sizeof(send); send[0]=0x55; send[1]=0xaa; send[2]=0x01; send[3]=0x01; send[4]=0x01; send[5]=0x01; delay_init(); LED_Init(); KEY_Init(); BEEP_Init(); uart_init1(9600); uart_init2(9600); TIM3_PWM_Init(7199,9); TIM_SetCompare2(TIM3,4700); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); while(1){ for(t=0;t<len;t++){ USART_SendData(USART1,send[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } LED0=0; LED1=1; delay_ms(1000); //printf("\r\ndist=%d \r\n",dist); } } void USART1_IRQHandler(void){ u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)){ res= USART_ReceiveData(USART1); printf("\r\nres=%x ",res); } } ```
关于STM32的IAP升级中TIM意外被关闭
我在使用STM32的IAP升级,一开始用官方的demo修改之后可以正常的使用串口进行升级,但是公司的产品中必须要加一个外设,SP706TEN当没有及时输入电平反转(1.6S内)到WDI引脚,外设将产生低电平给STM的NRST,产生复位。 问题就出现在这里。 ![图片说明](https://img-ask.csdn.net/upload/201611/11/1478840979_905563.png) 如图,SP706TEN的结构如上,我在原有代码的基础上增加了一个定时器TIM3,在TIM3中每0.5秒使WDI电平反转来给(SP706TEN)喂狗。 程序一开始运行都是OK的,当进入了下载界面,程序就跑飞到HardFault_Handler故障中去了,我猜想的原因是因为TIM3没有及时喂狗导致产生了复位,内存溢出或访问越界吧。但是不清楚为什么。 下载的代码跟官方demo一样,如下 ``` /******************************************************************************* * @函数名称 SerialKeyPressed * @函数说明 测试超级终端是否有按键按下 * @输入参数 key:按键 * @输出参数 无 * @返回参数 1:正确 0:错误 *******************************************************************************/ uint32_t SerialKeyPressed(uint8_t *key) { if ( USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET) { *key = (uint8_t)USART2->DR; return 1; } else { return 0; } } /******************************************************************************* * @函数名称 Receive_Byte * @函数说明 从发送端接收一个字节 * @输入参数 c: 接收字符 timeout: 超时时间 * @输出参数 无 * @返回参数 接收的结果 0:成功接收 1:时间超时 *******************************************************************************/ static int32_t Receive_Byte (uint8_t *c, uint32_t timeout) { while (timeout-- > 0) { if (SerialKeyPressed(c) == 1) { return 0; } } return -1; } ``` 接收文件是用while(1)不停检测usart标志位来接收数据,并不会干扰TIM3的中断发生,但是为什么程序一进行到下载界面就崩掉了???? 注: 1.当进入下载界面选择的时候输入过1,2,几个单独的按键,也通过上面的代码接收,TIM3都没有死掉,但是下载接收(连续)就死掉了 2.如外设的原理图,JUMP2不插跳线帽的时候是不会产生硬件中断的,因此我一开始没加TIM3的程序所有功能都是OK的。但是公司要求升级的时候不能拆盖(也就是说跳线帽是插上的),因此1.6S内不使WDI电平反转(达到喂狗效果),就会产生复位,也就是加定时器的时候出的错。 自己找了好久都没有思路与方法,还请大家帮忙分析一下,是什么原因,如何有效的去解决。谢谢!
STM32+EC20 实现MQTT数据上传,发送一次数据后连接失败,原因?
void sendMQTTPkt(char *p, int len) { //char sendBuf[30] = {0}; char sendBuf[300] = {0}; char *strx,untildata; sprintf(sendBuf,"AT+QISEND=0,%d\r\n",len); USART2_Write(USART2,sendBuf,strlen(sendBuf));//固定长度发数据 delay_ms(100); strx=strstr((char*)RxBuffer,(char*)">");//返回数据可发送 while(strx==NULL) strx=strstr((char*)RxBuffer,(char*)">"); USART2_Write(USART2,p,len); delay_ms(100); } void Clear_Buffer(void)//清空缓存 { int i; //printf(RxBuffer); USART1_Write(USART1,RxBuffer,Rxcouter); memset(RxBuffer,0,Rxcouter); // for(i=0;i<Rxcouter;i++) // RxBuffer[i]=0;//缓存 Rxcouter=0; // IWDG_Feed();//喂狗 } sendMQTTPkt(mqtt_msg,len); delay_ms(1000); //delay_ms(1000); // MqttSample_Recv(); //对数据进行解析 if(uart2_ok)//确认数据都接收完成了 { printf("step1 OK\r\n"); //MQTTOnent_Recdata(); Clear_Buffer(); //MQTTClear_Buffer(); printf("step2 OK\r\n"); uart2_ok=0; printf("step3 OK\r\n"); } printf("step4 OK\r\n"); 串口显示:len:31 step1 OK > SEND OK +QIURC: "closed",0 step2 OK step3 OK step4 OK 提示close ,原因是什么
买了一个拉力测试机,可以通过串口助手给他发送0x32来对拉力计进行清零
但是通过stm32的串口发送0x32,拉力计却没有反应,是什么原因,拉力计只要接收的数据正确,不考虑数据是从什么地方来的吧,串口调试助手和stm32发送不一样吗
stm32不停地发送一个字节的数据,mfc编写的上位机接收到了但是显示乱码
用MFC写了一个串口接收的函数,为了测试,单片机stm32每隔一秒不停地发送同一个数,比如是0x32,想显示在接收框里面,但是每次显示都是乱码,如果以16进制显示就是8位16进制码。 设置断点调试了一下,发现bt是成功接收到了的,但是以cstring显示就乱码了,为什么呢? ![图片说明](https://img-ask.csdn.net/upload/201604/29/1461936245_592562.png) 代码如下: void C无人机地面控制终端Dlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 VARIANT VARIANT_Input; COleSafeArray SafeArray_Input; LONG len, k; BYTE RXData[1024]; CString strtemp ; if (m_mscom.get_CommEvent() == 2) { VARIANT_Input = m_mscom.get_Input(); //读缓冲区 SafeArray_Input = VARIANT_Input; //VARIANT型变量转换为COleSafeArray型变量 len = SafeArray_Input.GetOneDimSize(); for (k = 0; k< len; k++) SafeArray_Input.GetElement(&k, RXData + k); //转换为BYTE型数组 for (k = 0; k < len; k++) { char bt = *(char*)(RXData + k); strtemp.Format(_T("%c", bt)); m_EditReceive += strtemp; // 接收到编辑框里面 } m_EditReceive += "\r\n"; UpdateData(false); m_Edit.SetSel(-1, -1); this->SetDlgItemTextW(IDC_EDIT1, m_EditReceive);//将m_EditReceive内容显示到ID为IDC_EDIT1的编辑框的最后位置 m_Edit.LineScroll(m_Edit.GetLineCount() - 1, 0);//将垂直滚动条滚动到最后一 } } 查了好久了也不知道为什么,求问,不甚感激!
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问