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 13:10:15 浏览: 64
以下是补充代码:
```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)来表示是否接收到了完整的数据包。如果有数据接收,则读取数据长度并将最高位清零,方便下一次数据接收的判断。
相关问题
.\Objects\Project.axf: Error: L6200E: Symbol usart_rx_buf multiply defined (by usart.o and main.o).如何解决的具体程序
这个问题的具体解决方案取决于您的代码结构和编译器。假设您使用的是ARM Cortex-M系列微控制器,这里是一个C语言的示例代码,可以帮助您解决这个问题:
```c
// 在usart.h文件中定义usart_rx_buf
#ifndef USART_H
#define USART_H
#define USART_RX_BUF_SIZE 256
extern uint8_t usart_rx_buf[USART_RX_BUF_SIZE];
void usart_init(void);
void usart_send_byte(uint8_t byte);
#endif /* USART_H */
// 在usart.c文件中实现usart_rx_buf
#include "usart.h"
uint8_t usart_rx_buf[USART_RX_BUF_SIZE];
void usart_init(void)
{
// 初始化串口
}
void usart_send_byte(uint8_t byte)
{
// 发送一个字节到串口
}
// 在main.c文件中使用usart_rx_buf
#include "usart.h"
int main(void)
{
usart_init();
while (1) {
// 接收数据到usart_rx_buf
// 处理数据
}
}
```
在这个示例中,我们在 `usart.h` 文件中定义了 `usart_rx_buf` 数组,并在 `usart.c` 文件中实现了它。在 `main.c` 文件中,我们通过 `#include` 指令包含了 `usart.h` 文件,并在主函数中使用了 `usart_rx_buf` 数组。
这种方式可以避免重复定义的问题,因为不同的源文件中只有一个 `usart_rx_buf` 数组。如果您的代码结构不同,可以根据需要进行适当的修改。
.\Objects\Project.axf: Error: L6200E: Symbol usart_rx_buf multiply defined (by usart.o and main.o).
这个错误是由于在您的项目中,有两个或多个源文件定义了同一个符号。在您的情况下,符号 "usart_rx_buf" 被 usart.o 和 main.o 两个源文件定义了,导致了这个错误。
要解决这个问题,您可以尝试以下几个步骤:
1. 检查您的代码,确保没有重复定义符号 "usart_rx_buf" 的情况。
2. 如果您确实需要在多个源文件中使用同一个符号,请将其定义为 extern,这样编译器就不会将其作为一个新的符号定义。
3. 如果您使用的是 Keil MDK,可以尝试在 "Options for Target" -> "C/C++" -> "Misc Controls" 中添加 --keep usart.o 选项,这样编译器就会保留 usart.o 中定义的符号,而不会与 main.o 中的符号冲突。
希望这些方法能够帮助您解决问题!
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)