当前位置: 首页 > news >正文

DSP开发:串口sci的发送与接收实现

DSP开发:串口sci的发送与接收实现


文章目录

  • DSP开发:串口sci的发送与接收实现
  • 串口配置
  • 串口SCI初始化详细分析
  • 串口SCI使用


串口配置

/*--------------------------------------------scia----------------------------*/
/*--------------------------------------------串口1----------------------------*/void UARTa_Init(Uint32 baud)
{unsigned char scihbaud=0;unsigned char scilbaud=0;Uint16 scibaud=0;scibaud=37500000/(8*baud)-1;scihbaud=scibaud>>8;scilbaud=scibaud&0xff;EALLOW;SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-AEDIS;InitSciaGpio();//Initalize the SCI FIFOSciaRegs.SCIFFTX.all=0xE040;SciaRegs.SCIFFRX.all=0x204f;SciaRegs.SCIFFCT.all=0x0;// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() functionSciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback// No parity,8 char bits,// async mode, idle-line protocolSciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKESciaRegs.SCICTL2.all =0x0003;SciaRegs.SCICTL2.bit.TXINTENA =1;SciaRegs.SCICTL2.bit.RXBKINTENA =1;SciaRegs.SCIHBAUD    =scihbaud;  // 9600 baud @LSPCLK = 37.5MHz.SciaRegs.SCILBAUD    =scilbaud;
//  SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop backSciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
}
// Transmit a character from the SCI'
void UARTa_SendByte(int a)
{while (SciaRegs.SCIFFTX.bit.TXFFST != 0);SciaRegs.SCITXBUF=a;
}void UARTa_SendString(char * msg)
{int i=0;while(msg[i] != '\0'){UARTa_SendByte(msg[i]);i++;}
}char SCITXDA_TX_BUF[400];void printf_SCITXDa(char *fmt, ...)
{Uint16 i, j;va_list ap;va_start(ap, fmt);vsprintf((char*) SCITXDA_TX_BUF, fmt, ap);va_end(ap);i = strlen((const char*) SCITXDA_TX_BUF);     //此次发送数据的长度for (j = 0; j < i; j++)     //循环发送数据{while (SciaRegs.SCIFFTX.bit.TXFFST != 0);SciaRegs.SCITXBUF = SCITXDA_TX_BUF[j];}
}
/** @name   fputc,fputs* @brief  串口打印重定向* @param  None* @retval None*/
int fputc(int _c, register FILE *_fp)
{UARTa_SendByte(_c);return _c;
}
int putc(int _c, register FILE *_fp)
{UARTa_SendByte(_c);return _c;
}
int putchar(int data)
{UARTa_SendByte(data);return data;
}
int fputs(const char *_ptr, register FILE *_fp)
{unsigned int i, len;len = strlen(_ptr);for (i = 0; i < len; i++){UARTa_SendByte((char) _ptr[i]);}return len;
}

这段代码实现了串口SCI(串行通信接口)的初始化以及向串口发送数据的功能,并且通过函数重定向,将标准库的输出函数重定向到串口SCI上,实现了通过类似于标准库的 printf 函数的格式化字符串向串口SCI发送数据的功能。

以下是代码的详细解释:

UARTa_Init 函数:
这个函数用于初始化串口SCI通信。它接收一个参数 baud,表示所需的波特率。函数通过计算波特率分频寄存器的值来设置波特率。

UARTa_SendByte 函数:
这个函数用于将一个字符发送到串口SCI。它通过检查发送FIFO的状态位来判断是否可以发送数据,然后将字符 a 发送到SCI的发送缓冲区(SCITXBUF)中。

UARTa_SendString 函数:
这个函数用于将一个字符串发送到串口SCI。它通过循环逐个字符地将字符串中的字符发送到串口SCI。

printf_SCITXDa 函数:
这是一个自定义的输出函数。它采用了与标准库函数 printf 类似的格式,支持格式化字符串,通过变参列表处理不定数量的参数。

