Stm32通过串口与上位机串口通信通信失败

关于STM32中多串口工作的问题
我的图书馆
关于STM32中多串口工作的问题
USART_SendDataUSART_SendData各位大虾:
& & & 本人刚接触STM32,菜鸟一个。 我最近遇到一个关于STM32中5个串口同时工作的问题,自己忙了一个多月,也查了不少资料,但问题依旧没有解决,所以当自己努力后还没解决问题就要向吧里的各位兄弟姐妹求教了,废话不多说,直奔主题
& & 任务要求是,4路串口分别接收各路数据,然后由一个串口发给上位机;每路数据一共5个字节 & &{FF 81 数据位 数据位 校验和 &} &前两个是帧头和状态位,当中是两个数据位 ,最后是校验和
& & 我的设计思路是: 让串口2~5这四个串口分时接收数据,然后通过串口1发送给电脑; 即先让串口2工作,把串口3、4、5关掉,只有当串口2收到中断里面的正确的状态位并通过串口1发送出去之后关掉串口2,然后使能串口3,当串口3工作完后关掉串口3,如此以往
在中断里面所做的工作就是判断帧头、状态位、校验和正确则置标志位,总的来讲程序设计思路简单;
&&&&我所碰到的问题:只让串口2和3接收,串口1发出,即在代码中注释掉串口4和5工作的部分,工作非常正常,一点问题也没有;
& & & & & & & & & & & & & & & &但是当加入串口4让串口2、3、4同时工作,偶尔这3个串口能正确收几次程序就死掉,运气不好的时候,刚轮到串口4工作就死掉了,但是我把其它串口工作部分注释掉只让串口4收串口1发又是正常的,我现在很纠结,不知道问题出在哪?也不知道该怎么解决?自己调了一个多月,没什么进展,前来向各位兄弟姐妹求教,望指点一二,谢谢!(我用的是战舰板调的,有没有战舰板上短路帽插错导致这种现象的可能?)
这是USART.C&
001#include "sys.h"002#include "usart.h"&&& 003&004u8 USART2_RX_BUF[USART_REC_LEN];&&&& //接收缓冲,最大USART_REC_LEN个字节.005u8 USART3_RX_BUF[USART_REC_LEN];006u8 UART4_RX_BUF[USART_REC_LEN];007u8 UART5_RX_BUF[USART_REC_LEN];008&009&010u8 m=0;011u8 n=0;012u8 p=0;013u8 q=0;014&015&016u8 i=0;017&018u16 USART2_RX_STA=0;&&&&&& //接收状态标记//接收状态标记&& 019u16 USART3_RX_STA=0;020u16 UART4_RX_STA=0;&&&&&& //接收状态标记&&& 021u16 UART5_RX_STA=0;022&023//初始化串口1`5 024//bound:波特率025void uart_init(u32 bound){026&&&&//GPIO端口设置027&&&&GPIO_InitTypeDef GPIO_InitS028&&&&USART_InitTypeDef USART_InitS029&&&&NVIC_InitTypeDef NVIC_InitS030&&&&&&031&&&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);&&& //使能USART1,GPIOA时钟032&&&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);& 033&&034&&035&&036&&037&&038&&&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3, ENABLE);039&&&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4|RCC_APB1Periph_UART5, ENABLE);040&041&042&043&&&&USART_DeInit(USART1);& //复位串口1`5044&&&&USART_DeInit(USART2); 045&&&&USART_DeInit(USART3); 046&&&&USART_DeInit(UART4); 047&&&&USART_DeInit(UART5);&&&&&&& 048&&&&&&049&&&&&&050&&&&&&051&&&&&&052&&&&&&053&&&&&&054&&&&&&055&&&&&//USART1_TX& USART2_TX& PA.9 PA.2056&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_9; //PA.9与PA.2057&&&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;058&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出059&&&&GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9060&&&&061&&&&//USART1_RX USART2_RX& PA.10& PA.3062&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_10;063&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入064&&&&GPIO_Init(GPIOA, &GPIO_InitStructure);& //初始化PA10065&066&067&068&&&&&//USART3_TX&& PB.10069&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10070&&&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;071&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出072&&&&GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PA9073&&&&074&&&&//USART3_RX&& PB.11075&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;076&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入077&&&&GPIO_Init(GPIOB, &GPIO_InitStructure);& //初始化PA10078&079&&&&//UART4_TX&& UART5_TX&& PC10 PC12080&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; //PC10 PC12081&&&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;082&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出083&&&&GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC10 PC12084&085&086&&&&//UART4_RX&&&& PC11087&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;088&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入089&&&&GPIO_Init(GPIOC, &GPIO_InitStructure);& //初始化PC11090&091&&&&//UART5_RX&&&& PD2092&&&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;093&&&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入094&&&&GPIO_Init(GPIOD, &GPIO_InitStructure);& //初始化 PD2095&096&097&098&099&100&&&//USART1 初始化设置101&102&&&&USART_InitStructure.USART_BaudRate =//一般设置为9600;103&&&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式104&&&&USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位105&&&&USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位106&&&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//无硬件数据流控制107&&&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式108&109&&&&USART_Init(USART1, &USART_InitStructure); //初始化串口110&111&&//USART2 初始化设置112&113&&&&USART_InitStructure.USART_BaudRate =//一般设置为9600;114&&&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式115&&&&USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位116&&&&USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位117&&&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//无硬件数据流控制118&&&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式119&120&&&&USART_Init(USART2, &USART_InitStructure); //初始化串口121&122&123&124&&&&&&//USART3 初始化设置125&126&&&&USART_InitStructure.USART_BaudRate =//一般设置为9600;127&&&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式128&&&&USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位129&&&&USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位130&&&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//无硬件数据流控制131&&&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式132&133&&&&USART_Init(USART3, &USART_InitStructure); //初始化串口134&135&136&137&&&&&&&&//UART4 初始化设置138&139&&&&USART_InitStructure.USART_BaudRate =//一般设置为9600;140&&&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式141&&&&USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位142&&&&USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位143&&&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//无硬件数据流控制144&&&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式145&146&&&&USART_Init(UART4, &USART_InitStructure); //初始化串口147&148&149&150&&&&&&&&&&&//UART5 初始化设置151&152&&&&USART_InitStructure.USART_BaudRate =//一般设置为9600;153&&&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式154&&&&USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位155&&&&USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位156&&&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//无硬件数据流控制157&&&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式158&159&&&&USART_Init(UART5, &USART_InitStructure); //初始化串口160&161&162&163&164&165&166&167&168&169&170&171&&&//Usart1 NVIC 配置172&&&&NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;173&&&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3174&&&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;&&&&& //子优先级3175&&&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&&&&&&&& //IRQ通道使能176&&&&NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器177&&&&178&&&&USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断179&180&181&&&NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;182&&&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3183&&&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;&&&&& //子优先级3184&&&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&&&&&&&& //IRQ通道使能185&&&&NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器186&&&&187&&&&USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断188&189&190&191&&&&NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;192&&&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3193&&&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;&&&&& //子优先级3194&&&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&&&&&&&& //IRQ通道使能195&&&&NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器196&&&&197&&&&USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启中断198&199&200&&&&NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;201&&&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3202&&&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;&&&&& //子优先级3203&&&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&&&&&&&& //IRQ通道使能204&&&&NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器205&&&&206&&&&USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启中断207&208&209&210&211&212&213&&&&USART_Cmd(USART1, ENABLE);&&&&&&&&&&&&&&&&&&& //使能串口 214&/*&& USART_Cmd(USART2, ENABLE); 215&&&&USART_Cmd(USART3, ENABLE);216&&&&USART_Cmd(UART4, ENABLE); 217&&&&USART_Cmd(UART5, ENABLE);&&&& */218&219}220&221&222&223void USART2_IRQHandler(void)&&&&&&&&&&&&&&&&&&& //串口2中断服务程序224&&&&{225&&&&u8 Res2;226&227&228&&&&if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)& //229&&&&&&&&{230&&&&&&&&Res2=USART_ReceiveData(USART2);//(USART2-&DR);&& //读取接收到的数据231&&&&&&&&&232&&&&&&&&&&&&USART2_RX_BUF[USART2_RX_STA]=Res2;& 233&&&&&&&&&&&&&USART2_RX_STA++;234&235&&&&&&&&&&&&&&&&if(USART2_RX_STA==5)236&237&&&&&&&&&&&&&{238&&&&&&&&&&&&&&&USART2_RX_STA=0;239&&&&&&&&&&&&&&&&&240&&&&&&&&&&&&&&i=USART2_RX_BUF[0]+USART2_RX_BUF[1]+USART2_RX_BUF[2]+USART2_RX_BUF[3];241&&&&&&&&&242&&&&&&&&&&&&&if(USART2_RX_BUF[0]==0XFF&&USART2_RX_BUF[1]==0X81&&i==USART2_RX_BUF[4])243&244&&&&&&&&&&&&&&&{245&&&&&&&&&&&&&246&&&&&&&&&&&&&&&&m=0x01;247&&&&&&&&&&&&&&&&&248&&&&&&&&&&&&&&&&&&}249&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&250&&&&&&&&&&&&&&else {m=0;}251&&&&&&&&&252&&&&&&&&&&&&&&&}253&254&&&&&&&&&&&&}&&&&&&&&&&& 255&256&&&&&&&&&}257&258&259&260void USART3_IRQHandler(void)&&&&&&&&&&&&&&&&&&& //串口3中断服务程序261&&&&{262&&&&u8 Res3;263&264&265&&&&if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)& //266&&&&&&&&{267&&&&&&&&Res3=USART_ReceiveData(USART3);//(USART2-&DR);&& //读取接收到的数据268&&&&&&&&&269&&&&&&&&&&&&USART3_RX_BUF[USART3_RX_STA]=Res3;& 270&&&&&&&&&&&&&USART3_RX_STA++;271&272&&&&&&&&&&&&&&&&if(USART3_RX_STA==5)273&274&&&&&&&&&&&&&{275&&&&&&&&&&&&&&&USART3_RX_STA=0;276&&&&&&&&&&&&&&&&&277&&&&&&&&&&&&&&i=USART3_RX_BUF[0]+USART3_RX_BUF[1]+USART3_RX_BUF[2]+USART3_RX_BUF[3];278&&&&&&&&&279&&&&&&&&&&&&&if(USART3_RX_BUF[0]==0XFF&&USART3_RX_BUF[1]==0X81&&i==USART3_RX_BUF[4])280&281&&&&&&&&&&&&&&&{282&&&&&&&&&&&&&283&&&&&&&&&&&&&&&&n=0x01;284&&&&&&&&&&&&&&&&&285&&&&&&&&&&&&&&&&&&}286&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&287&&&&&&&&&&&&&&else {n=0;}288&&&&&&&&&289&&&&&&&&&&&&&&&}290&291&&&&&&&&&&&&}&&&&&&&&&&& 292&293&&&&&&&&&}294&295&296&297&298void UART4_IRQHandler(void)&&&&&&&&&&&&&&&& //串口4中断服务程序299&&&&{300&&&&u8 Res4;301&302&303&&&&if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)& //304&&&&&&&&{305&&&&&&&&Res4=USART_ReceiveData(UART4);//读取接收到的数据306&&&&&&&&&307&&&&&&&&&&&&UART4_RX_BUF[UART4_RX_STA]=Res4;&&& 308&&&&&&&&&&&&&UART4_RX_STA++;309&310&&&&&&&&&&&&&&&&if(UART4_RX_STA==5)311&312&&&&&&&&&&&&&{313&&&&&&&&&&&&&&&UART4_RX_STA=0;314&&&&&&&&&&&&&&&&&315&&&&&&&&&&&&&&i=UART4_RX_BUF[0]+UART4_RX_BUF[1]+UART4_RX_BUF[2]+UART4_RX_BUF[3];316&&&&&&&&&317&&&&&&&&&&&&&if(UART4_RX_BUF[0]==0XFF&&UART4_RX_BUF[1]==0X81&&i==UART4_RX_BUF[4])318&319&&&&&&&&&&&&&&&{320&&&&&&&&&&&&&321&&&&&&&&&&&&&&&&p=0x01;322&&&&&&&&&&&&&&&&&323&&&&&&&&&&&&&&&&&&}324&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&325&&&&&&&&&&&&&&else {p=0;}326&&&&&&&&&327&&&&&&&&&&&&&&&}328&329&&&&&&&&&&&&}&&&&&&&&&&& 330&331&&&&&&&&&}332&333&334&335&336&337void UART5_IRQHandler(void)&&&&&&&&&&&&&&&& //串口5中断服务程序338&&&&{339&&&&u8 Res5;340&341&342&&&&if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) 343&&&&&&&&{344&&&&&&&&Res5=USART_ReceiveData(UART5);//读取接收到的数据345&&&&&&&&&346&&&&&&&&&&&&UART5_RX_BUF[UART5_RX_STA]=Res5;&&& 347&&&&&&&&&&&&&UART5_RX_STA++;348&349&&&&&&&&&&&&&&&&if(UART5_RX_STA==5)350&351&&&&&&&&&&&&&{352&&&&&&&&&&&&&&&UART5_RX_STA=0;353&&&&&&&&&&&&&&&&&354&&&&&&&&&&&&&&i=UART5_RX_BUF[0]+UART5_RX_BUF[1]+UART5_RX_BUF[2]+UART5_RX_BUF[3];355&&&&&&&&&356&&&&&&&&&&&&&if(UART5_RX_BUF[0]==0XFF&&UART5_RX_BUF[1]==0X81&&i==UART5_RX_BUF[4])357&358&&&&&&&&&&&&&&&{359&&&&&&&&&&&&&360&&&&&&&&&&&&&&&&q=0x01;361&&&&&&&&&&&&&&&&&362&&&&&&&&&&&&&&&&&&}363&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&364&&&&&&&&&&&&&&else {q=0;}365&&&&&&&&&366&&&&&&&&&&&&&&&}367&368&&&&&&&&&&&&}&&&&&&&&&&& 369&370&&&&&&&&&}371&372&373USART.H部分的源码
01#ifndef __USART_H02#define __USART_H03#include "stdio.h"& 04#include "sys.h" 05&06&07&08&09#define USART_REC_LEN&&&&&&&&&& 5&& //定义最大接收字节数 20010&11&&&&&&&&&12extern u8& USART2_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 13extern u8& USART3_RX_BUF[USART_REC_LEN];14extern u8& UART4_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 15extern u8& UART5_RX_BUF[USART_REC_LEN];16&17extern u8&18extern u8&19extern u8&20extern u8&21&22&23&24&25&26extern u16 USART2_RX_STA;&&&&&&&&&&&&&& //接收状态标记&&& 27extern u16 USART3_RX_STA; 28extern u16 UART4_RX_STA;&&&&&&&&&&&&&&& //接收状态标记&&& 29extern u16 UART5_RX_STA; 30&31&32&33//如果想串口中断接收,请不要注释以下宏定义34void uart_init(u32 bound);35#endif
main.c部分源码
001#include "sys.h"002#include "usart.h"003&004&int main(void)005&{& 006&&007&&&&&008&&&&u8 t=0;009&&&&NVIC_Configuration();&&& //设置NVIC中断分组2:2位抢占优先级,2位响应优先级010&&&&uart_init(9600);&&&& //串口初始化为9600011&012&&&&while(1)013&&&&{014&&&&&&015&&&&&&//串口2016&017&018&&&&USART_Cmd(USART2, ENABLE);&&&&&&&&&&&&&&&&& //使能串口2019&&&&&while(m!=0X01);020&&&&&&&&{&&&&&&&&&&&&&&&&&&&&& 021&&&&&&&&&022&&&&&&&&&USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//在此处要关闭中断023&&&&&&&&&&&&m=0;&&& 024&&&&&&&&&&&&for(t=0;t&5;t++)025&&&&&&&&&&&&{026&&&&&&&&&&&&&&&&USART_SendData(USART1, USART2_RX_BUF[t]);//向串口1发送数据027&&&&&&&&&&&&&&&&while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束028&&&&&&&&&&&&}&&&& 029&030&&&&&&&&&&&USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);& //开启串口中断031&032&&&&&&&&}033&&&&&034&035&&&&USART_Cmd(USART2, DISABLE);&&&&&&&&&&&&&&&&&&&&&& //失能串口2036&037&038&&&&//串口3039&040&041&USART_Cmd(USART3, ENABLE); 042&043while(n!=0X01);044&&&&&&&&{&&&&&&&&&&&&&&&&&&&&& 045&&&&&&&&&046&&&&&&&&&USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);//在此处要关闭中断047&&&&&&&&&&&&n=0;&&& 048&&&&&&&&&&&&for(t=0;t&5;t++)049&&&&&&&&&&&&{050&&&&&&&&&&&&&&&&USART_SendData(USART1, USART3_RX_BUF[t]);//向串口1发送数据051&&&&&&&&&&&&&&&&while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束052&&&&&&&&&&&&}&&&& 053&054&&&&&&&&&&&USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);& //开启串口中断055&&&&&056&&&&&057&&&&&&&&&058&&&&&&&&}059&060&061&&&&USART_Cmd(USART3, DISABLE);&&&&&&&&&&&& 062&063&064&065&066&067&068&//串口4069&070&USART_Cmd(UART4, ENABLE); 071&072while(p!=0X01);073&&&&&&&&{&&&&&&&&&&&&&&&&&&&&& 074&&&&&&&&&075&&&&&&&&&USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);//在此处要关闭中断076&&&&&&&&&&&&p=0;&&& 077&&&&&&&&&&&&for(t=0;t&5;t++)078&&&&&&&&&&&&{079&&&&&&&&&&&&&&&&USART_SendData(USART1, UART4_RX_BUF[t]);//向串口1发送数据080&&&&&&&&&&&&&&&&while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束081&&&&&&&&&&&&}&&&& 082&083&&&&&&&&&&&USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);& //开启串口中断084&&&&&085&&&&&086&&&&&&&&&087&&&&&&&&}088&089&090&&&&USART_Cmd(UART4, DISABLE); 091&092&&&093&094&095&096&097&098//&& 串口5099&&&100&USART_Cmd(UART5, ENABLE); 101&102while(q!=0X01);103&&&&&&&&{&&&&&&&&&&&&&&&&&&&&& 104&&&&&&&&&105&&&&&&&&&USART_ITConfig(UART5, USART_IT_RXNE, DISABLE);//在此处要关闭中断106&&&&&&&&&&&&q=0;&&& 107&&&&&&&&&&&&for(t=0;t&5;t++)108&&&&&&&&&&&&{109&&&&&&&&&&&&&&&&USART_SendData(USART1, UART5_RX_BUF[t]);//向串口1发送数据110&&&&&&&&&&&&&&&&while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束111&&&&&&&&&&&&}&&&& 112&113&&&&&&&&&&&USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);& //开启串口中断114&&&&&115&&&&&116&&&&&&&&&117&&&&&&&&}118&119&120&&&&USART_Cmd(UART5, DISABLE);&&&&&&& 121&122&123&124&125&126&127&128&129&130&131&132&&&&}&&& 133&}
TA的最新馆藏
喜欢该文的人也喜欢查看: 96|回复: 0
STM32串口和上位机对话实验源码
& & 学习串口的使用(接收与发送)
& & 1,DS0(连接在PB5)&&
& & 2,串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
& & 本实验,STM32通过串口1和上位机对话,STM32在收到上位机发过来的字符串(以回车换行结束)后,& & 原原本本的返回给上位机。下载后,DS0闪烁,提示程序在运行,同时每隔一定时间,通过串口1输出一段信息到电脑。
& & 1,电脑端串口调试助手波特率必须是115200.
& & 2,请使用XCOM/SSCOM串口调试助手,其他串口助手可能控制DTR/RTS导致MCU复位/程序不运行
& & 3,串口输入字符串以回车换行结束.
& & 4,请用USB线连接在USB_232,找到USB转串口后测试本例程.
& & 5,P4的PA9/PA10必须通过跳线帽连接在RXD/TXD上.
单片机源程序如下:
#include &led.h&
#include &delay.h&
#include &key.h&
#include &sys.h&
#include &usart.h&
#include &dac.h&&&
#include &adc.h&
#include &stdlib.h&
#include &STM32_WaveOutput.h&
#include &timer.h&
int main(void)
& & & & u16&&
& & & & u16& & & &
& & & & u16
& & & & delay_init();& & & && &&&& & & &&&//延时函数初始化& & & && &
& & & & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
& & & & uart_init(9600);& & & &&&//串口初始化为9600
& & & & LED_Init();& & & & & & & & & & & && && &//LED端口初始化
& & & & KEY_Init();& && && & //初始化与按键连接的硬件接口
& & & &&&Dac1_Init();
& & & & // Dac2_Init();
& & & &&&Adc_Init();
& & & &&&
& & & &&&& & & & TIM1_PWM_Init(255,0);& & & & //TIM1 PWM初始化, Fpwm=72M/256=281.25Khz.
&&TIM_SetCompare1(TIM1,0);//初始值为0& & & &
& & & & while(1)
& & & & {
& & & & & & & & char msgbuf[32];
& & & &
& & & & & & & & if(USART_RX_STA&0x8000)
& & & & & & & & {& & & & & & & & & & & & & & & & & & & && &
& & & & & & & & & & & & len=USART_RX_STA&0x3//得到此次接收到的数据长度
& & & & & & & &
& & & & & & & && &
& & & & & & & & & & & & if(USART_RX_BUF[0]=='V')& & & &
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if(len==2)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & && && &for(t=1;t&t++)
& & & & & & & & & & & && && &{
& & & & & & & & & & & && && &&&& & & & msgbuf[t]= USART_RX_BUF[t];//把接收到的数据存放在数组中
& & & & & & & & & & & & & & & &
& & & & & & & & & & & && && & & & & & msgbuf[t]=atof(&msgbuf[t]);& & & & & & & &
& && && && & & & & & & & & & & & & & & & & & & & & &&&
& & & & & & & & & & & && && &}
& & & & & & & & & & & & & & & & & & & && &USART_SendData(USART1,msgbuf[1]*409.5);
& & & & & & & & & & & & & & & & & & & &&&SineWave_Init( SawToothWave,10,ENABLE,msgbuf[1]);//PA4输出为& & & & 10Hz的三角波(最大时为3.6,一般稳定在3.4V左右)& & & & & & & & & & & & & & & & & & & &&&& & & & & & & &&&
& &&&& & & & & & & & & & & & & & & && && &while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束& & & & & & & & & & & & & & & & & & & &&&
& & & & & & & & & & & & & & & &&&}
& & & & & & & & & & & &&&}
& & & & & & & &&&}
& & & &&&}
所有资料51hei提供下载:
(312.42 KB, 下载次数: 3)
01:03 上传
点击文件名下载附件
下载积分: 黑币 -5
Powered by开发过程经常需要查看某些特定参数。通常的方法可以使用paintf进行打印输出,观察具体的变量值。STM32内部集成有USART的串口功能,可以通过串口直接输出到电脑(上位机)。使用非常方便,基本不需要不需要写代码,只要配置一下就可以使用。
简单设置就可以看到上面的效果
配置方法:
& 1、重定向printf的输出函数 int fputc(int ch, FILE *f)
& 2、配置STM32F10x的USART串口
重定向方法 stdio.h 的输出内容
int fputc(int ch, FILE *f)
// 等待USART1 数据发送完成(发送区域空)
while (!(USART1-&SR & USART_SR_TXE));
// 填充发送寄存器,数据 + 校验位 最多9位
USART1-&DR = (ch & 0x1FF);
return (ch);
启动STM32的 USART1 串口
& & 1、使能 复用功能
& & 2、使能 A引脚(USART1 在 PA9,PA10)
& & 3、使能 USART1
& & 4、设置 PA9(TX)复用推挽输出
& & 5、设置 PA10(RX)输入浮空
& & 6、 设置串口参数:波特率、数据位、校验、停止位、流控制
& & 7、使能串口、使能输入、使能输出
void serial_init(void)
设置串口调试
出: USART1
脚: PA9(TX), PA10(RX)
波特率: 9600
数据位: 8 bit (default)
停止位: 1 bit (default)
流控制: none
// 清除设置后上面配置为系统默认状态
/// 使能复用功能,使能GPIOA,使能USART1
RCC-&APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 关闭映射,确保USART使用 PA9,PA10
AFIO-&MAPR &= ~AFIO_MAPR_USART1_REMAP;
// 清除PA9,PA10状态
GPIOA-&CRH &= ~( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 |
GPIO_CRH_CNF10 | GPIO_CRH_MODE10 );
// 设置PA9 发送 为复用推挽输出 2MHz
GPIOA-&CRH |= GPIO_CR_AFOUT_PP2MHz & ( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 );
// 设置PA10接收 为复用上拉下拉模式
GPIOA-&CRH |= GPIO_CR_AFIN_PULLDOWN & ( GPIO_CRH_CNF10 | GPIO_CRH_MODE10 );
// 设置波特率为 9600
// 计算方法
系统时钟 / (16分频 * 波特率)
Baud = 72,000,000 / (16 * 9600) = 468.75
整数部分 && 4 + 取整(小数部分 * 16)
468 && 4 + 0.75 * 16
USART1-&BRR = __USART_BRR(SystemCoreClock, 9600);
// 清除寄存器状态
USART1-&CR1 = USART_CR1_REST;
USART1-&CR2 = USART_CR2_REST;
// 停止位 1
USART1-&CR3 = USART_CR3_REST;
// 没用控制流
// 防止产生不必要的信息
for (i = 0; i & 0x1000; i++) __NOP();
// USART1 使能, 使能输出,使能输入
USART1-&CR1 =
USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
整个过程中关键的输出定向主要用到了2个寄存器:
& &一个状态寄存器,检查发送是否为空(USART_ST_TXE)
& 一个数据寄存器,用于发送数据
int main(void)
uint8_t ud = 'a';
Delay_init();
// 初始化串口调试
serial_init();
// 使用寄存器直接 输出 a~z
while (ud &= 'z') {
while (!(USART1-&SR & USART_SR_TXE));
USART1-&DR =
// 使用打印重定向输出字符串
printf("\ntest!\n");
printf("USART1 使能, 使能输出,使能输入\n");
while (1) {
Delay(20); // 太快降低速度方便看结果(200ms延迟)
// 使用寄存器直接输出
while (!(USART1-&SR & USART_SR_TXE));
USART1-&DR =
// 使用打印输出换行
if (ud & 'z') {
printf("\n");
具体的配置寄存器可以查看《参考手册》
#define GPIO_CR_RESET
(uint32_t)0x
#define GPIO_CR_MODE_INPUT
(uint32_t)0x
#define GPIO_CR_MODE_2MHz
(uint32_t)0x
#define GPIO_CR_MODE_10MHz
(uint32_t)0x
#define GPIO_CR_MODE_50MHz
(uint32_t)0x
#define GPIO_CR_GP_PUSHPULL
(uint32_t)0x
#define GPIO_CR_GP_OPENDRAIN
(uint32_t)0x
#define GPIO_CR_OUT_PP2MHz
(GPIO_CR_MODE_2MHz | GPIO_CR_GP_PUSHPULL)
#define GPIO_CR_OUT_PP50MHz
(GPIO_CR_MODE_50MHz | GPIO_CR_GP_PUSHPULL)
#define GPIO_CR_AFO_PUSHPULL
(uint32_t)0x
#define GPIO_CR_AFO_OPENDRAIN
(uint32_t)0xcccccccc
#define GPIO_CR_AFOUT_PP2MHz
(GPIO_CR_MODE_2MHz | GPIO_CR_AFO_PUSHPULL)
// 复用推挽输出,2MHz
#define GPIO_CR_AFIN_FLOAT
(uint32_t)0x
// 复用开漏输入
#define GPIO_CR_AFIN_PULLDOWN
(uint32_t)0x
// 复用上拉下拉输入
#define USART_CR1_REST
(uint32_t)0x
#define USART_CR2_REST
(uint32_t)0x
#define USART_CR3_REST
(uint32_t)0x
********************************************************************
* @version
小穆妹纸串口调试
********************************************************************
#include &stdio.h&
#include "armsis.h"
/*----------------------------------------------------------------------------
Baudrate setting (BRR) for USART
*----------------------------------------------------------------------------*/
#define __DIV(__PCLK, __BAUD)
((__PCLK*25)/(4*__BAUD))
#define __DIVMANT(__PCLK, __BAUD)
(__DIV(__PCLK, __BAUD)/100)
#define __DIVFRAQ(__PCLK, __BAUD)
(((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) * 16 + 50) / 100)
#define __USART_BRR(__PCLK, __BAUD) ((__DIVMANT(__PCLK, __BAUD) && 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F))
//struct __FILE { /* Add whatever you need here */ };
int fputc(int ch, FILE *f)
// 等待USART1 数据发送完成(发送区域空)
while (!(USART1-&SR & USART_SR_TXE));
USART1-&DR = (ch & 0x1FF);
return (ch);
void serial_init(void)
设置串口调试
出: USART1
脚: PA9(TX), PA10(RX)
波特率: 9600
数据位: 8 bit (default)
停止位: 1 bit (default)
流控制: none
// 清除设置后上面配置为系统默认状态
/// 使能复用功能,使能GPIOA,使能USART1
RCC-&APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 关闭映射,确保USART使用 PA9,PA10
AFIO-&MAPR &= ~AFIO_MAPR_USART1_REMAP;
// 清除PA9,PA10状态
GPIOA-&CRH &= ~( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 |
GPIO_CRH_CNF10 | GPIO_CRH_MODE10 );
// 设置PA9 发送 为复用推挽输出 2MHz
GPIOA-&CRH |= GPIO_CR_AFOUT_PP2MHz & ( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 );
// 设置PA10接收 为复用上拉下拉模式
GPIOA-&CRH |= GPIO_CR_AFIN_PULLDOWN & ( GPIO_CRH_CNF10 | GPIO_CRH_MODE10 );
// 设置波特率为 9600
// 计算方法
系统时钟 / (16分频 * 波特率)
Baud = 72,000,000 / (16 * 9600) = 468.75
整数部分 && 4 + 取整(小数部分 * 16)
468 && 4 + 0.75 * 16
USART1-&BRR = __USART_BRR(SystemCoreClock, 9600);
// 清除寄存器状态
USART1-&CR1 = USART_CR1_REST;
USART1-&CR2 = USART_CR2_REST;
// 停止位 1
USART1-&CR3 = USART_CR3_REST;
// 没用控制流
// 防止产生不必要的信息
for (i = 0; i & 0x1000; i++) __NOP();
// USART1 使能, 使能输出,使能输入
USART1-&CR1 =
USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
整理后的串口配置代码 Serial.c
********************************************************************
* @version
小穆妹纸串口调试
********************************************************************
#ifndef __SERIAL_H__
#define __SERIAL_H__
#ifdef __cplusplus
extern "C" {
void serial_init(void);
#ifdef __cplusplus
串口调试头 Serial.h
阅读(...) 评论()

我要回帖

更多关于 c 串口通信 上位机 的文章

 

随机推荐