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

学习笔记|串口与PC通信的接线|移植驱动程序|串口通信实战|STC32G单片机视频开发教程(冲哥)|第二十一集(上):串口与PC通信

目录

  • 1.串口与PC通信的接线
    • 芯片与芯片之间的通讯:
    • 芯片与电脑之间的通讯:
  • 2.利用实验箱示例代码移植驱动程序
  • 3.串口通信实战
    • 最小工程
    • 代码移植
    • 编译提示错误:undefined identifier

1.串口与PC通信的接线

上节试验是串口和电脑进行一个通信,用了一根USB转232的线,直接插到了我们这个板子上。今天详细解释一下是怎么样接线。
在这里插入图片描述
每一个TD和一个RXD代表一组端口,就是一组串口。
看DIP40的管脚功能图:
在这里插入图片描述
TXD_几和RXD_几表示这是该组串口的第几个通道,1是默认省略的。通道是分时打开,也叫分时复用。
在这里插入图片描述
MCU串口出来的信号都是TTL电平。
TTL电平信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。

芯片与芯片之间的通讯:

如果通信协议和电平都一样,直接TX和RX链接就可以通信。

在这里插入图片描述

芯片与电脑之间的通讯:

电脑没有TXD跟RXD的这个接口(以前的电脑有232接口)
在这里插入图片描述
串口能直接和电脑USB通信吗?不能直接通信,因为电脑没有串口。需借助USB转TTL的工具。
在这里插入图片描述
它中间用了颗芯片,去做电平的转化或者协议的转化,芯片常见的有CH340、CP2102,电脑还需要另外的去装驱动。
在这里插入图片描述
推荐使用如上的官方工具。
程序无需任何处理,抗干扰能力更强!

一个USB工具可以转2个串口,代替2个。
在这里插入图片描述
四个端子分别是接到了P47、P50、P46、P51。
在这里插入图片描述
再看看USB转TTL的模块,学名是:一箭双雕之USB转双串口。需要根据官方介绍,刷成USB转双串口的功能。占用1个usb口,2路串口输出。
S-RXD是STC-CDC1串口的发送脚,连接其它串口的接收脚。S-TXD是STC-CDC1串口的接收脚。连接其它串口的发送脚。
S-RXD本质上是TX,S-TXD本质上是RX,这么标注是为了方便用户接线。
在这里插入图片描述

一般使用同一组串口。一箭双雕还有OLED接口,4个led的流水灯等等。
在这里插入图片描述
USB转232通讯线。板载232端口(DB9母头)和电平转换电路。考虑到传输距离和抗干扰性的问题,中间就可以考虑使用TTL转232,相互去转化。
TTL转232程序上无需任何处理,但抗干扰能力增强。实际项目中,如果距离有一定要求,可以采用此方式。甚至485,422。只要逻辑电平能对得上,就可以互相连接。

2.利用实验箱示例代码移植驱动程序

1)查找试验箱里面和我们的功能最接近的程序。如:11-串口2中断模式与电脑收发测试
在这里插入图片描述
上节课也用串口2,是根据手册编写的代码,后期一定要灵活运用程序包。官方提供的程序包里面官方都已经测试好了,不用去熟悉每一个寄存器,只要按照代码包里的寄存器配好就可以使用了。
代码包里每一个试验都已经做到了最简单,不用从几万行代码里去扣出几十行几百行你有用的代码,每一个小实验对应一个功能。本节讲串口2,可以直接移植例程。
2)先测试示例程序是否正常运行。
一定先试验测试,再移植。
3)分析哪些代码与我们的功能有用。
只移植对我们有用的东西。
4)新建文件,开始移植。
尽量避免大部分无用的手敲,只需要学会怎么去移植就可以。

3.串口通信实战

打开待参考的11-串口2中断模式与电脑收发测试代码包(C语言),再将上一节的16.串口2通信复制并更名为17.串口PC通信,打开工程,在其基础上进行移植。
同时打开以上2个工程,屏幕右边方示例代码,左边打开我们要需要的工程。
先从主函数开始看,提升指令速度等原工程里都有(见sys_init()),明显不需要设为准双向口。
选择波特率这行初始化没有,应该有用,选中这行并复制到新工程内,示例模板里是放在端口初始化之后,我们也放在sys_init()初始化之后。

