找回密码
 立即注册
查看: 77|回复: 2

【15系列】SYK-0806-A2S1 工业自动化控制之【13-串口收发单个字符】

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-21 13:00:02

19

主题

9

回帖

215

积分

中级会员

积分
215
发表于 2025-4-17 15:08:28 | 显示全部楼层 |阅读模式
大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【12-步进电机精确定位】”,

这一篇中,笔者要给大家介绍串口的使用了。

本例中,笔者主要跟大家介绍单个字符的收发,具体逻辑如下:

串口助手发送字符’A’,单片机收到后返回字符’A’,同时Y00输出ON;

串口助手发送字符’B’,单片机收到后返回字符’B’,同时Y01输出ON;

串口助手发送字符其他字符,单片机收到后返回收到的字符,同时Y00、Y01均输出OFF;

串口的硬件部分很简单,就是用到了一个RS232接口芯片:

01.png

所以,重点我们还是一起来看软件部分,代码还是在上一讲的基础上做修改,不过这次改动会有点大。

首先,因为本例中暂时没有用到定时器,所以我们把跟定时器相关的timer.c文件和bsp_timer.c文件都移除了,

然后分别在SYSTEM和BSP中添加usart.c库文件和bsp_usart.c文件。

02.png

关于库文件的使用,这里需要特别注意一下,因为我们所使用的IAP15W413AS单片机的xdata只有256字节,

且官方提供的库函数中定义的

TX1_Buffer[COM_TX1_Lenth]、RX1_Buffer[COM_RX1_Lenth]、TX2_Buffer[COM_TX2_Lenth]、RX2_Buffer[COM_RX2_Lenth]

四个数组均放在了xdata空间,但是官方定义的COM_TX1_Lenth、COM_RX1_Lenth、COM_TX2_Lenth、COM_RX2_Lenth这四个参数的值都是128,

也就是这四个数组占用的空间已经达到了512个字节,显然超过了单片机本身的xdata,

可恶的是,这样编译后编译器居然不会报错,因此这里大家一定要注意,我们需要在usart.h文件中,

手动将COM_TX1_Lenth、COM_RX1_Lenth、COM_TX2_Lenth、COM_RX2_Lenth的值改小,

使其总和加起来要小于256,笔者这里都改成了32:

03.png

接下来就是串口的配置,这部分主要放在了usart.c文件中:

  1. #include        "bsp_usart.h"
  2. /***************  串口初始化函数 *****************/
  3. void UART_config(void)
  4. {
  5.     COMx_InitDefine                COMx_InitStructure;                                        //结构定义
  6.    
  7.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,       UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  8.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //使用波特率,   BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
  9.         COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率, 一般 110 ~ 115200
  10.         COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
  11.         COMx_InitStructure.UART_Interrupt = ENABLE;                                //中断允许,   ENABLE或DISABLE
  12.         COMx_InitStructure.UART_P_SW      = UART1_SW_P30_P31;        //切换端口,   UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
  13.         
  14.     USART_Configuration(USART1, &COMx_InitStructure);                //初始化串口1 USART1,USART2
  15. }
复制代码

这里有个地方需要特别注意一下:就是波特率使用的定时器,这里只有两个选择,即定时器1或定时器2,

由于IAP15W413AS单片机只有定时器0和定时器2两个定时器,因此这里我们需要选择“BRT_Timer2”;

另外,由于app.c中需要调用UART_config()函数对串口进口初始化,因此,还需要在app.h文件中添加包含bsp_usart.h的头文件:

  1. #ifndef                __APP_H
  2. #define                __APP_H
  3. #include        "delay.h"
  4. #include        "bsp_gpio.h"
  5. #include        "bsp_usart.h"
  6. void app_init(void);
  7. void app_run(void);
  8. #endif
复制代码

