将串口接收的数据绘制成波形图(使用matlab或Visual Scope)

2023-05-16

一、 串口通信配置

结合stm32固件库(或其它类型单片机)中usart相关的函数,配置好串口通信的寄存器,确定(数据位、停止位、波特率等等),本文主要介绍两种方法将采集到的串口数据绘制成波形图。

二、所需软件(二选一即可)

  • Visual Scope
  • Matlab
    二选一即可,推荐用Matlab

效果图:
Visual Scope读取串口数据得到连续波形图
Visual Scope读取串口数据得到连续波形图

Matlab读取串口数据得到连续波形图
Matlab读取串口数据得到连续波形图

三、具体步骤

1. 利用Visual Scope绘制波形

在keil中加入 Visual_Scope.c如下,使其符合Visual Scope软件的通信协议

#include "visual_scope.h"

uint16_t OutData[4]={0}; 	//存放待输出的四组数据

unsigned short CRC_CHECK(unsigned char *Buf,unsigned char CRC_CNT)
{
	unsigned short CRC_Temp;//16bit
	unsigned char i,j;
	CRC_Temp = 0xffff;
	for(i = 0;i < CRC_CNT;i++)
	{
		CRC_Temp ^= Buf[i];
		for(j = 0;j < 8;j++)
		{
			if(CRC_Temp & 0x01)
				CRC_Temp = (CRC_Temp>>1)^0xa001;
			else 
				CRC_Temp = CRC_Temp >>1;
		}
	}
	return CRC_Temp;
}

void OutPut_Data()
{
	int temp[4] = {0};
	unsigned int temp1[4] = {0};
	unsigned char databuf[10] = {0};	//The buf of 4 outputdata(low 8 bit + high 8 bit) + 2 check bit(low+high)
	unsigned char i;
	unsigned short CRC16 = 0;	//check data,depending on the outputdata

	for(i = 0;i < 4;i++)
	{
		temp[i] = (int)OutData[i];
		temp1[i] = (unsigned int)temp[i];
	}
	for(i = 0;i < 4;i++)
	{
		databuf[i*2] = (unsigned char)(temp1[i]%256);
		databuf[i*2+1] = (unsigned char)(temp1[i]/256);
	}
	CRC16 = CRC_CHECK(databuf,8);	//get check code 
	databuf[8] = CRC16%256;
	databuf[9] = CRC16/256;

    for(i = 0;i < 10;i++)
        Usart_SendByte(DEBUG_USARTx, databuf[i]);//use usart to send data to upper monitor
		
}

void display()	 //示波,将要发送的数据放到数组后,调用该函数发送数据
{
	#if 1
	OutData[0] = 50;
	OutData[1] = 1000;
	OutData[2] = 0;
	OutPut_Data();
	#endif

	#if 0
	OutData[0] = 0;
	OutData[1] = 0;
	OutData[2] = 0;
	OutPut_Data();
	#endif
}

在VisualScope里设置好参数后,有如下结果:

优点: 用VisualScope示波能比较直观地反映数据的变化情况

缺点: 仅取数值的整数部分绘制波形,无法进一步对波形进行分析(虽然有保存为matlab分析的文件选项,但好像没有办法在matlab中使用)

2. 利用Matlab绘制波形

为了能够对读取到的数据波形进行分析(如频谱分析),可直接使用matlab与stm32进行串口通信,使用时与Visual Scope类似,同样需要在matlab中先配置好串口通信的相关参数,使PC能够与stm32通信。

在matlab中创建Serial.m,并编写以下函数
matlab的串口配置同样可以设置中断来对接收数据进行处理(绘图),因此以下包括了串口配置函数和中断响应函数

function Serial()   %创建函数
delete(instrfindall);   %先关闭串口,否则可能导致出错

global x            %全局变量,供串口中断函数使用

global t;			%全局变量,这里根据需要绘制图形的个人需要而设
global m;
global i;

t = [0];      %时间轴
m = [0];      %数据轴
i = 0;        %用于计数

p = plot(t,m);
axis([i-50 i+50 -1 10]);
grid on;

%%----------------------------配置部分----------------------------