char *fmt, …:第一个参数 fmt 是格式化字符串,后续参数使用 … 表示不定数量的变参。
va_list ap:va_list 是C标准库中用于处理变参的类型。ap 是一个变参列表指针,用于访问传递给函数的变参。
标准库函数重定向:
代码中重定义了标准库中的 fputc、putc、putchar 和 fputs 函数,使它们调用 UARTa_SendByte 函数向串口SCI发送数据。
通过这些函数的重定向,程序可以使用类似于标准库的 printf 函数的格式化字符串,将数据输出到串口SCI。同时,fputc、putc、putchar 和 fputs 函数也能直接将数据输出到串口SCI,方便地进行调试和输出结果信息。需要注意的是,由于串口发送速率有限,如果发送数据过于频繁,可能会导致数据丢失或串口阻塞。因此,在实际使用中应该适度控制发送频率,确保数据发送的稳定性。

串口SCI初始化详细分析

void UARTa_Init(Uint32 baud)
{unsigned char scihbaud=0;unsigned char scilbaud=0;Uint16 scibaud=0;scibaud=37500000/(8*baud)-1;scihbaud=scibaud>>8;scilbaud=scibaud&0xff;EALLOW;SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-AEDIS;InitSciaGpio();//Initalize the SCI FIFOSciaRegs.SCIFFTX.all=0xE040;SciaRegs.SCIFFRX.all=0x204f;SciaRegs.SCIFFCT.all=0x0;// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() functionSciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback// No parity,8 char bits,// async mode, idle-line protocolSciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKESciaRegs.SCICTL2.all =0x0003;SciaRegs.SCICTL2.bit.TXINTENA =1;SciaRegs.SCICTL2.bit.RXBKINTENA =1;SciaRegs.SCIHBAUD    =scihbaud;  // 9600 baud @LSPCLK = 37.5MHz.SciaRegs.SCILBAUD    =scilbaud;
//  SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop backSciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
}

这段代码是用于初始化串口SCI(串行通信接口)的函数 UARTa_Init,该函数用于配置SCI的寄存器和相关参数,以便实现指定的波特率和通信设置。让我们逐个分析设置的寄存器对应位的功能和效果:

unsigned char scihbaud=0;
unsigned char scilbaud=0;
Uint16 scibaud=0;
这里定义了用于保存波特率计算结果的变量 scihbaud 和 scilbaud 作为高8位和低8位,以及 scibaud 作为16位整数用于计算波特率分频寄存器的值。

scibaud=37500000/(8*baud)-1;
这行代码根据输入的波特率值 baud 计算波特率分频寄存器的值 scibaud。LSPCLK(低速外设时钟)的频率为 37.5MHz,SCI的分频因子为 8(由于设置了 SCIHBAUD 和 SCILBAUD 分别为高8位和低8位),所以分频后的SCI时钟频率为 37.5MHz / 8 = 4.6875MHz。因此,计算公式为:波特率分频值 = SCI时钟频率 / 波特率 - 1。

scihbaud=scibaud>>8;
scilbaud=scibaud&0xff;
这两行代码将计算得到的波特率分频寄存器的值 scibaud 分解成高8位和低8位,分别存储在 scihbaud 和 scilbaud 中。

EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
这部分代码使能了SCI-A模块的时钟(PCLKCR0 寄存器的 SCIAENCLK 位设置为1),从而允许对SCI-A进行配置。

InitSciaGpio();
这是一个初始化SCI-A相关的GPIO(通用输入输出端口)的函数。通过这个函数,将相应的GPIO引脚设置为与SCI-A功能相匹配,从而实现SCI-A的通信。

SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x204f;
SciaRegs.SCIFFCT.all=0x0;
这些代码用于配置SCI FIFO(First In, First Out)寄存器,用于配置SCI发送和接收的FIFO的触发阈值等参数。

SciaRegs.SCICCR.all =0x0007;
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
这些代码配置了SCI的控制寄存器(SCICCR)、控制寄存器1(SCICTL1)和控制寄存器2(SCICTL2)。其中的设置如下:

