学习笔记|串口与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里面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++day07(auto、lambda、类型转换、STL、文件操作)

今日任务 试编程: 封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个) 再把该容器中的对象,保存到文件中。 再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容…

振弦采集仪应用水坝安全监测的方案

振弦采集仪应用水坝安全监测的方案 随着工业化和城市化的快速发展,水资源的开发和利用越来越广泛。由于水坝在水利工程中起着至关重要的作用,因此对水坝进行安全监测变得越来越必要。为了实现对水坝的安全监测,振弦采集仪可以作为一种有效的…

ideal远程Debug部署在服务器上的服务详解

ideal远程Debug部署在服务器上的服务详解 一 简介二 ideal配置步骤第一步:点击Edit Configurations选项添加远程连接第二步:配置Remote JVM debug参数第三步:服务的启动参数中添加第二步生成的命令并重新启动服务第四步:ideal启动…

声音克隆,定制自己的声音,使用最新版Bert-VITS2的云端训练+推理记录

说明 本次训练服务器使用Google Colab T4 GPUBert-VITS2库为:https://github.com/fishaudio/Bert-VITS2,其更新较为频繁,使用其2023.10.12的commit版本:主要参考:B站诸多大佬视频,CSDN:https://blog.csdn.…

低代码:避免重复造轮子的高效工具

一、前言 在软件开发和其他工程领域,“重复造轮子”被广泛认为是一种低效的做法,因为它浪费了大量的时间和资源去重新创作已经存在的东西,而不是利用现有的技术和经验去解决问题。 因此,为了避免“重复造轮子”,开发人…

chatGPT 帮我优化mysql查询语句 优化一下查询速度

最终效果 备份一下数据库,加上索引就行。25ms查询完成。 对比 加上索引之前及之后的 EXPLAIN SELECT d.sn, d.imei1, d.imei2, d.remark FROM device_info_new d INNER JOIN production_log p ON d.state ‘0’ AND p.sn d.sn AND p.imei1 d.imei1 AND p.imei2 …

Realm violation Datapatch 禁用DBV database vault

Datapatch failed with the error ORA-47410: Realm violation for CREATE ROLE (Doc ID 2306010.1)​编辑To Bottom APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…

专业韩语论文翻译,论文中译韩哪里比较专业?

据了解,论文翻译是翻译工作中较常见的一种翻译题材,论文翻译的主要目的是在国外期刊上发表,加强国际学术交流。那么,如何做好论文翻译,论文中译韩哪里比较专业? 业内人士指出,翻译韩语论文&…

OLED透明拼接屏:福州鼓山风景区:徜徉于城市壮丽之

福州是中国福建省的省会城市,历史悠久,文化底蕴深厚。 该城市曾是唐宋时期的重要港口城市,也是丝绸之路海上丝绸之路的起点之一。 福州以其独特的地理位置和丰富的历史遗产而闻名于世。 福州拥有众多的历史景点,其中最著名的是…

nginx绑定tomcat与tomcat联合使用的配置(nginx反向代理tomcat的配置说明)

nginx反向代理tomcat通信配置 (内容来自网上,注解部分才是原创) 切记: url的意思就是 unifed resource location 统一资源定位 其中location就是定位的意思 所以上文中的location就有 对应匹配的 url 标识的资源的相关配置之…

java Maven入门笔记

后端Web开发技术的学习,我们要先学习Java项目的构建工具:Maven 目录 Maven概述Maven介绍及其作用Maven模型介绍Maven仓库Maven安装 IDEA集成Maven配置Maven环境当前工程设置全局设置 Maven项目创建Maven项目POM配置详解Maven坐标详解 导入Maven项目 依赖…

【TensorFlow2 之013】TensorFlow-Lite

一、说明 在这篇文章中,我们将展示如何构建计算机视觉模型并准备将其部署在移动和嵌入式设备上。有了这些知识,您就可以真正将脚本部署到日常使用或移动应用程序中。 教程概述: 介绍在 TensorFlow 中构建模型将模型转换为 TensorFlow Lite训练…

Jenkins 结合 ANT 发送测试报告

目录 全局变量配置 新建任务 插件安装 HTML 报告配置 邮件配置 全局变量配置 点击 ManageJenkins进入Jenkins 管理 点击 Global Tool Configuration 进入全局变量配置 配置 Ant ,Name 自己定义一个比较好理解的名称。 去掉 Install automatically 勾选&#x…

华为OD机考算法题:找终点

目录 题目部分 解读与分析 代码实现 题目部分 题目找终点难度易题目说明给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。 要求: 1.第…

skywalking动态配置[集成nacos/apollo/consul]

说明:以下配置仅关于的阈值规则的动态配置,其他参数也可以进行配置。 1,skywalking动态配置集成nacos 编辑application.yml nacos配置参数如下: nacos:# Nacos Server HostserverAddr: 10.10.5.145# Nacos Server Portport: 8848# Nacos Configuration Groupgroup: skywal…

2.1、如何在FlinkSQL中读取写出到Kafka

目录 1、环境设置 方式1:在Maven工程中添加pom依赖 方式2:在 sql-client.sh 中添加 jar包依赖 2、读取Kafka 2.1 创建 kafka表 2.2 读取 kafka消息体(Value) 使用 format json 解析json格式的消息 使用 format csv 解析…

快速学习微服务保护框架--Sentinel

学习一个框架最好的方式就是查看官方地址,sentinel是国内阿里巴巴公司的,官网更方便官网 官网 微服务保护框架 Sentinel 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微…

全力以赴,火山引擎边缘云代表团出战亚运会

END 未来,火山引擎边缘云赛事阵容将继续全力以赴,通过领先、可信赖的云和智能技术,助力游戏行业呈现更加精彩的竞技赛事。

光耦合器继电器与传统继电器:哪种最适合您的项目?

在电子和电气工程领域,继电器的选择可以显着影响项目的性能和安全性。两种常见类型的继电器是光耦合器继电器和传统机电继电器。每个都有其优点和缺点,因此选择过程对于项目的成功结果至关重要。 光耦合器继电器:基础知识 光耦合器继电器&…

linux环境下使用lighthouse与selenium

一、安装谷歌浏览器、谷歌浏览器驱动、lighthouse shell脚本 apt update && apt -y upgrade apt install -y curl curl -fsSL https://deb.nodesource.com/setup_18.x | bash apt install -y nodejs apt install -y npm npm install -g lighthouse apt-get install -y …