Matlab 与stm32单片机之间的串口通信

Matlab 与stm32单片机之间的串口通信

在我们用stm32做信号处理时,我时常需要用到Matlab对我们采集的数据进行分析,拟合。按照传统的方法,我们一般都会先将数据通过串口助手打印出来,再导入Matlab。这样做会比较繁琐,我接下来要介绍的方法是stm32通过串口直接将数据导入matlab中并画图。
我们都知道,串口是一个字节一个字节发送的,但是我们用stm32采集数据时,一般都是浮点型数据,而浮点型是32位的,也就是4个字节,所以我们需要对我们的数据进行数据转换。对于单片机来说有一种很简单的数据转换法,那就是使用共同体。共用体有时也被称为联合或者联合体,共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

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

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

D_data.data=input[i];
HAL_UART_Transmit(&huart1,D_data.ComInfo.com, 4, 0xffff);

Matlab的代码

delete(instrfindall); %删除串口所有信息,方便下次使用  
s=serial('com8') %选择串口号  
set(s,'BaudRate',115200,'StopBits',1,'Parity','none');%设置波特率  停止位  校验位  
fopen(s);%打开串口
 fwrite(s,100,'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,500,-3,3]);%设置x,y轴坐标范围  
fclose(s) ;%关闭串口

stm32代码

for(int i=0;i<1000;i++)
{
	input[i]=sin(2*i*PI*5/1000);//正弦波信号
	
}
  while (1)
  {
		HAL_UART_Receive_IT(&huart1,(uint8_t*)aRxBuffer,1);// 串口持续接受信号
		if(aRxBuffer[0]==100)// 判断握手信号是否到来
		{
				for(int i=0;i<1000;i++)
	{
		D_data.data=input[i];//将数据赋给共同体
		HAL_UART_Transmit(&huart1,D_data.ComInfo.com, 4, 0xffff);//将4个字节发送出去
		HAL_Delay(5);
		
	}
  aRxBuffer[0]=1;// 清空标志位
		}

这是matlab接受到数据后画的图。
在这里插入图片描述你可以双击右上角的a查看你接受的数据。
在这里插入图片描述
在这里插入图片描述

如果你没有引用dsp库里的#include "arm_math.h"那么sin那里将会报错,你可以用其他数据代替,在matlab那里查看你的数据是否正确。还有你发送的数据个数要达到matlab接受的个数,不然matlab无法画图。

MatlabSTM32单片机之间可以通过串口进行通信。首先,需要在Matlab中使用serial函数来创建一个串口对象,并指定串口号。例如,可以使用以下代码创建一个串口对象s并指定串口号为COM7: s = serial('COM7'); 接下来,可以使用set函数来设置串口的参数,例如波特率、数据位、停止位等。例如,可以使用以下代码设置波特率为9600: set(s, 'BaudRate', 9600); 然后,可以使用fopen函数打开串口: fopen(s); 在STM32单片机的代码中,可以使用共用体来进行数据转换,将浮点型数据转换为字节流进行传输。例如,可以使用以下共用体定义: union { struct { uint8_t com\[4\]; } ComInfo; float data; } D_data; 在STM32单片机中,将需要传输的浮点型数据存储在D_data.data中,然后将D_data.ComInfo.com中的字节发送到串口。 在Matlab中,可以使用fread函数来读取串口接收到的数据。例如,可以使用以下代码读取一个浮点型数据: data = fread(s, 4, 'float'); 最后,可以使用fclose函数关闭串口: fclose(s); 通过以上步骤,就可以实现MatlabSTM32单片机之间串口通信。这样,你就可以在Matlab中对从STM32单片机接收到的数据进行分析、拟合等操作了。 #### 引用[.reference_title] - *1* [Matlabstm32单片机之间串口通信](https://blog.csdn.net/m0_46592310/article/details/119727959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [matlab串口接收数据学习之与STM32通信](https://blog.csdn.net/minglan123/article/details/115425727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Matlabstm32单片机之间串口通信项目实战](https://blog.csdn.net/weixin_44850779/article/details/127609719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值