本帖最后由 WangChong 于 2023-9-23 17:51 编辑
串口通讯简介
串口通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。可以全工通信,在单片机的引脚上分别以RXD(receive external data, input) 和 TXD (transmit external data, output). 在不考虑电源的情况下,两个单片机,或者支持串口通讯的设备可以靠两个GOIP端口完成通信。分别是将第一个单片机(模块)的TXD 接入第二个单片机的RXD。第二个单片机的RXD接入第一个单片机的TXD. 即可完成线路连接。当单片机1 通过TXD发送消息时,单片机2 通过RXD接收到消息。相反,单片机2通过TXD发送消息,单片机1通过RXD接收。 这些是属于原理性知识,无论API 或者SDK再怎么封装,底层调用仍然是这种方式。
接线方式
图片来自 http://www.szkingfrom.com/downhtml/3674801210.html
串口通讯电平标准
串口通讯采用的电平分别有三种。分别是
- TTL电平:+5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
至于这三种信号的区别这里不做详细的探究,超出了本教程的范畴。如果想要深入学习可以参考如下链接。
https://www.bilibili.com/video/BV1PD4y147ts/?spm_id_from=333.337.search-card.all.click
STC32G12K128试验箱串口通讯
到这里,基本的串口通信原理,我相信大家有一个简要的理解,现在请出今天的主角STC32G12K128.
STC32G 系列单片机具有 2 个全双工同步/异步串行通信接口(USART1 和 USART2)。每个串行口由 2 个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由 2 个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。STC32G 系列单片机的串口 1、串口 2 均有 4 种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。用户可用软件设置不同的波特率和选择不同的工作方式。主机可
通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。串口 1、串口 2 的通讯口均可以通过功能管脚的切换功能切换到多组端口,从而可以将一个通讯口
分时复用为多个通讯口。
1-我们这里使用的是232接口的串口。首先通过查询官方手册,将支持串口二通讯的管脚切换到P4
2- 配置S2CFG串口
3- 配置串口二控制寄存器(建议使用STC-ISP一键生成),因为同时可以使用定时器而作为波特率生成器
4- 配置中断
如果你需要发送中断,或者接收中断的话,需要配置中断许可。
如上图所示串口二出是一个logical or gate. 在ES2(外部串行中断2)和EA(全局中断)打开的情况下,其中的S2RI 或者S2TI 任意一个为1则中断产生。
STC32G支持的中断回调函数如下。可以根据具体的业务逻辑在中断回调函数中处理对应的需求,比如说收到消息后再转发出去。
比如说现在我们使用的是串口中断2那么我们就可以根据上述定义来写串口2 的中断函数。如下所示:
- void UART2_Routine(void) interrupt 8 {
-
- //接收数据中断
- if(S2RI){
- S2RI=0;
- sendChar(S2BUF);
- //发送数据中断
- }else if(S2TI){
- S2TI=0;
- }
-
- }
复制代码 还记得上面说的吗,其中两个中断标志位只要一个为1 则触发中断,触发后这个中断位需要手动清零,否则的话程序将一直在中断的回调函数中运行
如文档参考链接:
http://www.stcmcudata.com/stc8f-datasheet/stc32g.pdf
|