SCICCR.all = 0x0007:设置为 1 停止位,无环回,无奇偶校验,8 个字符位,异步模式,空闲线协议(idle-line protocol)。
SCICTL1.all = 0x0003:使能发送(TX)、接收(RX)和内部 SCICLK。同时,禁用接收错误、睡眠模式和发送唤醒。
SCICTL2.all = 0x0003:使能发送中断(TXINTENA)和接收中断(RXBKINTENA)。
SciaRegs.SCIHBAUD = scihbaud;
SciaRegs.SCILBAUD = scilbaud;
这里将之前计算得到的波特率分频寄存器值 scihbaud 和 scilbaud 分别设置到 SCI 模块的高位波特率寄存器(SCIHBAUD)和低位波特率寄存器(SCILBAUD),从而配置了SCI的波特率。

SciaRegs.SCICTL1.all = 0x0023;
最后,这行代码将 SCI 模块的控制寄存器1设置为 0x0023,从而解除 SCI 模块的复位状态,使得SCI模块开始工作。

通过上述配置,串口SCI(SCI-A)已经被成功初始化,并配置了指定的波特率和通信设置。接下来,可以通过串口SCI进行数据的发送和接收操作。

串口SCI使用

/** main.c**  Created on: 2023年7月9日*      Author: 黎*/#include  "main.h"
#define MAX_STRING_LENGTH 100 // 定义字符串的最大长度void main()
{int i = 0;char *msg;Uint16 ReceivedChar = 0;char scia_rx_buf[MAX_STRING_LENGTH] = { 0 };int rx_flag = 1;int StringIndex = 0; // 字符串索引InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();UARTa_Init(4800);while (1){printf("\r\nEnter a character: ");while (rx_flag){// Wait for inc character// 等待接收字符while (SciaRegs.SCIFFRX.bit.RXFFST != 1); // wait for XRDY =1 for empty state// 等待 XRDY = 1,表示缓冲区非空// Get character读取接收到的字符ReceivedChar = SciaRegs.SCIRXBUF.all;// 检查是否为换行符或字符串超过最大长度if (ReceivedChar == '\n' || StringIndex >= MAX_STRING_LENGTH - 1){scia_rx_buf[StringIndex] = '\0'; // 在字符串末尾添加空字符rx_flag = 0;break; // 结束接收字符串}// 存储接收到的字符scia_rx_buf[StringIndex] = ReceivedChar;StringIndex++;}// Echo character backprintf("  You sent: ");printf("\n scia_rx_buf = %s\r\n",scia_rx_buf);rx_flag = 1;StringIndex = 0;DELAY_US(1000);}
}

这段代码是一个示例程序,主要功能是通过串口SCI(SCI-A)接收用户输入的字符,并将输入的字符显示回终端上。

以下是代码的详细解释:

#define MAX_STRING_LENGTH 100
这里定义了一个宏 MAX_STRING_LENGTH,用于指定字符串的最大长度。在这个示例中,最大长度被设置为100。

void main()
这是程序的主函数入口。

变量初始化:

int i = 0;:一个用于循环计数的变量。
char *msg;:未使用的指针变量。
Uint16 ReceivedChar = 0;:用于存储接收到的字符的变量,初始值为0。
char scia_rx_buf[MAX_STRING_LENGTH] = { 0 };:用于存储接收到的字符串的字符数组,初始值全部为0。
int rx_flag = 1;:用于控制接收字符的标志位,初始值为1表示正在接收字符。
int StringIndex = 0;:字符串索引,用于指示当前接收到的字符在 scia_rx_buf 数组中的位置。
初始化系统控制和中断控制寄存器。

初始化串口SCI(SCI-A):
UARTa_Init(4800);:这个函数用于初始化SCI-A通信,并设置波特率为4800。

进入主循环 while (1):

