c语言找到串口,再次熟悉串口
串口是非常常用的一个调试工具,我们都必须熟练使用串口的各个功能。
1.题目要求和解决方案
我们要做的是,电脑端发送字符串过来给单片机,然后单片机这边接收完之后要回复给电脑端,回复内容为“接收完成!”。单片机这边把接收到的数据存放在定义好的全局变量数组里面,我们可以通过按K4发送回去给电脑端查看刚刚接收到的内容并把它显示出来。
我们要知道,一个汉字是需要两个字节内存的,比如电脑端发送的字符串为“好好学习,天天向上!”其中的两个标点符号也是中文输入法打上的话,一个标点符号也是占用两个字节,这个字符串就是一共占用10*2=20个字节内存。
那么怎样判断是否把字符串的数据都接收完成了呢?我们参考了宋老师的编程思想,使用定时计数器,也就是让定时器0使用工作模式1计时,接收到第一个数据的时候我们先把TH0和TL0清0,然后打开定时器开始计时,当接收到第二个数据的时候又把TH0和TL0清0让他们从0开始再次计时,直到当TH0大于等于200的时候证明时间过去了50ms左右( 200*256*(12/11059200)= 0.055秒 ),如果在这50ms里面都不再接收地到数据,那么断定已经把字符串的数据都接收完成。
我们程序里定义的数组有关键字pdata,大家在《手把手教你学51单片机》文档10.4节了解一下知识点即可。
2.main.c测试代码#include
#include //详见第六章第8讲
#include //详见第十章第4讲
u8 uart_i=0;
u8 pdata RXDBUF[64];
void COUNT_TIMES()
{
TMOD&=0xF0; //清0低四位
TMOD|=0x01; //设置定时器0为工作模式1
}
void main()
{
u8 key,x;
KEY_Init(); //初始化按键模块
EA = 1; //闭合总中断开关
COUNT_TIMES(); //初始化计数器
ConfigUART(9600);
while(1)
{
key=KEY_Scan(0,500);
if(key==4)
{
printf_str("收到的内容为:\r\n");
printf_str(RXDBUF); //把接收到的字符串发送给电脑端
for(x=0;x<64;x++)RXDBUF[x]=0x00; //发送完接收到的字符串之后,内存区全部清除数据,统一改为0x00以便下次接收新的字符串
}
if(TH0>=200) //判断是否把数据接收完毕
{
TR0=0; //关闭定时器,停止计时
printf_str("\r\n接收完成!\r\n");
RXDBUF[uart_i]='\0'; //增加结束符,满足了“printf_str(RXDBUF);”该发送多少数据就是多少
uart_i=0; //uart_i归0是为了下次接收新的字符串是从RXDBUF[0]开始存取数据
TH0=0; //清零定时器的寄存器,下次再从0开始计时
TL0=0;
}
}
}
void InterruptUART() interrupt 4
{
if (RI) //接收到字节
{
RI = 0;
TH0=0;//每接收到一个字节数据,就清0寄存器的值,定时时间又是从0开始计时,直到TH0大于等于200的时候,
TL0=0;//时间超过50ms,也就是没有再接收到数据,因为接收到数据都会进入“if (RI)”把TH0和TL0清0,TH0大于等于200,
//超出了等待时间,证明后面没有数据发送过来了
TR0=1;//接收到第一个数据就打开定时器开始计时,后面接收到第二,第三个数据照样打开定时器计时,直到在主函数里面被关闭为止
RXDBUF[uart_i]=SBUF;//接收一个字节数据
uart_i++; //RXDBUF从0号元素不停往下存取数据
}
}
3.实验现象
我们先把串口调试助手的设置选项选好
打开串口之后,在输入框打上“好好学习,天天向上!”,点击发送,可以看到如下界面
我们在开发板上按下K4,把刚才接收到的字符串发送回来给电脑端显示出来
如果不断按K4,将没有显示新的内容,因为程序里一但把上次的数据发送给电脑端显示就清除掉这些数据了,我们接着不断按K4会有如下所示
只有再次发送内容,再按K4才会显示新的内容
c语言找到串口,再次熟悉串口相关推荐
- c语言串口通信_stm32 串口通信收发说明
很多网友在stm32 串口通信收发中,发现接收发送函数中,数据都是指针指向首字符的字符串中,下一步进行后续操作就非常吃力了.其实这是对C语言指针的不能熟练应用有关.指针是C语言的灵魂,也是最难的部分, ...
- 10 vm 添加串口_STM32的串口通信
在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...
- 最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)
第一篇:最简单DIY基于ESP32CAM的物联网相机系统①(用网页实现拍照图传) 第二篇:最简单DIY基于ESP32CAM的物联网相机系统②(在JAVAWEB服务器实现图片查看器) 第三篇:最简单DI ...
- STM32串口的使用(原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯)
参考:串口的结构体 重定向printf串口发送stm32等博文 作者:点灯小哥 发布时间: 2021-03-06 21:46:33 网址:https://blog.csdn.net/weixin_46 ...
- STM32 串口接收流程-串口接收中断
串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长. 编程USARTx_CR2的STOP位来定义停止位位数. 编程USARTx_BRR寄存器确定波特率. 使能USARTx_CR1的UE位 ...
- linux如何查看哪个串口是真实串口,哪个串口
1.使用ls -l ttyS*命令显示如下crw-rw----. 1 root dialout 4, 64 5月 17 02:24 /dev/ttyS0crw-rw----. 1 root dialo ...
- Ubuntu关于串口的操作(查看串口信息、串口助手、串口权限)
一.查看本机串口信息 1. 串口是否在使用 串口在 /dev 目录中,查看串口是否在使用,可以用命令 ls -l /dev/ttyUSB0 说明: ls -l:是查看目录的命令,直接用ls或ll也可以 ...
- STM32F7--->串口相关,串口的所有寄存器详讲
文章目录 串口相关寄存器 串口控制寄存器 CR1 CR2 CR3 波特率寄存器 BRR 保护时间和预分频寄存器 GTPR 接收超时寄存器 RTOR 请求寄存器 RQR 中断和状态寄存器 ...
- 2.3 基于FPGA的UART协议实现(一)串口信号定义和接线方法-5针串口-9针串口-全功能串口
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行通信之间加以转换.作为把并行输入信号 ...
最新文章
- IPsec ××× 配置實例
- vs2017中编译提示一些系统头文件没有找到
- 科研实习 | 牛津大学英仕曼量化金融研究院招收机器学习+金融访问学生
- Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
- Bootstrap模态框遮罩问题
- 前端学习(687):for循环执行流程
- 现有代码移植到Metro App
- AJAX请求时status返回状态明细表 readyState的五种状态
- 简单的路由封装ppp
- C——结构体中的函数指针
- python 期货策略_Python版商品期货跨期对冲策略
- 项目管理的前路怎么样?PMP证书作用如何?
- 一行.bat代码实现win+L锁定计算机立即锁屏
- javascript自动分号补齐带来的坑
- react--1.react环境搭建、JSX语法、注释、样式、列表渲染、定义单个组件、eact Props、react State
- js文件 格式_robots文件只能放在网站根目录吗?
- 号码归属地查询 核心平台 NGD
- 解决LS-DYNA中负体积方法
- 计算机网络——第二章(应用层)
- 无法搜出共享打印机的计算机名,Win10搜不到共享打印机怎么回事?Win10搜不到共享打印机的处理方法...
热门文章
- 力扣102. 二叉树的层序遍历(JavaScript)
- java mongo数据去重复_java – MongoSpark保存重复的密钥错误E11000
- 证券投资深度学习_安信证券:“深度学习”开启新一轮计算模式变革
- php mysql blob存储图片_php mysql blob存储图片
- python 编辑视频_python也能玩视频剪辑!moviepy操作记录总结
- ddr布线 pads_DDR SDRAM布线规则
- 跨域产生的原因和解决方法_针织面料染色折痕/产生的原因及解决方法
- string list 查找_手撕java集合源码——List篇
- mysql中文时间转换,MySQL 当中 日期 字符串 时间戳互转
- C语言do while语句