4. 主程序 main( )函数前添加 extern u16 USART_TX_EN; extern u8 USART_RX_BUF[USART_REC_LEN]; extern u16 USART_RX_STA; 在 C 语言中,修饰符 extern 用在变量或者函数的声明前,用来说明“此变量/函数是在 别的源文件中定义,要在此处引用”。 5. 在主程序 main( )中添加初始化代码,并添加相关头文件 char USART_SendBuf[]="Hello!"; int i; int Len=strlen(USART_SendBuf); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); LCD_GPIO_Init(); LCD_Init(); usart1_Init(115200); 6. 在主框架 while(1)中添加串口发送代码 delay_ms(2000); if(USART_TX_EN) { for(i=0;i<Len;i++) { USART_SendData(USART1, USART_SendBuf[i]); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET); } USART_TX_EN=0; } //???补充代码,判断是否发送完毕 LCD_Display_Words(0,0,USART_RX_BUF); 5.4 练习 在实验 5.3 的框架中补齐代码,在 LCD 显示通过 USART 自发自收的字符串“Hello!”, 并添加代码实现持续发送和接收并在 LCD 换行显示。
时间: 2023-09-11 08:10:15 浏览: 94
以下是补充代码:
```c
while(1)
{
delay_ms(2000);
// 判断是否需要发送
if(USART_TX_EN)
{
for(i=0; i<Len; i++)
{
USART_SendData(USART1, USART_SendBuf[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
}
USART_TX_EN = 0;
}
// 判断是否有数据接收
if(USART_RX_STA & 0x8000)
{
u16 len = USART_RX_STA & 0x3fff;
USART_RX_BUF[len] = '\0';
LCD_Display_Words(0, 0, USART_RX_BUF);
USART_RX_STA = 0;
}
}
```
在该代码中,我们首先判断是否需要发送数据,如果需要发送,则使用循环逐个发送数据字节,直到所有数据都发送完毕。
接下来,我们判断是否有数据接收。如果有,则将接收到的字符串显示在 LCD 上。需要注意的是,我们在 USART_RX_STA 中使用了一个标志位(最高位为 1)来表示是否接收到了完整的数据包。如果有数据接收,则读取数据长度并将最高位清零,方便下一次数据接收的判断。
相关问题
#include "stm32f10x.h" #include "oled.h" #include "USART.h" void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { uint8_t data = USART_ReceiveData(USART1); if (usart_rx_len < USART_RX_BUF_SIZE) { usart_rx_buf[usart_rx_len++] = data; } } } void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 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); USART_InitStructure.USART_BaudRate = 115200; 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); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE); }
根据您提供的代码,这个问题是由于 `usart_rx_buf` 变量在 `USART.h` 头文件中被定义,然后在 `USART.c` 文件中被实现,但是在 `main.c` 文件中又被定义了一次,导致重复定义了。此外,由于 `usart_rx_buf` 变量在 `USART.h` 头文件中被定义,因此在多个源文件中包含了 `USART.h` 头文件时,也会出现重复定义的问题。
解决这个问题的方法是将 `usart_rx_buf` 变量定义为 `extern`,然后在 `USART.c` 文件中实现它。这样,其他源文件包含了 `USART.h` 头文件后,就不会重复定义 `usart_rx_buf` 变量了。
修改后的 `USART.h` 文件应该像这样:
```c
#ifndef __USART_H
#define __USART_H
#include "stm32f10x.h"
#define USART_RX_BUF_SIZE 256
extern uint8_t usart_rx_buf[USART_RX_BUF_SIZE];
extern uint16_t usart_rx_len;
void USART1_Init(void);
#endif /* __USART_H */
```
修改后的 `USART.c` 文件应该像这样:
```c
#include "USART.h"
uint8_t usart_rx_buf[USART_RX_BUF_SIZE];
uint16_t usart_rx_len = 0;
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
uint8_t data = USART_ReceiveData(USART1);
if (usart_rx_len < USART_RX_BUF_SIZE)
{
usart_rx_buf[usart_rx_len++] = data;
}
}
}
void USART1_Init(void)
{
/* 端口初始化 */
/* 串口初始化 */
}
```
修改后的 `main.c` 文件应该像这样:
```c
#include "USART.h"
int main(void)
{
USART1_Init();
while (1) {
// 处理串口接收数据
}
}
```
这样就可以避免 `usart_rx_buf` 变量的重复定义问题了。
..\HARDWARE\USART3\usart3.h(21): error: #147: declaration is incompatible with "uint8_t USART2_RX_BUF[512]" (declared at line 12 of "..\SYSTEM\usart\usart.h") extern u8 USART2_RX_BUF[
这个错误是因为你在usart3.h中定义了一个名为USART2_RX_BUF的变量,但是在usart.h中也已经定义了一个同名的变量,并且它们的类型不一致,导致冲突。
解决这个错误的方法是修改usart3.h中的变量名,或者使用usart.h中定义的同名变量。如果你确定需要在usart3.h中定义一个新的变量,那么应该修改变量名以避免与其他文件中的变量冲突。
阅读全文