通过 printf 函数提示用户输入字符:“Enter a character: ”。
等待接收字符,while (rx_flag) 表示一直等待接收字符,直到 rx_flag 变为0。
在接收到字符时,通过 SciaRegs.SCIFFRX.bit.RXFFST 检查SCI接收缓冲区是否有字符到达。
读取接收到的字符,并存储在 ReceivedChar 中。
判断接收的字符是否为换行符或字符串长度是否超过最大长度(MAX_STRING_LENGTH),如果是,则结束接收,并在字符串末尾添加空字符(‘\0’),同时将 rx_flag 置为0,退出接收字符的循环。
否则,将接收到的字符存储在 scia_rx_buf 数组中,并增加 StringIndex 值,指示下一个字符应该存储在数组的下一个位置。
回显接收到的字符:

通过 printf 函数显示 "You sent: "。
通过 printf 函数显示接收到的字符串 scia_rx_buf。
最后,将 rx_flag 和 StringIndex 重置为初始值,然后通过 DELAY_US 函数延迟一段时间(这里是1000微秒)。

循环会不断重复,用户可以在终端输入字符,程序会接收并显示回显字符,直到结束。

如果文章对您有所帮助,点赞支持,感谢!!!!

相关文章:

DSP开发:串口sci的发送与接收实现

DSP开发&#xff1a;串口sci的发送与接收实现 文章目录 DSP开发&#xff1a;串口sci的发送与接收实现串口配置串口SCI初始化详细分析串口SCI使用 串口配置 /*--------------------------------------------scia----------------------------*/ /*----------------------------…...

实训一 :Linux的启动、关机及登录

实训一 &#xff1a;Linux的启动、关机及登录 2017 年 2 月 22 日 今日公布 实训目标 完成本次实训&#xff0c;将能够&#xff1a; 描述Linux的开机过程。在图形模式和文本模式下登录Linux。关闭和重启Linux 实训准备 一台已安装RHEL6的虚拟计算机&#xff0c;Linux虚拟…...

Redis分布式锁问题

1、业务单机情况下 问题&#xff1a;并发没有加锁导致线程安全问题。 解决方法&#xff1a;加锁处理&#xff0c;如lock、synchronized 仍有问题&#xff1a;业务分布式情况下&#xff0c;代码级别加锁已经无效。需要借助第三方组件&#xff0c;如redis、zookeeper。 2、业务分…...

windows安装apache-jmeter-5.6.2教程

目录 一、下载安装包&#xff08;推荐第二种&#xff09; 二、安装jmeter 三、启动jmeter 一、下载安装包&#xff08;推荐第二种&#xff09; 1.官网下载&#xff1a;Apache JMeter - Download Apache JMeter 2.百度云下载&#xff1a;链接&#xff1a;https://pan.baidu.…...

密码检查-C语言/Java

描述 小明同学最近开发了一个网站&#xff0c;在用户注册账户的时候&#xff0c;需要设置账户的密码&#xff0c;为了加强账户的安全性&#xff0c;小明对密码强度有一定要求&#xff1a; 1. 密码只能由大写字母&#xff0c;小写字母&#xff0c;数字构成&#xff1b; 2. 密码不…...

基于Matlab实现心电信号小波特征提取和对应疾病识别仿真(附上源码+数据集)

本文基于Matlab平台&#xff0c;研究了心电信号的小波特征提取方法&#xff0c;并应用于心电信号疾病识别仿真实验中。首先&#xff0c;介绍了心电信号的基本特征和常见的心电疾病。然后&#xff0c;详细阐述了小波变换的原理和方法&#xff0c;并提出了一种基于小波分解和小波…...

第五十二天

HTML5 ●MathML 是数学标记语言&#xff0c;是一种基于XML&#xff08;标准通用标记语言的子集&#xff09;的标准&#xff0c;用来在互联网上书写数学符号和公式的置标语言。 ●拖放 拖放是一种常见的特性&#xff0c;即抓取对象以后拖到另一个位置。 在 HTML5 中&#xf…...

爬虫练手项目——获取龙族小说全文