%创建串口对象,直接在命令框输入serial('com1')可查看串口参数
x = serial('com1');
%设置或修改串口通信参数
set(x,'BaudRate',115200);

%设置中断触发方式

set(x,'BytesAvailableFcnMode','Terminator') %ASCII触发,字符触发
set(x,'Terminator','CR/LF')         %接收到\r\n后触发中断

% set(x,'BytesAvailableFcnMode','byte')     %数据触发,根据发送来的数据长度来触发中断
% set(x,'BytesAvailableFcnCount',1)


x.BytesAvailableFcn = @Callback  %定义中断响应函数对象,类似于中断函数名

fopen(x);                %打开串口,类似于开关

fwrite(x,255); 	  %发送握手信号0xff,stm32接收到后开始回传数据
pause           	  %需要暂停,来接收回传数据
     
fclose(x);

end

function Callback(obj,event)   %创建中断服务函数,绘制图像

global t; %时间
global m; %纵坐标
global i; %时间变化值


    disp('I receive!')
    out = fscanf(obj);
    data = str2num(out)	%将接收到的字符转换为数值
     
     %%----------------------以下根据需要自行编写-------------------------------
    t = [t i];							
    m = [m data];
    plot(t,m)
    xlabel('t');
    ylabel('data');
    axis([i-50 i+50 0 100]);
    grid on;
    
    i=i+1;

end

stm32中的代码:
只需在适合的地方用 printf 就好,数据可以是整型也可以是浮点型,注意加上\r\n来触发中断喔!

printf("%f \r\n",data); 

优点: 通信方便,能将读取的数据存入matlab数组中,方便后续分析

缺点: 绘图时需要动态变换横坐标,来实现动态画图(图像滑动)

四、总结

本文介绍了两种将离散的串口数据绘制成连续波形图的方法供大家参考,它们也有着各自明显的优缺点。

Visual Scope:

优点: 能比较直观地反映数据的变化情况

缺点: 仅取数值的整数部分绘制波形,无法进一步对波形进行分析

Matlab:

优点: 能将读取的数据存入matlab数组中,方便后续分析

缺点: 绘图时需要动态变换横坐标,来实现动态画图

五、参考资料

更详细的matlab串口通信使用教程:

