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。

记录时间:2017.12.10 晚

matlab+stm32通讯,matlab与stm32之间利用串口通信记录相关推荐

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

    Matlab 与stm32单片机之间的串口通信 在我们用stm32做信号处理时,我时常需要用到Matlab对我们采集的数据进行分析,拟合.按照传统的方法,我们一般都会先将数据通过串口助手打印出来,再导 ...

  2. 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信

    目录 (一)前期软件准备和硬件准备 ( 二 ) 实现的思路和操作原理 ( 三) 具体的操作方法 MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直 ...

  3. 【嵌入式小白学习】--在STM32开发板上实现简单的串口通信

    嵌入式小白学习--在STM32开发板上实现简单的串口通信 这里写目录标题 嵌入式小白学习--在STM32开发板上实现简单的串口通信 Part1. STM32环境的搭建 Part2. 编写代码 Part ...

  4. 树莓派与电脑之间的串口通信编程

    树莓派与电脑之间的串口通信编程 数据通信的三个方式介绍 单工通信 半双工通信 全双工通信 串口通信 编程步骤 数据通信的三个方式介绍 单工通信 只支持数据在一个方向上传输,又称为单向通信.如无线电广播 ...

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

    前言 当我们用STM32做一些DSP运算时(比如傅里叶变化,小波变换,卡尔曼滤波等算法),我们想知道自己所码出来的程序是不是按照自己预期的运算结果来或者说检验程序的鲁棒性,那我们就需要检验每个关键步骤 ...

  6. STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-

    记录项目的详细制作过程,所以笔记很长,图很多.很多图不好CSDN搬运, 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接:https://pan.baidu.com/s/1Mk2EVIha7F ...

  7. 【STM32】基于STM32F407中断方式实现串口通信

    目录 一.中断介绍 二.中断方式实现串口通信 1. 新建工程 2. 工程设置 3.代码编写 4. 烧录验证 三.总结 四.参考 一.中断介绍 具体介绍参考文章: [STM32]基于STM32F407的 ...

  8. 电脑之间利用串口传文件

    一.实验目的 串口传输文件的练习.将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接.然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片.视频和压缩包软件 ...

  9. PC和Android模拟器之间虚拟串口通信

    前言 很多时候我们在做串口通信的时候需要去模拟串口来调试,这样可以极大的方便我们的工作,不然的话可能需要连接硬件设备,比较麻烦.一般情况下我们先在电脑上模拟串口后初步调试,最后阶段在硬件设备上实际调试 ...

最新文章

  1. 请输入课程编号C语言,C语言 学生选课系统 程序
  2. qml基础学习 基础概念
  3. iOS APP配置HTTPS流程
  4. Fiddler 跟踪数据包
  5. puppy linux不识别鼠标,不止于OS X!还有适用于Mac的八款替代操作系统
  6. Fastdata极数:2021年中国互联网基金投资用户报告
  7. 两款高大尚广告GO跳转页PHP源码
  8. OpenShift-介绍
  9. devops 解决了啥问题_您的DevOps有什么问题?
  10. 17.立体匹配——介绍,匹配,寻找最佳匹配 Matlab实战_1
  11. html5shiv.js css3,Modernizr, html5shiv, ie7.js, and CSS3 Pie. Which to use and when?
  12. php设计模式之责任链模式
  13. 怎么退出mysql_如何安全地关闭MySQL
  14. 自然语言处理怎么最快入门
  15. PLC编程语言汇总,留言告诉我你会哪一个?
  16. 周鸿祎麻辣点评中国互联网公司
  17. android 键盘 横屏 边框,Android横屏时软键盘全屏问题
  18. nginx做反向代理网站加载验证码图片不出来
  19. QQ空间g_tk加密算法实现原理研究
  20. 狂神说笔记——Java SE基础01

热门文章

  1. 中文电子病例命名实体识别项目
  2. 05.MyBtais两种取值符号以及输入参数和输出参数
  3. 今天pycharm不能正常使用了
  4. GLSL中 Billboard和Point的顶点空间变换
  5. Sqring核心概念
  6. ubuntu 上已经安装libxml2还提示需要reinstall的解决方法
  7. hdu 1241 Oil Deposits 解题报告
  8. 计算机网络(十九)-IEEE802.11无线局域网
  9. Unity3D-声音系统
  10. Unity-游戏小地图实战(前述知识点回顾与运用)