首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

单片机想和其他设备建立通信少了你(串口)可不行

  • 25-03-07 16:50
  • 3290
  • 9915
blog.csdn.net

单片机的串口(Serial Port)是一种非常重要且常用的通信接口,下面从基本概念、工作原理、通信协议、应用场景以及使用示例几个方面详细介绍:

基本概念

串口是一种用于在单片机和其他设备(如计算机、传感器、执行器等)之间进行数据传输的接口。它以逐位的方式传输数据,每次只传输一个数据位,具有硬件连接简单、成本低、可靠性高等优点。常见的串口标准有 RS - 232、RS - 485 等。

工作原理

  • 数据发送:单片机将要发送的数据按位依次通过串口发送引脚(TXD)输出。在发送之前,数据通常会被存储在发送缓冲区中,然后按照一定的波特率(数据传输速率)逐位发送出去。
  • 数据接收:单片机通过串口接收引脚(RXD)逐位接收外部设备发送过来的数据。接收到的数据会先被存储在接收缓冲区中,等待单片机进行处理。

通信协议

  • 异步通信:
    • 这是单片机串口最常用的通信方式。在异步通信中,数据是一帧一帧地传输的,每帧数据包含起始位、数据位、奇偶校验位(可选)和停止位。
    • 起始位:用于表示一帧数据的开始,通常为低电平。
    • 数据位:要传输的实际数据,一般为 5 - 8 位。
    • 奇偶校验位:用于检测数据传输过程中是否发生错误,分为奇校验和偶校验。
    • 停止位:用于表示一帧数据的结束,通常为高电平,位数可以是 1 位、1.5 位或 2 位。
  • 同步通信:
    • 同步通信需要一个时钟信号来同步发送方和接收方的操作。在同步通信中,数据是连续传输的,没有起始位和停止位,而是通过时钟信号来确定每个数据位的传输时刻。

应用场景

  • 调试信息输出:在单片机开发过程中,通过串口将调试信息发送到计算机上,方便开发人员进行调试和故障排查。
  • 与外部设备通信:与传感器、执行器、显示器等外部设备进行数据交换,实现数据采集、控制等功能。
  • 远程通信:通过串口与其他单片机或设备进行远程通信,实现分布式系统的控制和数据传输。

以下是一个简单的 51 单片机串口通信示例代码,实现了单片机通过串口向计算机发送数据的功能:

  1. #include
  2. // 初始化串口
  3. void UART_Init() {
  4. TMOD |= 0x20; // 设置定时器 1 为模式 2
  5. TH1 = 0xFD; // 设置波特率为 9600
  6. TL1 = 0xFD;
  7. SCON = 0x50; // 设置串口为模式 1,允许接收
  8. TR1 = 1; // 启动定时器 1
  9. }
  10. // 发送一个字符
  11. void UART_SendChar(char c) {
  12. SBUF = c; // 将字符写入发送缓冲区
  13. while (!TI); // 等待发送完成
  14. TI = 0; // 清除发送完成标志
  15. }
  16. // 发送字符串
  17. void UART_SendString(char *str) {
  18. while (*str) {
  19. UART_SendChar(*str++);
  20. }
  21. }
  22. void main() {
  23. UART_Init(); // 初始化串口
  24. while (1) {
  25. UART_SendString("Hello, World!\r\n"); // 发送字符串
  26. for (int i = 0; i < 10000; i++); // 延时
  27. }
  28. }

 串口数据收发的模式

以下为你详细介绍单片机串口数据的收发相关内容,包括原理、流程以及不同单片机的代码示例。

原理

数据发送

单片机将待发送的数据存储在发送缓冲区,按照设定的波特率(每秒传输的比特数),把数据逐位从发送引脚(TXD)输出。发送前会添加起始位,数据传输结束后添加停止位,部分情况还会加入奇偶校验位来保证数据传输的准确性。

数据接收

接收引脚(RXD)持续监测外部信号,当检测到起始位后,开始按位接收数据,将接收到的数据暂存于接收缓冲区。接收完成一帧数据后,通过判断停止位来确认数据接收结束,若有奇偶校验位,还会进行校验操作。

数据收发流程

