STM32串口发送问题

在串口1发送中,第一个字总是发不出来,单步调试发送正常,硬件上电复位发送不正常,发现是STM32上电复位后需要先读取 USART_SR,然后写 USART_DR,解决办法在串口初始化加入USART_GetFlagStatus(USART2, USART_FLAG_TC);

void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(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);

// NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //

// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
// NVIC_Init(&NVIC_InitStructure);

// - BaudRate = 115200 baud
// - Word Length = 8 Bits
// - One Stop Bit
// - No parity
// - Hardware flow control disabled (RTS and CTS signals)
// - Receive and transmit enabled
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(USART1, &USART_InitStructure);

// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

USART_GetFlagStatus(USART1, USART_FLAG_TC);

}

时间: 2024-10-29 17:51:32

STM32串口发送问题的相关文章

stm32串口发送数据复位 第一个数据丢失

http://blog.csdn.net/kevinhg/article/details/40991655 STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失.换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失.错

stm32 串口发送字符串丢失第一个字节

使用stm32f103调试串口通讯时,上电后发送的字符串的第一个字节丢失. 发送数据GpuSend("SPG(2);"); 接收端收到的数据为:PG(2);,第一个字符丢失. 出现问题的代码如下: 但以前都未出现过这个问题,于是怀疑标志位处理问题 遂看到网友的解答,摘录如下 RM0033中有如下概述 两者的区别在于:往USART_DR中写数据的时候TXE直接被清零.TC清零则需要先读取USART_SR,然后写USART_DR. 解决方法: 在出现错误的代码执行之前加一句: USART_

关于STM32 USART(串口)发送数据丢失第一帧的真实原因探索

自我介绍 为什么要写个自我介绍?俗话说,光说不练假把式,光练不说傻把式, 因为本人一直很自负,感觉什么东西都可以很快上手(当然非对口专业知识要求高的技能除外),如果我不把这自负表现出来,感觉会憋出内伤. 本人于2015年毕业于电子科技大学,开始的理想是进入一家国外的游戏公司,但理想很丰满,现实很骨感,给育碧.2k Game.Gameloft.EA都投了简历,但都被无情pass掉了(在此吐槽一下,这些公司真的是想在校园里招本科生吗?明明是研究生的计算机图形学却成了这些公司对本科生的要求).后来毕业

stm32串口

STM32的串口是相当丰富的,功能也非常强劲.最多可提供5路串口(MiniSTM32使用的是STM32F103RBT6,具有3个串口),有分数波特率发生器.支持单线光通信和半双工单线通讯.支持LIN.智能卡协议和IrDASIR ENDEC规范(仅串口3支持).具有DMA等. 串口最主要的设置.就是波特率的设置.STM32的串口使用起来还是蛮简单的,仅仅要你开启了串口时钟,并设置对应IO口的模式,然后配置一下波特率,数据位长度.奇偶校验位等信息.就能够使用了.以下,我们就简介下这几个与串口基本配置

STM32串口USART1的使用方法和程序

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信. 1.STM32固件库使用外围设备的主要思路 在STM32中,外围设备的配置思路比较固定.首先是使能相关的时钟,一方面是设备本身的时钟,另一方面如果设备通过IO口输出还需要使能IO口的时钟:最后如果对应的IO口是复用功能的IO口,则还必须使能AFIO的时钟. 其次是配置GPIO,GPI

炜煌E30 E31微型热敏打印机 STM32 串口驱动

设置为汉字模式 十六进制 命令:1C    26 USART_SendData(USART2,0x1C); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); USART_SendData(USART2,0x26); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); USART_OUT(USART2,"秦皇岛燕大滨沅科技发展有限公司\r\n"); 将会看到打印输

单片机C51串口发送、接收寄存器

所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和接收是独立空间):读取一个数(1)->发送一个数(2)->再读取得1则是独立空间 不知道STM32串口寄存器和C51串口寄存器是否同样道理 STM32串口寄存器:STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR,对它读操作,读取的是RDR寄存器的值,对它的写操作,实际上是写到TDR寄存器的:当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内. 同步与异步

STM32串口中断的一些资料

在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理的方式,从队列以及FIFO方面写起. SECTION 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /* 调试STM32串口过程中发现一个奇怪的问题,

stm32串口接收完整的数据包

借鉴了文章:<stm32串口中断接收方式详细比较> 文章地址:http://blog.csdn.net/kevinhg/article/details/40186169 串口的配置这里不做说明,仅对中断中的协议解析进行描述 数据帧协议: 帧头1 帧头2 数据长度 有效数据 crc_1 crc_2 B5 5B 03 00 57 0B 帧头1+帧头2+数据长度(包含有效数据.crc_1.crc_2)+有效数据 + crc_1 + crc_2(校验为帧头到有效数据) crc16校验未深入学习,代码也