网站信息 目标网站信息如下&#xff1a;包含了龙族1-5全部内容 代码 import requests from bs4 import BeautifulSoup import os import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Sa…...

OpenCV图像处理——几何变换

目录 图像缩放图像平移图像旋转图像的仿射变换透射变换图像金字塔 图像缩放 cv.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)import numpy as np import cv2 as cv import matplotlib.pyplot as pltkidscv.imread(./汪学长的随堂资料/4/图像操作/dog.jpg) plt.im…...

Apache JMeter:完全指南

Apache JMeter 是一款开源的性能测试工具&#xff0c;可以用于测试 Web 应用程序、FTP 服务器、数据库等各种类型的服务器。本文将以 JMeter 5.5 为例介绍 JMeter 的使用方法。 下载和安装 由于 JMeter 是使用 Java 开发的&#xff0c;因此在运行之前必须先安装 JDK。您可以在…...

js obj 生成java 实体 entity

js obj 生成java 实体 entity D:\proj\js\js-util\gen_java.js 文档&#xff1a;js obj 生成java 实体 entity.note 链接&#xff1a;http://note.youdao.com/noteshare?idc61fbd4b8684dc41c8c9ab42107d5f87&subE7484F5F277041578A2E58FDC6320BA6 添加链接描述 class S…...

【第二阶段】kotlin语言的匿名函数与具名函数