最小工程

把工程里不必要的东西清理一下,保留最小工程,如:

#include "COMM/stc.h"		//调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h"
#include "beep.h"
#include "tim0.h"
#include "exit.h"
#include "adc.h"
#include "ntc.h"
#include "usart2.h"char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";bit  TIM_10MS_Flag;			//10ms的标志位
u16 Tme_CountDown = 0;		//全局变量void sys_init();	//函数声明
void delay_ms(u16 ms);	//unsigned intvoid main()					//程序开始运行的入口
{sys_init();				//USB功能+IO口初始化UART2_config(2);    // 选择波特率, 2: 使用Timer2做波特率, 1其它值: 无效.1usb_init();				//usb库初始化Timer0_Init();			//定时器0初始化EA = 1;					//CPU开放中断,打开总中断。while(1)		//死循环{if( TIM_10MS_Flag==1 )									//如果10ms到了{TIM_10MS_Flag = 0;									//清空标志位}}
}void Timer0_Isr(void) interrupt 1
{static timcount = 0;SEG_LED_Show();			//数码管刷新的timcount++;				//1ms+1if( timcount>=10 )		//如果这个变量大于等于10,10ms计数到达{timcount = 0;TIM_10MS_Flag = 1;	//10ms时间到了}
}void sys_init()		//函数定义
{WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快EAXFR = 1; //扩展寄存器(XFR)访问使能CKCON = 0; //提高访问XRAM速度P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口P3M0 = 0x00;P3M1 = 0x00;P3M0 &= ~0x03;P3M1 |= 0x03;//设置USB使用的时钟源IRC48MCR = 0x80;    //使能内部48M高速IRCwhile (!(IRC48MCR & 0x01));  //等待时钟稳定USBCLK = 0x00;	//使用CDC功能需要使用这两行,HID功能禁用这两行。USBCON = 0x90;
}void delay_ms(u16 ms)	//unsigned int
{u16 i;do{i = MAIN_Fosc/6000;while(--i);}while(--ms);
}