发送流程
  1. 初始化串口:设置波特率、数据位、停止位、奇偶校验位等参数。
  2. 准备数据:将需要发送的数据存储到变量或数组中。
  3. 发送数据:将数据逐字节写入发送缓冲区,等待发送完成标志置位。
  4. 循环发送(可选):若有多个数据需要发送,可通过循环重复步骤 3。
接收流程
  1. 初始化串口:与发送流程的初始化参数保持一致。
  2. 等待接收:不断检测接收缓冲区是否有数据到来。
  3. 读取数据:当接收到数据后,从接收缓冲区读取数据。
  4. 数据处理:对读取到的数据进行相应的处理,如显示、存储、计算等。

不同单片机串口数据收发示例

51单片机

  1. #include
  2. // 初始化串口
  3. void UART_Init() {
  4. TMOD |= 0x20; // 设置定时器 1 为模式 2
  5. TH1 = 0xFD; // 设置波特率为 9600
  6. TL1 = 0xFD;
  7. SCON = 0x50; // 设置串口为模式 1,允许接收
  8. TR1 = 1; // 启动定时器 1
  9. }
  10. // 发送一个字符
  11. void UART_SendChar(char c) {
  12. SBUF = c; // 将字符写入发送缓冲区
  13. while (!TI); // 等待发送完成
  14. TI = 0; // 清除发送完成标志
  15. }
  16. // 接收一个字符
  17. char UART_ReceiveChar() {
  18. while (!RI); // 等待接收完成
  19. RI = 0; // 清除接收完成标志
  20. return SBUF; // 返回接收到的字符
  21. }
  22. void main() {
  23. char receivedChar;
  24. UART_Init(); // 初始化串口
  25. while (1) {
  26. UART_SendChar('A'); // 发送字符 'A'
  27. receivedChar = UART_ReceiveChar(); // 接收字符
  28. // 可在此处对接收到的字符进行处理
  29. }
  30. }

 32单片机  基于hal库

  1. #include "stm32f1xx_hal.h"
  2. UART_HandleTypeDef huart1;
  3. // 串口初始化
  4. void UART_Init() {
  5. huart1.Instance = USART1;
  6. huart1.Init.BaudRate = 9600;
  7. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  8. huart1.Init.StopBits = UART_STOPBITS_1;
  9. huart1.Init.Parity = UART_PARITY_NONE;
  10. huart1.Init.Mode = UART_MODE_TX_RX;
  11. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  12. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  13. if (HAL_UART_Init(&huart1) != HAL_OK) {
  14. Error_Handler();
  15. }
  16. }
  17. // 发送数据
  18. void UART_SendData(uint8_t *pData, uint16_t Size) {
  19. HAL_UART_Transmit(&huart1, pData, Size, HAL_MAX_DELAY);
  20. }
  21. // 接收数据
  22. void UART_ReceiveData(uint8_t *pData, uint16_t Size) {
  23. HAL_UART_Receive(&huart1, pData, Size, HAL_MAX_DELAY);
  24. }
  25. int main(void) {
  26. HAL_Init();
  27. UART_Init();
  28. uint8_t sendData[] = "Hello, STM32!";
  29. uint8_t receiveData[20];
  30. while (1) {
  31. UART_SendData(sendData, sizeof(sendData)); // 发送数据
  32. UART_ReceiveData(receiveData, sizeof(receiveData)); // 接收数据
  33. // 可在此处对接收到的数据进行处理
  34. }
  35. }

代码解释

  • 51 单片机:
    • UART_Init 函数:设置定时器 1 为模式 2 以产生波特率,配置串口工作模式为模式 1 并允许接收,最后启动定时器 1。
    • UART_SendChar 函数:将字符写入发送缓冲区,等待发送完成标志 TI 置位,然后清除该标志。
    • UART_ReceiveChar 函数:等待接收完成标志 RI 置位,清除该标志后返回接收到的字符。
  • STM32 单片机:
    • UART_Init 函数:使用 HAL 库配置串口的波特率、数据位、停止位、奇偶校验位等参数,并初始化串口。
    • UART_SendData 函数:调用 HAL_UART_Transmit 函数发送指定长度的数据。
    • UART_ReceiveData 函数:调用 HAL_UART_Receive 函数接收指定长度的数据。

 

注:本文转载自blog.csdn.net的Multiple-ji的文章"https://blog.csdn.net/2401_88862650/article/details/145537857"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

124
嵌入式
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top