这样一来,在app.c文件的app_init()函数中调用UART_config()函数就不会报错了:

  1. void app_init(void)
  2. {
  3.         UART_config();                 //UART初始化
  4.     GPIO_Config();                 //GPIO初始化
  5.    
  6.     EA = 1;                                       //开启总中断
  7. }
复制代码

主要功能的实现,放在了app.c文件中的UART1的中断函数中:

  1. /********************* UART1中断函数************************/
  2. void UART1_int (void) interrupt UART1_VECTOR
  3. {
  4.         u8 RX_Data;
  5.    
  6.     if(RI)
  7.         {
  8.                 RI = 0;
  9.         RX_Data = SBUF;
  10.         
  11.         if(RX_Data == 'A')     //若接收到的字符为‘A’,Y00输出ON
  12.         {
  13.             Y00 = OutputT_ON;
  14.         }
  15.         else if(RX_Data == 'B')//若接收到的字符为‘B’,Y01输出ON
  16.         {
  17.             Y01 = OutputT_ON;
  18.         }
  19.         else                   //若接收到其他字符,Y00、Y01输出OFF
  20.         {
  21.             Y00 = OutputT_OFF;
  22.             Y01 = OutputT_OFF;
  23.         }
  24.         
  25.         SBUF = RX_Data;        //发送接收到的字符
  26.         }
  27.         if(TI)
  28.         {
  29.                 TI = 0;
  30.         }
  31. }
复制代码

编译成功后,下载程序到板子中,使用串口助手,分别发送字符‘A’、字符’B’、字符’C’,现象如下:

04.png

05.png

06.png

07.png

08.png

09.png

原理很简单,代码部分也很简单,这里需要注意的是,单片机串口收发时只能是按字节来收发,

一个字符占一个字节,如果发送多个字符时,SUBF里面接收到的新的数据会把旧的数据覆盖掉。

因此,即使看上去用串口助手发送字符串“ABC”时单片机也能返回字符串“ABC”,实际上,