先对示例代码进行测试,复制E:\STC32\STC32G-DEMO-CODE-V9.6-20230425\COMM文件夹至待移植工程目录,并添加include文件路径,将成功编译后的文件载入开发板。下载时选择主频为22.1184。
看一下示例程序里使用的引脚,在UART2_config(2)上跳转初始化,S2_S = 1; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7,选择的是P4.6和P4.7。
正常运行时,板子无任何变化,选择USB转232所在的串口,再看一下程序里的波特率为115200(#define Baudrate2 (65536 - MAIN_Fosc / 115200 / 4)),常用的还有9600。无校验,停止位1。打开串口,发送数据后返回一模一样的数据。执行的主要代码段为:

    while (1){if((TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy))   //收到数据, 发送空闲{S2BUF = RX2_Buffer[TX2_Cnt];B_TX2_Busy = 1;if(++TX2_Cnt >= UART2_BUF_LENGTH)   TX2_Cnt = 0;}}

示例代码验证完,没有问题,可以移植。

代码移植

首先打开刚才的最小工程,然后选择波特率的这行复制好了,EA=1总中断开启。把PrintString2()函数也复制过来。初始化完成后,打印一个字符串。代码中的小红点是仿真时的断点,也可以做为每次编写代码的位置提示。
再把while主循环部分的执行代码复制移植过来,放在10ms执行标识前,可以把USB下载的代码段取消注释,方便下载。
转到UART2_config(2)的定义,看看详细定义方法。移植该功能代码前,将上节课的串口模块.C和.H文件中自编代码部分删除。
首先函数需要先移植过来,添加声明,复制UART2_config函数定义,再讲其下的中断函数复制过来(除中断函数外,其他函数都需要声明才可以使用)。中断函数和上节代码一样,不详细讲解了。UART2_config里还有设置串口函数SetTimer2Baudraye,移植过来(声明并复制定义)。
接下来在看看函数中的变量,以PrintString2为例,右击变量名称B_TX2_Busy,转向到定义文件,找到定义。
如果想主函数中也能使用这些变量,需要在usart.h中重新定义,在变量名前加extern:

extern u8  TX2_Cnt;    //发送计数
extern u8  RX2_Cnt;    //接收计数
extern bit B_TX2_Busy; //发送忙标志extern u8  RX2_Buffer[UART2_BUF_LENGTH]; //接收缓冲

这样在别的任意的.C文件中,引用头文件usart.h就可以调用这些变量。调用前需要在相应的.C文件前部增加变量声明(不赋初始值),如在usart.c中增加:

#include "usart2.h"u8  TX2_Cnt;    //发送计数
u8  RX2_Cnt;    //接收计数
bit B_TX2_Busy; //发送忙标志u8  RX2_Buffer[UART2_BUF_LENGTH]; //接收缓冲

修改主时钟:#define MAIN_Fosc 22118400L //定义主时钟(精确计算115200波特率)。复制宏定义Baudrate2和UART2_BUF_LENGTH。至此,完成移植。

编译提示错误:undefined identifier

编译,提示错误:HARDWARE\USART\usart2.c(67): error C67: ‘T2_CT’: undefined identifier,没有定义。
在示例模板中找一下T2_CT,右击转向定义,在stc32g.h头文件中,sbit T2_CT = AUXR^3;AUXR寄存器的第3位。手册中搜索AUXR:
在这里插入图片描述
地址在0X8E,按这个地址去找,如下:
在这里插入图片描述
不建议直接修改头文件(以前的代码都用同样的头文件),可以修改程序中的定义为T2CT,修改完后重新编译,下载进去(实验箱的代码里大部分都没有CDC串口,需要手动进入下载模式)。串口工具中发送文字,能够接收到回显文字,移植成功。
以后的工程中如果用到3个串口,不要再跟着手册去敲,只需要把示例代码,下载到板子里去测试,没问题就可以移植过来了。实验箱中的代码基本上main.c就搞定了,实际做工程的时候,有串口2,NTC,有ADC外部中断,有定时器0等等,不可能全都放在demo.c里面。

相关文章:

学习笔记|串口与PC通信的接线|移植驱动程序|串口通信实战|STC32G单片机视频开发教程(冲哥)|第二十一集(上):串口与PC通信

目录 1.串口与PC通信的接线芯片与芯片之间的通讯:芯片与电脑之间的通讯: 2.利用实验箱示例代码移植驱动程序3.串口通信实战最小工程代码移植编译提示错误:undefined identifier 1.串口与PC通信的接线 上节试验是串口和电脑进行一个通信&…...

关于Mybaits缓存....

记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能,获取修改前数据比较简单,直接从数据库获取,记录修改后的功能也比较简单,直接将用户修改的内容封装成po对象,然后两个比对就可以了&#xff…...

Vue axios调用springboot接口获取数据库数据并显示到网页

axios调用接口获取数据 可以查看简述化的此文 点击 此文简述化文章 PS**由于我自己的本次springboot项目内容很多&#xff0c;所以只是截取了其中关于axios调用接口获取数据的内容&#xff0c;还请大家了解工作原理即可** 前端 添加axios和vue2链接 <script src"htt…...

12-bean创建流程3

文章目录 1 bean实例化前 2. bean实例化doCreateBean&#xff08;&#xff09; 1 bean实例化前 createBean方法里面的resolveBeforeInstantiation方法,InstantiationAwareBeanPostProcessor接口创建一个代理对象返回 try {// Give BeanPostProcessors a chance to return a p…...

volatile关键字 和 i = i + 1过程

本文是复制粘贴,请直接看原文 原文链接:Java并发编程&#xff1a;volatile关键字解析 - Matrix海子 - 博客园 (cnblogs.com) ------------------------------------------------------------------------------------------------------------------- Java并发编程&#xff1…...

ubuntu20 安装 cmake 3.27

1. 下载cmake3.27 建议从cmake官网下载安装&#xff0c;虽然比较慢&#xff0c;但从清华镜像里下载的cmake文件不全。 我下载的是&#xff1a;cmake-3.27.7.tar.gz 博客 ubuntu安装cmake的三种方法&#xff08;超方便&#xff01;&#xff09;-CSDN博客 里面提供了三种方法&am…...

faster lio 回环 加入GTSAM优化的记录

首先感谢这位博主的文章&#xff1a;https://blog.csdn.net/weixin_41281151/article/details/125371285&#xff0c;其中部分代码参考于改博主中的github&#xff1a; https://github.com/kahowang/FAST_LIO_SAM 不同的是&#xff0c;我使用的是faster lio进行更改&#xff0c…...

深入剖析 深度学习中 __init()__函数和forward()函数

目录 前言1. __init()__函数2. forward()函数3. 两者关系 前言 再看代码时&#xff0c;发现init函数和forward函数都有参数&#xff0c;具体是怎么传参的呢&#xff1f; 为了更方便的讲解&#xff0c;会举简单的代码例子结合讲解。 forward() 和 __init__() 是神经网络模型类…...

BUUCTF学习(一):SQL注入,万能密码

1、场景 2、题目 3、解题 用户名&#xff1a;admin or 11# 密码&#xff1a;123456 4、解析SQL注入 “SQL注入是一种常见的Web应用程序漏洞&#xff0c;攻击者可以通过注入的SQL语句获取数据库的敏感信息&#xff0c;对网站用户的数据安全造成威胁。SQL注入的特点包括广泛性、隐…...

基于springboot实现心灵治愈心理健康平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现心灵心理健康平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…...

百度Apollo自动驾驶

百度从2013年开始布局自动驾驶领域&#xff0c;十年来一直坚持压强式的、马拉松式的研发投入&#xff0c;以技术创新驱动长期发展。百度Apollo L4级自动驾驶运营测试里程累计已超5000万公里&#xff0c;拥有自动驾驶专利族超4600件&#xff0c;其中高级别自动驾驶专利族数全球第…...

数据迁移库工具-C版-01-HappySunshineV1.0-(支持Gbase8a)

一、测试环境信息 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase8a版本8.6.2-R43.34.27468a27HappySunshine版本V1.0 二、支持功能 序号功能1GBASE8a到GBASE8a的库级数据迁移。2批量加载。&#xff…...

【sv】 pack/unpack stream

https://www.amiq.com/consulting/2017/05/29/how-to-pack-data-using-systemverilog-streaming-operators/ https://www.amiq.com/consulting/2017/06/23/how-to-unpack-data-using-the-systemverilog-streaming-operators/...

二、使用DockerCompose部署RocketMQ

使用DockerCompose进行部署 docker-compose的版本为 Docker Compose version v2.2.3 RocketMQ的部署方式以及各自的特点 单master模式 只有一个 master 节点&#xff0c;如果master节点挂掉了&#xff0c;会导致整个服务不可用&#xff0c;线上不宜使用&#xff0c;适合个人学习…...

论文笔记[156]PARAFAC. tutorial and applications

原文下载&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0169743997000324 摘要 本文介绍了PARAFAC的多维分解方法及其在化学计量学中的应用。PARAFAC是PCA对高阶数组的推广&#xff0c;但该方法的一些特性与普通的二维情况截然不同。例如&#xff0c;…...

AKKA.Net 的使用 来自CHATGPT

请用C# 语言实现一个自动化设备 流水线调度模型&#xff0c;流水线各个环节需要并行执行&#xff1a; 下面是一个使用C#语言实现自动化设备流水线调度模型的简单示例。该示例使用并发编程库System.Threading.Tasks来实现流水线各个环节的并行执行。 csharp using System; usi…...

网络安全—小白学习笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…...

OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理

OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台&#xff0c;它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台&#xff0c;用户可以收集和处理来自不同设备的传感器数据&#xff0c;适用于智…...

GO-unioffice实现word编辑

导包 import ("fmt""log""os""time""github.com/unidoc/unioffice/common/license""github.com/unidoc/unioffice/document" ) 创建word文件 func CreateFile(name string) {filename : name ".docx&quo…...

SpringMVC的拦截器(Interceptor)

拦截器简介 SpringMVC的拦截器Interceptor&#xff0c;主要是对Controller资源访问时进行拦截的基本操作的技术&#xff0c;当然拦截后可以进行权限控制&#xff0c;功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter&#xff0c;他们之间的区别如下图所示 Filter技术…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...