https://chuanke.baidu.com/v7399031-233850-1738542.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将串口接收的数据绘制成波形图(使用matlab或Visual Scope) 的相关文章

  • Arduino结构体变量使用

    Arduino结构体变量使用 x1f4dd 示例程序 span class token comment 本文使用arduino nano span span class token comment 声明 B span span class
  • 51单片机自定义串口通讯协议控制流水灯+Proteus仿真

    51单片机自定义串口通讯协议控制流水灯 Proteus仿真 Proteus仿真演示 注意不要使用Proteus 8 Professional 8 13版本串口通信会出错 需要利用虚拟串口工具提前创建2个虚拟串口 Proteus里面AT89C
  • Arduino struct结构体定义和使用方法详解

    Arduino struct结构体定义和使用方法 1 直接使用struct定义 示例 span class token keyword struct span span class token class name People span
  • 锂电池基于DW01组成的过充电、过放、短路保护电路

    锂电池基于DW01组成的过充电 过放 短路保护电路 原理图 该电路主要由锂电池保护专用集成电路 xff24 xff37 xff10 xff11 xff0c 充 放电控制MOSFET xff08 内含两只 xff2e 沟道 xff2d xff
  • STM32F103基于标准库开发串口中断接收数据环形队列例程

    STM32F103基于标准库开发串口中断接收数据环形队列例程 本示例源码来源于野火 STM32库开发实战指南 xff0c 是一个值得学习借鉴的资源 x1f4d1 一个完整的串口数据包通讯协议一般包含 xff1a 帧头 地址信息 数据类型 数
  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据 申明 xff1a 本文章仅发表在CSDN网站 xff0c 任何其他网见此内容均为盗链和爬取 xff0c 请多多尊重和支持原创 x1f341 对于文中所提供的相关资源
  • idea重构手法

    idea重构手法 四键齐发 xff1a ctrl 43 alt 43 shift 43 T 修改方法名 xff1a shift 43 F6修改方法参数 xff1a Ctrl 43 F6提取常量 xff1a Ctrl 43 Alt 43 C提
  • Linux下实现http的Get方法

    Linux如何实现http的GET数据方法 下载curl库源码 https curl se download html Linux编译 make拷贝库文件 xff0c 目录 curl 7 83 0 lib libs 下 libcurl so
  • 一篇关于GPS定位写得最详实清晰的文章之一

    一篇关于GPS定位写得最详实清晰的文章之一 介绍篇 过去 xff0c 如果你的女友是个路痴 xff0c 大概会有这样的对话 你在哪儿呢 xff1f 啊 xff1f 我在马路上啊 有什么特征 xff1f 头顶有个月亮 你旁边有什么啊 xff1
  • 基于HAL库STM32串口驱动不定长数据接收

    STM32串口驱动不定长数据接收带环形缓冲区 最新框架代码使用方法源码串口接口文件环形缓冲区接口文件 移植图示 使用涉及4个文件 xff0c UART Port c UART Port h CircularQueue h CircularQ
  • OptiTrack---Motive简单使用导出groundtruth

    文章目录 Motive介绍1 详细介绍 Motive使用1 详细使用2 简单使用导出groundtruth 1 首先安装Motive 2 启动Motive 3 建立body xff0c 进行录制 4 对结果进行保存 Motive介绍 1 详
  • 使用U盘安装Ubuntu20.04

    背景 今天自己鼓捣小电脑 xff0c 卖家发过来的时候已经按要求预装了Ubuntu20 04 xff0c 我想改一下卖家起的用户名 也许是计算机名 xff0c 分不太清 xff0c 结果搞的电脑输入密码却进不了桌面 xff0c 最终决定重装
  • 【ROS基础】rviz打开后如何显示实时2D地图

    1 背景 launch 了一个建图程序 xff0c 并打开了 rviz xff0c rviz 中也 add 了 map xff0c 但是 rviz 中并未出现期望的2D地图 xff0c 让人很是手足无措 2 问题解决 百度了才发现自己使用的
  • RTKlib源码解析:ppp和rtkpost中的周跳检测函数

    文章目录 前言detslp mwdetslp gfdetslp lldetslp dop 欢迎关注个人公众号 xff1a 导航员学习札记 前言 本文解析了RTKlib ppp c中两个周跳检测函数detslp mw和detslp gf xf
  • RTKlib相对定位源码解析:resamb_LAMBDA (整周模糊度求解)

    本文对resamb LAMBDA函数 xff0c 以及其中的ddmat restamb函数进行了解析 由于其中的lambda函数在参考论文中都给出了详细推导和计算步骤 xff0c 因此没有解析 lambda函数参考论文 xff1a 1 P
  • RTKlib PPP代码解析

    文章目录 ppposudstate pppudbias pppcorr measppp res 欢迎关注个人公众号 xff1a 导航员学习札记 我所基于的代码版本是RTKlib 2 4 3的一个拓展版本RTKexplore Demo5 xf
  • Android 动态修改SeekBar滑块和进度条的颜色

    方法一 1 需求 xff1a 需要改变其默认颜色 xff0c 样式 2 滑竿样式 seekbar xml lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt layer lis
  • GNSS定位(SPP、RTK、PPP)位置坐标系

    欢迎关注个人公众号 xff1a 导航员学习札记 文章目录 一 前言二 单点定位三 差分定位四 PPP 一 前言 最近研究不同FTP的基站数据 xff0c 发现它们坐标系都不一致 xff0c 因此研究了下GNSS定位结果的坐标系 参考了一些文
  • detrend去趋势函数的Matlab、Python与C实现

    文章目录 趋势分量对频域分析的影响detrend去趋势函数 xff08 Matlab Python xff09 detrend的C语言实现 趋势分量对频域分析的影响 在对信号做频域分析时 xff0c 如果有趋势项的存在 xff0c 会对分析
  • AHRS互补滤波(Mahony)算法及开源代码

    文章目录 一 前言二 算法流程三 算法步骤四 算法难点五 开源源码参考文献 欢迎关注个人公众号 xff1a 导航员学习札记 一 前言 AHRS Attitude and heading reference system xff0c 也就是航

随机推荐