stm32-STM32 串口收发数据出错

问题描述

STM32 串口收发数据出错

#include "stm32f10x.h"
#include
/*************************************************
函数: 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);
}

解决方案

哇这么麻烦 真心不懂

解决方案二:

怎么个出错法?? 能收到吗?

解决方案三:

时钟开错了,usart1挂在apb2,其他串口挂在apb1

时间: 2024-10-30 07:25:36

stm32-STM32 串口收发数据出错的相关文章

C#串口收发数据,子线程更新textbox控件内容,一段时间后,界面卡死,请教问题原因所在

问题描述 1.现象描述:我自己用C#做了一个模拟流量计软件,下位机大概每100ms会发送一些数据(8字节),我的软件接收后,响应一个9字节的数据.数据的接收和发送都在richtextbox中显示出来.我开了一个子线程,这个线程每100ms去更新textbox控件内容,(就是先读取textbox的内容,在此基础上递增一个常量,再显示在textbox中),程序能够正常运行一段时间,然后就出现了界面卡死的现象,串口能够正常收发,richtextbox中的日志数据能够正常打印,但就是主界面死掉了,点什么

stm32 ucosii-STM32 UCOSII环境下,在进入程序的时候就会给串口发送数据

问题描述 STM32 UCOSII环境下,在进入程序的时候就会给串口发送数据 STM32 UCOSII环境下,在进入程序的时候就会给串口发送一串数据这是我连上串口打开串口调试助手发现的数据(我直接运行的代码例程)8C ED 16 43 0A 3F 3A 20 48 65 6C 70 20 28 54 68 69 73 20 6D 65 6E 75 29 0A 6D 8D 1.你们有没有遇到?2.请问这是为么出现此情况?3.如何解决这个问题?

字符-MFC使用串口通信收发数据问题

问题描述 MFC使用串口通信收发数据问题 我使用VS2010的MSCOM控件编写串口程序,程序需要向下位机发送一些数据,而下位机收到数据是会作出应答.我用的是 :m_com1.put_Output(COleVariant(_T(""12""))); //m_com1为MSCOM控制变量但发现后面下位机接收的是1和2的ASCII码对应的字符:想问问各位大神有没有可以直接给下位机12数字而不是ASCII码的 解决方案 发送数字12,你就直接写12,不要使用双引号.使用

VS2010下用C#编写串口通信时,设置了SerialPort的校验位后,后是否需要在收发数据时添加人为的校验或者解析程序?

问题描述 SerialPort控件的校验位设置为奇校验或者偶校验之后,在收发数据时还需要手动计算校验位吗? 解决方案 解决方案二:最好写上检验部分的代码??我之前做过串口传输的,解析串口协议之后,还写了检验部分解决方案三:手动计算校验位???不需要但是需要计算校验.校验和校验位是2回事常用的校验有CRC(循环冗余校验,ModbusRTU),SUM(累加),XOR(异或),LRC(ModbusASCII)解决方案四:引用2楼Z65443344的回复: 手动计算校验位???不需要但是需要计算校验.校

STM32操作写入FLASH信息出错

问题描述 STM32操作写入FLASH信息出错 STM32操作写入FLASH信息时,发现官方的库执行中FLASH->SR CR寄存器会报错,请问如何解决 解决方案 你的操作方式正确么?

“通过串口收发短消息”的Q&amp;amp;A汇编

就"通过串口收发短消息"专题,本人将同网友交流.探讨的部分技术问题整理成如下文字.希望这篇文章能对更多对SMS感兴趣的朋友有所帮助.由于本人是业余爱好,时间和金钱都有限,没有力量将很多型号的手机和模块一一试验,可能存在这样那样的差错,希望行内高人批评指正. 我写了个短信发送程序,使用PDU格式发送,程序在广州使用一点问题也没有,在河南却怎么也发不出去.不知道为什么,短信"你好吗"格式如下: 河南: 0891683108200005F011000D9168317003

485 232-232转USB读取数据正确,但485转USB读取数据出错,用调试助手都可以正常接收数据。

问题描述 232转USB读取数据正确,但485转USB读取数据出错,用调试助手都可以正常接收数据. 用485转USB读取数据有时候正确,有时候乱码.硬件应该没有问题,用调试工具可以正确接收数据. 本人使用的是控件编写的测试程序,,,实在不行用API编写不知道会不会有同样情况..求大神指导... variant_inp = m_ctrlComm.GetInput(); safearray_inp = variant_inp; len = safearray_inp.GetOneDimSize();

C# 使用serialPort,在Timertick里使用串口发送数据,同时再接收串口数据,发生冲突

问题描述 RT,有没有办法互不干扰,我的TimerTick设置的是200ms 解决方案 解决方案二:说清楚什么干扰,只能理解为你处理的不好解决方案三:解释一下,接收使用_DataRecevied事件,并不是在Timer_Tick中解决方案四:引用1楼bdmh的回复: 说清楚什么干扰,只能理解为你处理的不好 具体情况是,接收事件触发不了privatevoidtimer_CheckPLC_Tick(objectsender,EventArgse){ModbusRegisterRead_1(726);

qt-QT第三串口接收数据后对数据进行解析

问题描述 QT第三串口接收数据后对数据进行解析 运用第三方串口类进行接收数据后 将数据存在temp中 ,然后再对temp进行解析判断进行不同的操作,但在编译时候会报错,如何解决? 解决方案 temp=='A'改成temp==""A""