完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
main.c #include "main.h" char data[100] ; //数据缓冲流,用来存储数据 int main() { System_Init(); //系统初始化 SysTick_Init(NULL); //必须有否则会出问题 LED_Init(); //LED灯初始化,用来观察实验现象 USART1_Init(); //串口1初始化 while(1) { scanf("%s",data); //输入函数,可以输入数据到data数组中 //这里的本质是计算机向32发送数据 printf("输入的结果:%s",data); //输出函数,将数据打印出来 //这里的本质是32向计算机发送数据 USART1_receive(); //串口1接收函数 //本质是通过串口1 使32接收数据(这个函数使用有一些问题后面会提到) } } main.h 这里是各种头文件不再解释 #ifndef __MAIN_H_ #define __MAIN_H_ #include "stm32f1xx.h" #include "stm32_types.h" #include "stm32_system.h" #include "delay.h" //驱动头文件 #include "Systick.h" #include "led.h" #include "usart.h" #endif usart.h #ifndef __USART_H_ #define __USART_H_ #include "stm32f1xx.h" #include "stm32_types.h" #include "stm32f1xx_hal.h" #include "delay.h" #include "stdio.h" #include "stdlib.h" #include //这三个头文件是为了使用printf scanf 重定义和strlen函数 #define UART_LSR_RDR (1<<5) //接收完成标志 #define UART_LSR_THRE (1<<6) //发送完成标志 #define SEND_BUF1 (USART1->DR) //串口1发送缓冲区 #define RECV_BUF1 (USART1->DR) //串口1接收缓冲区 #define USART1_SR (USART1->SR) //串口1状态 #define SEND_BUF2 (USART2->DR) #define RECV_BUF2 (USART2->DR) #define USART2_SR (USART2->SR) //和一同理 void USART1_Init(void); //串口1初始化 void USART1_receive(void); //串口1接收数据 本质32接收计算机的信息 void USART1_send(char *data); //串口1发送数据 本质32向计算机发送信息 #endif usart.c #include "usart.h" UART_HandleTypeDef usart1; //串口结构体句柄语句 u8 test_rxbuf1[200]; //接收缓冲流数组 u8 rx_index1; //接收长度 void USART1_Init(void)//串口初始化 { GPIO_InitTypeDef GPIO_InitStruct; __GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __USART1_CLK_ENABLE(); //使能USART1时钟 GPIO_InitStruct.Pin = GPIO_PIN_9; //UASRT1对应IO口PA9 TX GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; //复用开漏输出模式 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速 GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PA9,PA10 GPIO_InitStruct.Pin = GPIO_PIN_10; //UASRT1对应IO口PA10 RX GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT; //配置为输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PA10 RX usart1.Instance = USART1; //串口1 usart1.Init.BaudRate = 115200; //波特率设置 usart1.Init.WordLength = UART_WORDLENGTH_8B; //8位 usart1.Init.StopBits = UART_STOPBITS_1; //1个停止位 usart1.Init.Parity = UART_PARITY_NONE; //无校验 usart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流 usart1.Init.Mode = UART_MODE_TX_RX; //串口发送,接收使能 usart1.Init.OverSampling = UART_OVERSAMPLING_16; //16倍过采样 HAL_UART_Init(&usart1); //初始化串口 //__HAL_UART_ENABLE_IT(&usart1, UART_IT_RXNE); //使能接收中断 //HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); //HAL_NVIC_EnableIRQ(USART1_IRQn); //后面这三个语句重点说一下,当我们使用scanf重定义的时候这三个需要注释才能使用scanf语句,但是void USART1_IRQHandle(void)因为中断函数被注释所以不能使用。 //但当我们把注释取消的时候,scanf函数将出现问题。 } void USART1_IRQHandler(void) { unsigned long temp; temp = USART1_SR; if(temp&UART_LSR_RDR) { test_rxbuf1[rx_index1++] = RECV_BUF1; } HAL_UART_IRQHandler(&usart1); } void USART1_send(char *data) { uint16_t i,j; i = strlen(data); for(j=0; j { while((USART1_SR&UART_LSR_THRE)==0); SEND_BUF1 = data[j]; } } void USART1_receive(void) { while(rx_index1) { uint8_t i; printf("usart1串口接收到: "); for(i=0;i printf("%c",test_rxbuf1); } printf("rn"); rx_index1 = 0; } } //printf函数重定义 int fputc(int ch, FILE *f) { while((USART1_SR&UART_LSR_THRE)==0); //当串口1发送完成且状态为1 SEND_BUF1 = (u8) ch; //发送数据 return ch; } //scanf函数重定义 int fgetc(FILE* f) { while(!(USART1_SR&UART_LSR_RDR));//当不接受且状态为1的时候 return RECV_BUF1;//返回数据 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1641 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1562 浏览 1 评论
988 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1608 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
541浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
514浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 12:12 , Processed in 0.627957 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号