当前位置:首页 > 行业动态 > 正文

c 串口通信实例视频教程

简答,该视频教程主要围绕C语言实现串口通信展开,通过实例详细讲解了 串口通信的原理、初始化设置、数据收发等关键步骤,帮助学习者掌握C语言下串口通信的编程方法。

一、串口通信基础概念

1、串行通信方式

全双工通信:数据的发送和接收可以同时进行,就像打电话一样,双方可以同时说话和听对方说话,在一些需要实时交互的系统中,如远程监控系统,上位机(监控中心)和下位机(现场设备)之间可以通过全双工串口通信,上位机可以实时发送控制命令,下位机也可以实时上传数据。

半双工通信:通信双方交替进行双向数据传输,但不能同时进行,比如对讲机,在同一时刻只能有一方说话,另一方只能听,说完后角色互换,这种通信方式在一些简单的数据传输场景中较为常见,如早期的RS 485通信网络。

单工通信:数据只能单方向传输,类似于广播,发送方只能发送数据,接收方只能接收数据,一些无线遥控器向设备发送控制信号就是单工通信,遥控器只负责发送指令,设备只负责接收并执行。

2、串口相关寄存器

串行数据缓冲器SBUF:在物理地址99H处,它实际上是两个缓冲器,一个用于接收数据,一个用于发送数据,当CPU写入SBUF时,是将数据放入发送缓冲区准备发送;当CPU读取SBUF时,是从接收缓冲区读取收到的数据。

串口控制寄存器SCON(98H):其中的SM0和SM1是工作方式选择位,用于设置串口的工作模式,如模式0、模式1等;REN是串行接收允许位,当REN = 1时,允许接收数据;还有TB8、RB8、TI、RI等位,分别用于指示发送和接收的相关状态。

波特率与电源控制寄存器PCON(不可位寻址,87H):其中的SMOD位用于控制波特率是否加倍,在一些单片机系统中,通过设置SMOD位可以选择合适的波特率来满足不同的通信需求。

中断寄存器IE(中断允许寄存器,可位寻址,A8H):与串行中断相关的有EA(总中断控制位)和ES(串行口中断允许位),当EA = 1且ES = 1时,允许串行口中断。

二、实例讲解

以51单片机为例,介绍如何使用C语言实现串口通信,假设我们要实现一个简单的功能:通过串口发送一个字符串“Hello, World!”到计算机,并在计算机端显示出来。

1、硬件连接:使用51单片机开发板,将其TXD引脚连接到计算机的串口接收引脚,RXD引脚连接到计算机的串口发送引脚,如果是USB转串口设备,按照相应的引脚定义连接即可。

2、代码实现

初始化串口:首先要设置串口的工作模式和波特率,假设我们使用模式1,波特率为9600bps,代码如下:

     void UartInit() {
         SCON = 0x40; // 设置串口工作模式1
         TMOD &= 0x0F; // 清空TMOD中定时器1相关
         TMOD |= 0X20; // 设置定时器1工作模式2:8位自动重载
         TH1 = 0xFD; // 设定定时初值,根据波特率计算得出
         TL1 = 0XFD;
         TR1 = 1; // 启动定时器1
         }

这里,SCON = 0x40设置了串口为模式1工作模式;TMOD寄存器的设置使能了定时器1的模式2,即8位自动重装模式;TH1TL1的值根据波特率计算公式得出,对于9600波特率,初值为0xFD;最后TR1 = 1启动定时器1。

发送数据函数:编写一个函数用于发送字符,当把数据写入SBUF时,就会启动发送过程。

     void send_char(unsigned char m) {
         SBUF = m;
         while (!TI); // 等待发送完成,TI标志位被置位表示发送完成
         TI = 0; // 手动清零TI标志位,以便下次发送
     }

在这个函数中,将字符赋值给SBUF后,程序会等待TI标志位被置位,表示数据发送完成,然后手动将TI清零,准备下一次发送。

主函数:在主函数中调用初始化函数和发送函数,实现循环发送字符串“Hello, World!”。

     void main() {
         UartInit(); // 初始化串口
         unsigned char str[] = "Hello, World!";
         while (1) {
             for (int i = 0; str[i] != '
0