打印
[经验分享]

单片机:实现数据传送

[复制链接]
177|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小海师|  楼主 | 2025-1-4 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机:实现数据传送
1. 项目背景与目标
在嵌入式系统中,数据传输是非常重要的功能之一。数据传输指的是将数据从一个地方传送到另一个地方,通常涉及到不同模块或设备之间的通信。在单片机系统中,常见的数据传送方式有串行通信(如UART、SPI、I2C)和并行通信等。本项目将展示如何通过串行通信方式(以UART为例)实现数据的传送。

本项目的目标是使用单片机实现两个单片机之间的串行通信(数据传送)。我们将使用UART协议,演示如何通过UART接口实现数据从一个单片机传送到另一个单片机。

2. 硬件设计
2.1 硬件组件
单片机:例如STM32、8051、AVR等系列单片机,项目中假设使用STM32。
串口线:用来连接两个单片机之间的UART接口。
LED或LCD显示屏(可选):用于显示接收到的数据。
电源:为单片机和外部设备提供电源。
2.2 硬件连接
UART接口:两个单片机之间通过串口进行通信。每个单片机都需要连接**TX(发送)和RX(接收)**引脚。
TX:一个单片机的发送端口(TX)连接到另一个单片机的接收端口(RX)。
RX:接收端口与发送端口连接。
LED显示(可选):显示接收到的数据,验证通信的正确性。
3. 软件设计
3.1 串行通信原理
UART(Universal Asynchronous Receiver/Transmitter)是一种常见的异步串行通信协议。数据通过两条线传输:TX用于数据的发送,RX用于数据的接收。UART通信不需要时钟信号,传输的数据格式由波特率、数据位、停止位等参数决定。常见的应用包括单片机之间的通信、与PC的串口通信等。

3.2 程序设计思路
串口初始化:首先需要配置单片机的串口接口,包括设置波特率、数据位、停止位、校验等参数。
数据发送:通过串口将数据从一个单片机传送到另一个单片机。
数据接收:接收端通过串口接收数据,并显示或处理接收到的信息。
数据验证:验证数据是否正确传送,通常通过串口调试工具或显示屏来确认。
3.3 代码实现
以下是基于STM32单片机的串口数据传送代码示例:

#include "stm32f4xx_hal.h"

#define LED_PIN         GPIO_PIN_5   // LED引脚,假设连接到PA5
#define LED_PORT        GPIOA

// 串口配置参数
#define BAUD_RATE       9600        // 波特率设置为9600
#define UART_TIMEOUT    1000       // 超时设置,单位:毫秒

// 串口句柄
UART_HandleTypeDef huart1;

// GPIO初始化
void GPIO_Init(void) {
    __HAL_RCC_GPIOA_CLK_ENABLE();  // 使能GPIOA时钟

    // 配置LED引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
}

// 串口初始化
void UART_Init(void) {
    __HAL_RCC_USART1_CLK_ENABLE();  // 使能USART1时钟

    huart1.Instance = USART1;
    huart1.Init.BaudRate = BAUD_RATE;  // 设置波特率
    huart1.Init.WordLength = UART_WORDLENGTH_8B;  // 数据位:8位
    huart1.Init.StopBits = UART_STOPBITS_1;  // 停止位:1位
    huart1.Init.Parity = UART_PARITY_NONE;  // 无校验位
    huart1.Init.Mode = UART_MODE_TX_RX;  // 设置为收发模式
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  // 无硬件流控
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;  // 过采样方式
    HAL_UART_Init(&huart1);  // 初始化串口
}

// 串口发送数据
void UART_Transmit(uint8_t* data, uint16_t size) {
    HAL_UART_Transmit(&huart1, data, size, UART_TIMEOUT);  // 发送数据
}

// 串口接收数据
void UART_Receive(uint8_t* data, uint16_t size) {
    HAL_UART_Receive(&huart1, data, size, UART_TIMEOUT);  // 接收数据
}

// LED显示
void LED_On(void) {
    HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);  // 点亮LED
}

void LED_Off(void) {
    HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);  // 熄灭LED
}

// 主程序
int main(void) {
    HAL_Init();  // 初始化HAL库
    GPIO_Init();  // 初始化GPIO
    UART_Init();  // 初始化串口

    uint8_t tx_data[] = "Hello, World!";  // 要发送的数据
    uint8_t rx_data[20];  // 用于接收数据的缓冲区

    // 发送数据
    UART_Transmit(tx_data, sizeof(tx_data) - 1);  // 发送数据
    LED_On();  // 数据发送成功,点亮LED
    HAL_Delay(500);  // 延时500ms

    // 接收数据
    UART_Receive(rx_data, sizeof(rx_data));  // 接收数据
    LED_Off();  // 数据接收完成,熄灭LED

    // 处理接收到的数据(例如通过串口调试工具显示)
    // 这里可以加入代码将接收到的数据通过串口再次输出
    UART_Transmit(rx_data, sizeof(rx_data));  // 发送接收到的数据

    while (1) {
        // 主循环
    }
}

3.4 代码解释
GPIO初始化:GPIO_Init()函数配置了LED的输出引脚,用于显示通信是否成功。
串口初始化:UART_Init()函数初始化了串口接口,设置了波特率、数据位、停止位等参数。huart1是串口1的配置句柄。
数据发送:UART_Transmit()函数通过串口发送数据。
数据接收:UART_Receive()函数通过串口接收数据,接收到的数据存储在rx_data数组中。
LED显示:当发送数据时点亮LED,数据接收完成后熄灭LED,用于显示通信状态。
主程序:主程序首先发送数据“Hello, World!”并显示发送状态,然后接收数据,并通过串口返回接收到的数据。
4. 仿真与测试
4.1 电路设计
在Proteus中创建STM32单片机的仿真项目,并添加虚拟的串口设备。
配置两个STM32单片机之间的UART连接,TX连接到RX,RX连接到TX。
为每个单片机提供适当的电源。
4.2 仿真步骤
编译并上传代码到仿真环境。
模拟数据的发送和接收,观察LED的变化以验证通信是否正常。
在仿真环境中使用串口调试工具查看发送和接收的数据,验证数据传输的正确性。
5. 总结
本项目成功实现了通过UART协议在两个单片机之间进行数据传送。通过配置串口接口,数据可以从一个单片机发送到另一个单片机。程序中通过LED显示发送和接收的状态,确保通信的正常进行。UART协议是一种简单而常用的串行通信协议,在嵌入式系统中有广泛的应用。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_61840987/article/details/144686051

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

20

帖子

0

粉丝