matlab与stm32之间利用串口通信记录

发布者:悠闲自在最新更新时间:2018-09-09 来源: eefocus关键字:matlab  stm32  串口通信 手机看文章 扫描二维码
随时随地手机看文章

1、涉及到的函数


serial,fopen,fclose,

instrfindall,instrhwinfo,

fprintf,fscanf,fwrite,fread,isempty


1.1 串口函数


scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte'); 

fopen(scom); 

.

fclose(scom);


或者对串口属性单独设置,如下:


scom = serial(com);  

scom.BaudRate = 115200;

scom.InputBufferSize = 512;

scom.BytesAvailableFcnMode = 'terminator';  % 'byte'

scom.terminator = CR/LF ;

scom.Timeout = 50; %read or write wait time

fopen(scom);

.

fclose(scom);


通常会在关闭串口后删除串口,在matlab工作空间中清除串口数据:


delete(scom);

clear scom;


问题1.:matlab刚打开后,第一次可以成功打开串口,第二次再打开就会报错如下:


>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');

>> fopen(scom)

Error using serial/fopen (line 72)

Open failed: Port: COM6 is not

available. Available ports: COM1.

Use INSTRFIND to determine if other

instrument objects are connected to the

requested device.


处理方法:个人理解是关闭串口后,串口并没有被完全清理,就像有些软件卸载后第二次再安装就会失败,所以需要在重新打开串口之前删除之前对串口的所有设置,如下:


>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');

>> fopen(scom);

Error using serial/fopen (line 72)

Open failed: Port: COM6 is not

available. Available ports: COM1.

Use INSTRFIND to determine if other

instrument objects are connected to the

requested device.


>> delete(instrfindall('Type','serial'));

>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');

>> fopen(scom);

>> fclose(scom)


>> help instrfindall

 instrfindall Find all communication interface objects with specified

 property values.


instrfindall函数可以找出所有与matlab通信的接口,也可以找出符合特定参数的接口。


1.2 serial 参数理解 

通过>> s=get(scom) 可以过得串口的所有参数以及当前的值,其中主要设置的有:


BaudRate,波特率

ByteOrder,数据大端或者小端模式,默认小段

DataBits,数据位,通常默认8位

Parity,校验位,默认none

StopBits,停止位,默认1

Timeout,matlab串口发送或者读取数据等待时长

ReadAsyncMode,异步读取数据的方式,连续或者手动,默认连续continue


----------

BytesAvailableFcnMode

BytesAvailableFcnCount

BytesAvailableFcn

Terminator

BytesAvailable

表示数据有效的触发方式,相当于c中的中断触发事件:默认值terminator,表示串口接收到特定的终止符时,触发bytes-available event,参数自动加一,并进入由指向的回调函数,相当于c中的中断函数;可选值byte,表示串口收到一个字节时,触发bytes-available event,自动加一,当收到

个字节时进入回调函数。