fun main() {//匿名函数val niminginfoniming("kotlin",20,{"$it"})println(niminginfo)//具名函数 理解&#xff1a;showResult:(String)->String):StringshowResultImpl(result:String):Stringval juminginfoniming("c ",20,::showResultI…...

P1123 取数游戏

取数游戏 题目描述 一个 N M N\times M NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8 8 8 个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求…...

JavaScript高级:原型与原型链继承方式

在 JavaScript 中&#xff0c;继承是一种重要的概念&#xff0c;它使得对象可以从其他对象继承属性和方法&#xff0c;实现代码的重用和扩展。原型与原型链是 JavaScript 中实现继承的核心机制&#xff0c;虽然听起来有些高深&#xff0c;但我们可以通过通俗易懂的方式来理解它…...

使用vue-grid-layout时 You may need an appropriate loader to handle this file type.

使用vue-grid-layout时 You may need an appropriate loader to handle this file type. node版本不匹配 我的node v14.16.0 vue-gride-layout 需要用 v 2.3.7的版本 卸载后重新安装即可...

C# 2048小游戏核心算法

文章目录 01.程序结构划分02.去零03.合并04.上移05.下移/左移/右移&#xff0c;只是取数据的方向不同06.提高可读性 01.程序结构划分 02.去零 有序向量“唯一化”的思路。 /// <summary>/// 去零/// </summary>/// <param name"row">对于一行或一…...

设计模式(5)代理模式

一、介绍&#xff1a; 【Subject/抽象角色】定义了RealSubject和Proxy的共用接口&#xff0c;这样就可以在任何使用RealSubject的地方都可以使用Proxy 【RealSubject/真实角色】定义Proxy所代表的真实实体 【Proxy/代理角色】保存一个引用使得代理可以访问实体&#xff0c;并…...

Django配置(部署环境较乱,暂时启用)

django配置 web服务器中部署项目及WSGI简介 web服务器 WSGI 在IIS中部署django项目 安装 wfastcgi &#xff1a;pip install wfastcgi安装IIS&#xff1a; 以上选择项勾选后确定 将CGI文件复制到项目中&#xff0c; 将项目复制到IIS默认目录中 部署IIS 添加变量信息如下…...

【设计模式】桥接模式

桥接&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得…...

ol问题总结二

一、加载坐标系是4326格式的&#xff0c;使用wfsServer发布的服务&#xff0c;图层加载失败&#xff1b;坐标系是3857格式的。图层加载正常 原因&#xff1a;4326格式的&#xff0c;发布出来的&#xff0c;经纬度是颠倒的 解决方案一&#xff1a;将经纬度进行反转 <templa…...

SOC-ESP32S3部分:25-HTTP请求

飞书文档https://x509p6c8to.feishu.cn/wiki/KL4RwxUQdipzCSkpB2lcBd03nvK HTTP&#xff08;Hyper Text Transfer Protocol&#xff09; 超文本传输协议&#xff0c;是一种建立在 TCP 上的无状态连接&#xff0c;整个基本的工作流程是客户端发送一个 HTTP 请求&#xff0c;说明…...

malloc 内存分配机制:brk 与 mmap

一、malloc的两种内存分配策略 malloc 并非直接的系统调用&#xff0c;而是C标准库封装的内存管理函数。它根据应用程序请求的内存大小&#xff0c;智能地选择两种不同的底层机制向操作系统申请内存&#xff1a; 小块内存分配 (< 128KB)&#xff1a;brk() / sbrk() 系统调用…...

YARN架构解析:大数据资源管理核心

一、YARN的设计目标​​ ​​解耦资源管理与作业调度​​&#xff1a;将资源管理&#xff08;Resource Management&#xff09;和任务执行&#xff08;Task Execution&#xff09;分离&#xff0c;提升集群资源利用率。​​支持多种计算框架​​&#xff1a;不再局限于MapRedu…...

网络安全方向在校生有哪些证书适合考取?

工作7年得出结论&#xff1a;网络安全&#xff0c;考任何证书都没有用&#xff0c;实力才是根本。我是2021年考的 CISSP&#xff0c;报了培训班&#xff0c;花了1万一千块钱&#xff0c;签的保障班还是服务班不记得了&#xff0c;大概意思就是你放心去考&#xff0c;考不过可以…...

React和原生事件的区别

一、核心差异对比表 维度原生事件React 事件绑定语法HTML 属性&#xff08;onclick&#xff09;或 DOM API&#xff08;addEventListener&#xff09;JSX 中使用驼峰式属性&#xff08;onClick&#xff09;绑定位置直接绑定到具体 DOM 元素统一委托到根节点&#xff08;React …...

【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案

深入解析 Apollo Client&#xff1a;从架构到实践的一站式 GraphQL 解决方案 1. 引言 GraphQL 作为现代 API 开发的核心技术&#xff0c;其灵活性和高效性正在重塑数据交互模式。Apollo Client 作为 GraphQL 生态中最受欢迎的客户端库&#xff0c;凭借强大的缓存机制、框架集…...

数据库原理 试卷

以下是某高校教学管理系统的毕业论文指导ER图&#xff0c;数据信息&#xff1a;一名教师指导多名学生&#xff0c;一名学生只能选择一名教师&#xff0c;试分析完成以下各题&#xff0c;如用SQL命令完成的&#xff0c;在SQL Server2008验证后把答案写在题目的下方。 图1 毕业论…...

Vue传参Props还是Pinia

Pinia 适用场景 全局状态管理 多个不相关组件需要共享数据需要跨页面/路由共享状态 复杂状态逻辑 包含多个相互关联的状态有复杂的状态修改逻辑 持久化需求 需要将状态保存到localStorage/sessionStorage页面刷新后需要恢复状态&#xff08;恢复最后一次修改的状态&#xff0…...

5G-A:开启通信与行业变革的新时代

最近&#xff0c;不少细心的用户发现手机信号标识悄然发生了变化&#xff0c;从熟悉的 “5G” 变成了 “5G-A”。这一小小的改变&#xff0c;却蕴含着通信技术领域的重大升级&#xff0c;预示着一个全新的通信时代正在向我们走来。今天&#xff0c;就让我们深入了解一下 5G-A&a…...

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块

房屋租赁系统 JavaVue.jsSpringBoot&#xff0c;包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块 百度云盘链接&#xff1a;https://pan.baidu.com/s/16YRGBPsfbd4_HxXhO0jM5Q 密码&#xff1a;smk4 摘 要 房屋是人类生活栖息的重要…...