程序最终执行的效果只会保留接收到字符“C”时的效果。同时,需要注意的是,单个字符是用单引号(’ '),字符串是用双引号(" ")。

好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,

下一节笔者将继续给大家介绍“串口的基本使用”,详见“SYK-0806-A2S1 工业自动化控制之【14-串口收发字符串】”,感谢大家的支持!


本章附件:

【STC15系列】SYK-0806-A2S1- 13-串口收发单个字符.rar (67.97 KB, 下载次数: 2)




本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-17 15:12:00 | 显示全部楼层
在工业自动化控制系统中,串口通信是实现设备间数据交换的重要手段。本文将以SYK-0806-A2S1控制器为例,详细介绍如何通过串口实现单个字符的收发功能,并结合输出控制逻辑,展示其在工业自动化中的实际应用。

一、功能需求分析
本案例的功能需求如下:
1. 字符'A'的收发:当串口助手发送字符'A'时,单片机接收到该字符后,返回字符'A',同时控制Y00输出ON。
2. 字符'B'的收发:当串口助手发送字符'B'时,单片机接收到该字符后,返回字符'B',同时控制Y01输出ON。
3. 其他字符的收发:当串口助手发送其他字符时,单片机接收到该字符后,返回接收到的字符,同时控制Y00和Y01均输出OFF。

二、硬件设计
串口通信的硬件部分主要依赖于RS232接口芯片,用于实现单片机与上位机之间的电平转换和信号传输。RS232接口芯片将单片机的TTL电平转换为RS232电平,确保通信的稳定性和可靠性。

三、软件设计
软件部分在上一讲的基础上进行了较大改动,主要包括以下步骤:

1. 移除定时器相关代码
由于本案例中未使用定时器功能,因此移除了与定时器相关的timerc.c和bsptimerc.c文件,以简化代码结构。

2. 添加串口相关库文件
在SYSTEM和BSP目录中分别添加了usart.c库文件和bspusart.c文件,用于实现串口的初始化和数据收发功能。

3. 串口初始化
在bspusart.c文件中,对串口进行初始化配置,包括波特率设置、数据位、停止位和校验位的配置。以下是初始化代码的示例:
  1. c
  2. void USARTInit(void) {
  3.     // 设置波特率
  4.     SCON = 0x50; // 8位数据位,1位停止位,无校验位
  5.     TMOD |= 0x20; // 定时器1模式2
  6.     TH1 = 0xFD; // 波特率9600
  7.     TL1 = 0xFD;
  8.     TR1 = 1; // 启动定时器1
  9.     ES = 1; // 使能串口中断
  10.     EA = 1; // 使能全局中断
  11. }
复制代码

4. 串口中断服务程序
在串口中断服务程序中,实现字符的接收和发送逻辑。以下是中断服务程序的示例:
  1. c
  2. void USARTISR(void) interrupt 4 {
  3.     if (RI) {
  4.         RI = 0; // 清除接收中断标志
  5.         char receivedChar = SBUF; // 读取接收到的字符
  6.         SBUF = receivedChar; // 发送接收到的字符
  7.         while (!TI); // 等待发送完成
  8.         TI = 0; // 清除发送中断标志
  9.         // 根据接收到的字符控制输出
  10.         if (receivedChar == 'A') {
  11.             Y00 = ON;
  12.             Y01 = OFF;
  13.         } else if (receivedChar == 'B') {
  14.             Y00 = OFF;
  15.             Y01 = ON;
  16.         } else {
  17.             Y00 = OFF;
  18.             Y01 = OFF;
  19.         }
  20.     }
  21. }
复制代码

5. 主程序逻辑
在主程序中,调用串口初始化函数,并进入主循环等待串口中断触发。以下是主程序的示例:
  1. c
  2. void main(void) {
  3.     USARTInit(); // 初始化串口
  4.     while (1) {
  5.         // 主循环等待中断
  6.     }
  7. }
复制代码

四、注意事项
1. XData空间限制:由于IAP15W413AS单片机的XData空间仅有256字节,在使用官方提供的库函数时,需注意避免XData空间溢出。可以通过优化数组大小或调整内存分配策略来解决。
2. 波特率设置:波特率的设置需与串口助手的配置一致,否则会导致通信失败。
3. 中断优先级:在实际应用中,需根据系统需求合理设置中断优先级,以确保关键任务的及时响应。

五、总结
本文详细介绍了如何在SYK-0806-A2S1控制器中实现串口单个字符的收发功能,并结合输出控制逻辑,展示了其在工业自动化中的实际应用。通过合理的硬件设计和软件实现,可以确保串口通信的稳定性和可靠性,为工业自动化控制系统提供高效的数据交换手段。希望本文能为读者在相关领域的开发提供参考和帮助。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-17 15:12:00 | 显示全部楼层
在工业自动化控制领域,串口通信作为一种基础且重要的通信方式,广泛应用于设备间的数据传输。本文将以SYK-0806-A2S1为例,详细介绍如何实现串口收发单个字符的功能,并结合硬件与软件设计,帮助读者深入理解串口通信的实现原理。

一、功能需求分析
本例的功能需求如下:
1. 当串口助手发送字符’A’时,单片机收到后返回字符’A’,同时Y00输出ON。
2. 当串口助手发送字符’B’时,单片机收到后返回字符’B’,同时Y01输出ON。
3. 当串口助手发送其他字符时,单片机收到后返回该字符,同时Y00、Y01均输出OFF。

通过上述需求可以看出,本例的核心在于串口通信的实现以及根据接收到的字符控制输出端口的状态。

二、硬件设计
硬件部分主要涉及RS232接口芯片的使用。RS232是一种常见的串行通信标准,能够实现单片机与PC或其他设备之间的数据传输。在本例中,RS232接口芯片负责将单片机的TTL电平转换为RS232电平,从而实现与串口助手的通信。

三、软件设计
软件部分是实现功能的核心,主要包括串口初始化、字符接收与发送、以及输出端口控制等模块。以下将详细说明软件设计的实现步骤。

1. 移除定时器相关代码
由于本例中未使用定时器功能,因此可以移除与定时器相关的代码文件,包括timerc.c和bsptimerc.c。这样可以减少代码量,提高程序的可读性和执行效率。

2. 添加串口相关库文件
在SYSTEM和BSP目录中分别添加usart.c库文件和bspusart.c文件。这些文件包含了串口初始化和通信所需的函数,能够简化开发过程。

3. 串口初始化
在bspusart.c文件中,首先需要对串口进行初始化。初始化过程包括设置波特率、数据位、停止位、校验位等参数。以下是一个简单的串口初始化代码示例:
  1. c
  2. void USARTInit(void) {
  3.     // 设置波特率
  4.     SCON = 0x50;  // 8位数据位,1位停止位,无校验位
  5.     TMOD |= 0x20; // 定时器1模式2
  6.     TH1 = 0xFD;   // 波特率9600
  7.     TL1 = 0xFD;
  8.     TR1 = 1;      // 启动定时器1
  9.     ES = 1;       // 使能串口中断
  10.     EA = 1;       // 使能全局中断
  11. }
复制代码

4. 字符接收与发送
在串口中断服务函数中,实现字符的接收与发送。以下是一个简单的串口中断服务函数示例:
  1. c
  2. void USARTISR(void) interrupt 4 {
  3.     if (RI) {
  4.         RI = 0;  // 清除接收标志位
  5.         char receivedChar = SBUF;  // 读取接收到的字符
  6.         // 根据接收到的字符控制输出端口
  7.         if (receivedChar == 'A') {
  8.             Y00 = 1;  // Y00输出ON
  9.             Y01 = 0;  // Y01输出OFF
  10.         } else if (receivedChar == 'B') {
  11.             Y00 = 0;  // Y00输出OFF
  12.             Y01 = 1;  // Y01输出ON
  13.         } else {
  14.             Y00 = 0;  // Y00输出OFF
  15.             Y01 = 0;  // Y01输出OFF
  16.         }
  17.         SBUF = receivedChar;  // 返回接收到的字符
  18.         while (!TI);  // 等待发送完成
  19.         TI = 0;  // 清除发送标志位
  20.     }
  21. }
复制代码

5. 输出端口控制
在接收到字符后,根据字符的不同控制输出端口的状态。本例中,Y00和Y01分别对应字符’A’和’B’的响应。其他字符则使Y00和Y01均输出OFF。

四、注意事项
1. XData空间限制:由于IAP15W413AS单片机的XData空间仅有256字节,因此在定义缓冲区时需特别注意空间占用。官方库函数中定义的TX1Buffer、RX1Buffer、TX2Buffer、RX2Buffer等数组均位于XData空间,需根据实际需求调整缓冲区大小,避免空间不足。
2. 波特率设置:波特率的设置需与串口助手保持一致,否则会导致通信失败。常见的波特率包括9600、19200、38400等,具体选择需根据实际应用场景确定。
3. 中断优先级:在多个中断源共存的情况下,需合理设置中断优先级,确保串口中断能够及时响应。

五、总结
本文详细介绍了如何在SYK-0806-A2S1上实现串口收发单个字符的功能,并结合硬件与软件设计,帮助读者掌握串口通信的基本原理与实现方法。通过移除不必要的定时器代码、添加串口相关库文件、初始化串口、实现字符接收与发送以及控制输出端口状态,最终实现了预期的功能。在实际开发中,需特别注意XData空间的限制、波特率的设置以及中断优先级的管理,以确保程序的稳定运行。

希望本文能够为读者在工业自动化控制领域的开发提供有益的参考。如有任何疑问或建议,欢迎在评论区留言讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 22:05 , Processed in 0.130278 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表