终止符通常是回车或者换行符,也可以自己设定,根据通信协议自定义,[Windows、Linux和MAC的CR, LF, CR/LF换行符](http://blog.csdn.net/cckit/article/details/41604771)。


matlab搜索可用串口端口函数instrhwinfo :


>> info = instrhwinfo('serial')

info = 

  HardwareInfo with properties:

     AvailableSerialPorts: {2x1 cell}

           JarFileVersion: 'Version 3.7'

    ObjectConstructorName: {2x1 cell}

              SerialPorts: {2x1 cell}

Access to your hardware may be provided by a support package. Go to the Support Package Installer to learn more.


>> info.SerialPorts

ans = 

    'COM1'

    'COM6'

>> info.AvailableSerialPorts

ans = 

    'COM1'

    'COM6'

>> str = char(info.SerialPorts(2))

str =

COM6

>> scom=serial(str);


我在电脑设备管理器查看,用的是串口’COM6’, ‘COM1’还不知道时接的是什么,所以这里想用matlab自动选择串口的功能还没有实现。


1.3 数据读写函数


matlab:

fprintf(scom,'%d\n', data,'async' );

data = fscanf(scom,'%d');

c:

scanf("%d",&data);

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


note1:c中scanf、printf函数默认从终端打印读取数据,这里需要重定向fputc、fgetc函数。 

note2:c中scanf函数在读取到有效数据前会一直运行不退出。


问题2:在stm32的串口中断函数中调用scanf函数,读取matlab发送的数据,matlab中用fprintf(scom,’%d\r\n’, data,’async’ )发送数据,当stm32进入中断读取数据后,总是会再次进入中断并进入scanf函数出不来。 

处理方法:matlab中发送数据的格式 '%d\r\n',即回车加换行,个人理解是串口发送完一字节后也把'\r'即 回车符也发送出去,所以stm32的串口接收缓存中scanf函数读取数据后,由回车符又引起接收中断。 

将matlab发送函数中数据格式改为'%d\n' 后,stm32可以正常读取数据。


matlab:

fwrite(scom,data,'uint8','async');

cmd_ack = fread(scom,1,'uint8');

c:

rec = USART_ReceiveData( DEBUG_USART );

Usart_SendByte(DEBUG_USART,data);


note1:fwrite和fread是以二进制的格式发送数据,而上面的fprintf和fscanf是以ASCII码的格式发送。 

例如:data为十进制数123,其十六进制为0x7b,底层二进制数据流就是0111 1011,以ASCII码发送是0x31,0x32,0x33,底层数据流是0011 0001,0011 0010,0011 0011。 

matlab如果用fwrite和fread函数,串口参数也要改为byte。


关键字:matlab  stm32  串口通信 引用地址:matlab与stm32之间利用串口通信记录

上一篇:STM32组合设备实现USB转双串口
下一篇:STM32串口通信(基于缓冲区)编程及遇到的问题总结

推荐阅读最新更新时间:2024-03-16 16:13

STM32学习之GPIO详解
GPIO: STM32 的(64引脚的)IO口一共有3个,分别是PA、PB、PC. STM32 的IO端口可以由软件配置成8种模式: 1,输入浮空 2,输入上拉 3,输入下拉 4,模拟输入 5,开漏输出 6,推挽输出 7,推挽复用功能 8,开漏复用功能 STM32 的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。 注意(在配置 ST
[单片机]
stm32 usart奇偶校验如何配置
stm32 usart奇偶校验如何配置?或许你在stm32 usart奇偶校验过程中会遇到如下一些坑,stm32 usart偶校验错误标志位以及出现偶校验错误,奇偶校验位包含在数据位中等等这些可能是你将错误的数据放到DR寄存器中导致的。 在一般情况下,stm32 usart奇偶校验无校验位时,数据位常用8位,当使用就校验位时,数据位应设置为9位。stm32 usart奇偶校验配置方法主要有以下几种: stm32 usart奇偶校验如何配置?如果stm32 usart开启奇偶校验,应在读取数据寄存器时先查看标志位,或者及时进行应用逻辑代码处理,以免发生校验错误标志则丢弃数据等情况出现造成不必要的损失。
[单片机]
<font color='red'>stm32</font> usart奇偶校验如何配置
一步步写STM32 OS【二】环境搭建
一、安装IAR for ARM6.5 二、新建工程 1、选择处理器:STM32F407VG,暂不使用FPU 2、必要的路径配置和宏定义 3、使用SWO重定向IO输出 4、使用ST-LINK仿真器 5、下载配置 6、设置CPU频率,防止SWO输出乱码 三、代码调试 四、工程下载 stepbystep_stm32_os_template.rar
[单片机]
一步步写<font color='red'>STM32</font> OS【二】环境搭建
基于ZigBee和STM32的智能家居控制系统的设计与实现(五)--终结
##基于ZigBee和STM32的智能家居控制系统的设计与实现(五)–终结篇 ###说明 首先祝贺自己顺利的完成了毕业答辩工作,想起整个过程还是挺让自己感动的。最后还被评为优秀毕业设计,虽然并没有什么luan用,但是,马上毕业了,还是挺让人怀念的。整个资料从第一篇博客说起就说会全部开源的,期间承蒙各位朋友的支持,给与资助,在此感谢了。虽然资料中私人信息删除了一些,但是不免有疏漏,所以有关个人信息还挺各位删除掉,小弟在此谢谢了! ###总结 下面简单介绍下系统使用到的一些资料和系统实现的功能。 开发系统:Windows10 64位 Ubuntu 14.04 32 位 软件版本:Qt 4.8.6 IAR .0 Altium Des
[单片机]
基于ZigBee和<font color='red'>STM32</font>的智能家居控制系统的设计与实现(五)--终结
基于STM32定时器实现毫秒延时函数
STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当中的基本定时器,作为初学者,先从最基本的学起最容易,下面我们用这个定时器实现毫秒延时函数来入门STM32定时器的应用。 学习单片机,就是学习使用它的寄存器。即便你用库函数,寄存器也是必须要学习的。 TIM6 TIM7的寄存器如下所示: 先略览一下寄存器,CR1和CR1是控制寄存器,SR是状态寄存器,ARR就是溢出值寄存器,CNT就是计数器的当前值,PSC是预分频寄存器。预分频寄存器?听的傻眼了吧,前面几个个寄存器听的还能理解,一听到预分频寄存器,好像不知道是干嘛用的。瑞生来给你解释一下吧,你可以给预分频寄存器里面写一个从0~6
[单片机]
基于<font color='red'>STM32</font>定时器实现毫秒延时函数
stm32按键的检测(EXTI和Polling两种方式)
XTI Mode时,只要别漏下面这两行基本是没问题了. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 复用时钟使能 */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); /* 选择GPIO管脚用作外部中断线路 */ #include #include #define EXTI_Trigger_Mode #define KEY_RCC RCC_APB2Periph_GPIOB #define KEY_GPIO GPIOB #define KEY_PIN (GPIO_Pi
[单片机]
STM32的启动方式及串口下程序
STM32通过BOOT0和BOOT1两个引脚的高低电平选择STM32的启动方式,而不同的启动方式对应内置的程序存储介质不同。所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。 1)BOOT1=x BOOT0=0,从用户闪存启动。用户闪存 = 芯片内置的Flash。一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序,这是正常的工作模式。 2)BOOT1=1 BOOT0=1,从内置SRAM启动。SRAM = 芯片内置的RAM区(即内存),没有程序存储的能力,程序掉电
[单片机]
<font color='red'>STM32</font>的启动方式及串口下程序
嵌入式系统中串口通信帧的同步方法
引 言 串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中.中断服务子程序在系统运行过程中占用了较多的时间,就有可能在中断眼务子程序正运行时,又产生一个同类型或其他类型的中断,从而造成主程序得不到执行或后续中断数据丢失。所以,嵌入式系统中的串口通信虽然看似简单,但其中仍有许多问题值得研究,例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、基于FIFO队列和基于状态机的
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved