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串口通信(基于缓冲区)编程及遇到的问题总结

推荐阅读

上周,调研机构JPR发布了2018年第二季度GPU总出货量的更新数据。 数据显示加密货币热潮已结束,桌面GPU出货量比环比下降27.96%。与英伟达下降7.49%相比,AMD出货量大幅下降,达到12.28%。相比之下,英特尔又抢下3%的市场份额。在加密货币繁荣时期,AMD被认为击败英伟达成为首选解决方案提供商,其GPU价格上涨幅度较大,因此第二季度AMD出货量大幅...
据悉,浙江智昌机器人集团是由国家首批“****”特聘专家甘中学博士创办的以智能制造技术为核心的专业化服务商,始终致力于发展具有自主知识产权的机器人产品。随着信息技术高速发展,5G“超高速率、超低时延、超大连接”的特点,非常契合新一代机器人需求。宁波移动作为全市规模最大的电信运营商,打造了一批5G应用创新成果走在全国前列。本次宁波移动积极...
随着电子技术的快速发展,通信信号频率越来越高,信号质量要求也越来越严。测量这些高速信号是不是只要选一个昂贵的示波器就行了呢?其实不然,如果一些细节没有被注意,再贵的示波器也不见得测得准! 一、带宽选择测量高速信号,首先要考虑测试系统的带宽,这个测试系统的带宽包括探头的带宽和示波器的带宽。要测量 100MHz 的信号,用一个 100MHz 带...
用于高效能电源应用:儒卓力提供基美电子的KONNEKT™系列高效能陶瓷电容器目标远大: 基美电子(KEMET)的KONNEKT™技术是高密度的封装技术,可以在不使用金属框架的情况下实现组件互连,从而降低电容器的 ESR、ESL和热阻。这项技术使用创新的瞬态液相烧结(TLPS) 材料来创建表面贴装多芯片解C0G KONNEKT电容器也称作采用 KONNEKT 技术的 KC-Link电容...

史海拾趣

问答坊 | AI 解惑

指纹识别传感器的应用

单触型传感器与划擦型传感器是两种新型固态指纹传感器,都是通过在触摸过程中电容的变化来进行信息采集。本文对两类传感器的工作原理和特点进行了详细分析,并介绍在互联网安全认证、汽车无钥匙进入系统等的应用。   前市场上有两种固态指纹传 ...…

查看全部问答∨

如何修改messagebox函数的外观

感觉WinCE5.0中默认的MessageBox()输出的对话框,比较难看,有没有办法修改一下外观,主要是想改变一下背景颜色与字体。谢谢!…

查看全部问答∨

VHDL中的process,有一个很疑惑的地方

对于process,有一个很疑惑的地方。 书上说,仿真器对进程中的各语句自上至下地进行处理。当进程所有语句执行完毕,或者中途碰到WAIT语句时,该进程执行结束,信号代入过程最后被执行。代入同样应该按顺序自上至下地执行。 接着给出来一个这样的 ...…

查看全部问答∨

evc安装出现死机,求大虾帮忙

我的机子装不了eVC4,在配置wince platform manager 4.0 时,就死机了 重启后就出现未识别的硬件和硬件安装向导,只要安装也就卡机了 这是怎么回事?和硬件有关吗》怎么解决?急 请高手帮忙 …

查看全部问答∨

请问一下 能用一个程序分析出两张照片中是否有同一个人吗?

请问一下 能用一个程序分析出两张照片中是否有同一个人吗? 要是能的话是不是就可以利用一个单片机来实现人脸识别的开发啊 ?…

查看全部问答∨

底层开发很有趣,很高尚,菜鸟努力学习UC-OSII中

如题,如果早一点有人和我说,底层偏硬开发更有研究,更深奥,我就不会走这么多弯路了。…

查看全部问答∨

无线点餐系统方案

我们参加学校的科技立项 打算做个无线点餐系统 当然是比较简化的了 只要服务员手上一个设备把信息传到厨房 只是目前还没有个具体方案 大家帮帮忙啊 看都需要什么芯片 能提供个电路图的最好 越详细越好啊 谢谢了…

查看全部问答∨

请问一下 有从事嵌入式开发的吗? 2410的

我最近开始学习s3c 2410的数据手册 但是是英文的,翻译起来有点痛苦,翻译不正确就更加得不偿失了. 想问问大家是否有 2410的中文版的 数据手册. 如果有的话能否共享一份给我? 谢谢~~~ 赵辉…

查看全部问答∨

关于startup.asm的问题?这段代码的功用?怎么有时不用也行?何时一定需要?

小弟这几天在Keil C51环境下做些小case。 发现带void main(void)的代码可以直接编译、链接生成hex,一般在main的开始也调用自己编的对板上MCU内部RAM、串口、LCD等资源的初始化工作,看keil提供的模版startup.asm,也只是清0上述几个资源,于是不 ...…

查看全部问答∨

初学arm开发问题

本人想学习arm开发,请问各位开始学习买什么样的开发板比较好,需不需要买仿真器?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved