什么是串口
串口是一种在数据通讯中广泛使用的通讯接口,通常我们叫做UART
(通用异步收发传输器Universal Asynchronous Receiver/Transmitter),其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中,串口常用于与外部设备进行通讯,如传感器、液晶显示屏、WiFi模块、蓝牙模块等。
串口通信中的 TXD(Transmit Data)和 RXD(Receive Data)是串口通信中的两个重要信号。
TXD是指串口发送端的数据信号,而RXD是指串口接收端的数据信号。在串口通信中,发送端把要发送的数据发送到TXD引脚上,接收端则通过RXD引脚来接收这些数据。
TXD和RXD信号的实现方式取决于使用的芯片或模块。一般来说,它们都是通过芯片或模块的串口功能来实现的,这需要将相应的引脚连接到芯片或模块的串口引脚上。
在发送数据时,需要将要发送的数据通过串口的发送缓冲区发送到TXD引脚上,接收端通过RXD引脚接收这些数据并放入接收缓冲区中。在接收端收到完整的数据后,可以通过相应的处理进行数据的解析和处理。
需要注意的是,TXD和RXD的电平标准也需要一致,一般常见的有TTL电平和RS232电平,如果不一致则需要进行电平转换。同时,在编写程序时也需要注意串口波特率、数据位、停止位等参数的设置,以保证通信的稳定和可靠。
以下是STC8H的芯片引脚介绍图
其中有4组Uart通讯口:
串口TTL通讯协议
串口TTL(Transistor-Transistor Logic)是一种串口通信协议,使用TTL电平来进行串口数据传输。它主要用于嵌入式系统、传感器、模块等设备之间的数据通信。
串口TTL主要包括两个信号线:TX(Transmit,发送)和RX(Receive,接收)。TX线是串口TTL的输出线路,用于将数据从串口设备发送出去;RX线是串口TTL的输入线路,用于接收数据到串口设备。
串口TTL使用的是异步串行通信协议,其数据传输的原理是将数据分成一定的数据帧,在数据帧的首尾各加上一个起始位和停止位,用于确定每个数据帧的开始和结束位置。此外,串口TTL通信协议还规定了数据位的长度和奇偶校验位。
串口TTL通常有不同的波特率(Baud Rate)可供选择,波特率是指每秒钟传输的数据位数,通常表示为 bps(bits per second),比如 9600 bps、115200 bps 等等。波特率的设置必须要保证发送和接收设备的波特率一致,否则会导致通信失败。
需要注意的是,串口TTL使用的是TTL电平,其电压范围是0~5V,不同的设备的串口TTL信号的电平有时会有所不同,因此在连接不同设备时需要注意电平的兼容性。
串口转USB
串口转 USB 是一种将串口信号转换为 USB 信号的设备。它通常被用于连接没有 USB 接口的设备(如单片机、传感器等)与计算机之间的通讯,使这些设备可以通过 USB 接口与计算机进行通信。
在使用串口转 USB 设备时,需要将其插入计算机的 USB 接口,并将串口连接到需要通信的设备上。在计算机中打开串口终端程序,设置串口参数(如波特率、数据位、停止位等),即可开始进行数据传输。在通信过程中,串口转 USB 设备将串口信号转换为 USB 信号,并将其发送到计算机上,或者将从计算机上接收到的 USB 信号转换为串口信号并发送到外部设备上。
串口转 USB 设备通常由一个 USB 转串口芯片和一个串口接口组成。常见的 USB 转串口芯片有 FTDI 和 CH340 等,它们提供了一组标准的串口接口,可以方便地连接到各种外部设备上。
总之,串口转 USB 设备是一种非常实用的工具,它可以帮助我们连接各种没有 USB 接口的设备,方便数据的传输和通讯。
STC8H核心板串口调试
-
D+
D-
对应的usb口,和pc主机连接P3.1
P3.0
对应的芯片- 采用CH340将串口和USB之间进行转换
所以,我们在PC机上为什么会装串口驱动,主要是用来解析CH340转换后的消息,这样PC机就能认识了
- 使用库函数编写串口通讯逻辑
需求:通过串口调试工具,发送消息给开发板,开发板原封不动的将消息传回。
开发步骤:
-
- 新建项目
- 导入库函数
- 编写逻辑
串口调试实现
- 新建项目。新建
main.c
文件 - 导入函数库。拷贝以下函数库文件到项目目录:
-
Config.h
Type_def.h
GPIO.h
GPIO.c
Delay.h
Delay.c
UART.h
UART.c
UART_Isr.c
NVIC.c
NVIC.h
Switch.h
-
#include "Config.h" #include "GPIO.h" #include "UART.h" #include "Delay.h" #include "NVIC.h" #include "Switch.h" /************* 功能说明 ************** 双串口全双工中断方式收发通讯程序。 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回, 默认波特率:115200,N,8,1. 通过开启 UART.h 头文件里面的 UART1~UART4 定义,启动不同通道的串口通信。 ******************************************/ /******************* IO配置函数 *******************/ void GPIO_config(void) { GPIO_InitTypeDef GPIO_InitStructure; //结构定义 GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7 GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化 } /*************** 串口初始化函数 *****************/ void UART_config(void) { COMx_InitDefine COMx_InitStructure; //结构定义 COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2) COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200 COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4 NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3 UART1_SW(UART1_SW_P30_P31); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44 } /**********************************************/ void main(void) { // EAXSFR(); /* 扩展寄存器访问使能 */ GPIO_config(); UART_config(); EA = 1; TX1_write2buff(0x23); // # printf("STC8H8K64U UART1 Test Programme!\r\n"); //UART1发送一个字符串 PrintString1("STC8H8K64U UART1 Test Programme!\r\n"); //UART1发送一个字符串 while (1) { TX1_write2buff(0x2F); // / delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); } }
- 代码编写(接收并回写)
-
#include "Config.h" #include "GPIO.h" #include "UART.h" #include "Delay.h" #include "NVIC.h" #include "Switch.h" void GPIO_config(void) { GPIO_InitTypeDef GPIO_InitStructure; //结构定义 GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO, P30, P31 GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化 } void UART_config(void) { COMx_InitDefine COMx_InitStructure; //结构定义 COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2) COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200 COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4 NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3 UART1_SW(UART1_SW_P30_P31); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44 } void on_uart1_recv() { u8 i; // RX_Cnt收到的数据个数(字节u8 - unsigned char) // 将收到的数据, 按字节逐个循环 for(i=0; i<COM1.RX_Cnt; i++) { u8 dat = RX1_Buffer[i]; // 1 1 1 1 0 0 0 0 -> 0xF0 TX1_write2buff(dat); //收到的数据原样返回 } } /** 开启串口调试,接收数据,把收到的数据原样返回 **/ void main() { // 初始化IO GPIO_config(); // 初始化UART UART_config(); // 开启中断(全局)必须要写! EA = 1; // 写一个字节 TX1_write2buff(0x23); // 通过PrintString1输出字符串 PrintString1("STC8H8K64U UART1 Test Programme!\r\n"); //UART1发送一个字符串 // 通过printf输出字符串 printf("STC8H8K64U UART1 Test Programme!\r\n"); //UART1发送一个字符串 while(1) { // 超时计数 // 一旦收到了一个字节数据,RX_TimeOut会初始化一个值(例如:5) if((COM1.RX_TimeOut > 0) && (--COM1.RX_TimeOut == 0)) { if(COM1.RX_Cnt > 0) { // 收到数据了,on_uart1_recv(); on_uart1_recv(); } // 处理完数据,将数据个数清零 COM1.RX_Cnt = 0; } // 注意这里delay代码的位置,属于while delay_ms(10); } }