Matlab 与stm32单片机之间的串口通信项目实战

前言

当我们用STM32做一些DSP运算时(比如傅里叶变化,小波变换,卡尔曼滤波等算法),我们想知道自己所码出来的程序是不是按照自己预期的运算结果来或者说检验程序的鲁棒性,那我们就需要检验每个关键步骤和最终的运行结果。而matlab是一个很好的算法仿真工具。我们只需要在matlab中编写出想在单片机实现的算法程序,然后将STM32运行后的结果也导入到matlab中,然后subplot一下两者,就可以拟合曲线是不是你预期的了,如果不是,那就可以继续修改STM32代码调参了。下面我就讲讲如何实现两者串口通信的代码。

正文

一、STM32部分(stm32f407)

先上主代码:

for(int i=0;i<1000;i++)
{
      input[i]=sin(i*3.14*2/100);//正弦波信号
//	  input[i] = (float)(i);
	
}
while(1){
		while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
				if(USART_ReceiveData(USART1)==10)// 判断握手信号是否到来
		{		delay_ms(10);
				for(int i=0;i<1000;i++)
	{
		D_data.data=input[i];//将数据赋给共同体
		UART1_Send_float(D_data.com);//将4个字节发送出去
//			printf("第%d个\r\n",i);

	}		
		}
	}

再讲知识点:
1.握手信号
一般用于指示串口是否处于忙线状态,这里是为了能让matlab能接收到完整的数据。

2.联合体
我们都知道,串口是一个字节一个字节发送的,但stm32的DSP运算结果一般都是浮点型数据,而浮点型是32位的,也就是4个字节,所以我们需要对我们的数据进行数据转换。对于单片机来说有一种很简单的数据转换法,那就是使用共同体。共用体有时也被称为联合或者联合体,共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

	union
{
 
  uint8_t com[4];
	float data;
	
}D_data;

所以你只要把数据赋给data,再把com发送出去就行了。

		D_data.data=input[i];//将数据赋给共同体
		UART1_Send_float(D_data.com);//将4个字节发送出去

二、matlab部分
先上主代码:

close all
clear all

delete(instrfindall);
s=serial('com5') %选择串口号
set(s,'BaudRate',115200,'StopBits',1,'Parity','none');%设置波特率  停止位  校验位 
fopen(s);%打开串口
 fwrite(s,10,'uint8');%向单片机发送握手信号 
for i = 1:1000 %循环读取 ,1000个数据
  out=fread(s,4,'uint8');%读取 数据个数 与 类型  
   a(i)=typecast(fliplr(uint8([out(4) out(3) out(2) out(1)])), 'single'); %48位整形和成一个浮点型
  pause(0.01);%延时一小段时间,放在接受过快,数据丢失 
  i=i+1;
end
plot(a);%画图
hold on;%使下次画的图不被覆盖,方便与上次图形进行对比
axis([0,1000,-3,3]);%设置x,y轴坐标范围  
fclose(s) ;%关闭串口

再讲知识点:
1.delete (instrfindall) : 删除所有串口信息,在程序结束后没有删除串口信息,可能会导致串口被占用,下一次程序无法使用串口或者其他软件无法使用串口
2.fliplr:将数组从左向右翻转。
3.typecast(X,type) :在不更改基础数据的情况下转换数据类型。”single“是转换成单精度浮点数类型。这里是将STM32从浮点数拆分发送 的4 个字节重新组合还原成原来的浮点数。

三、通讯结果
matlab接收到数据后生成的图形
在这里插入图片描述
查看接收到的数据
在这里插入图片描述
文章到此为止,有疑问的可以评论区留言,我看到就会回复。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44850779

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值