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

推荐阅读

欧洲最大的电子消费品展——柏林国际电子消费品展览会(以下简称“IFA”)落下帷幕。中外彩电厂商也是“八仙过海”,纷纷展示自己最新的电视产品,折射出互联网电视行业的新动态。最新数据显示,市场份额萎缩至10%,互联网电视市场仍然没有回暖。有的企业改名后继续推出新品来争夺市场,比如乐视;有的企业遭遇持续巨额亏损,比如暴风。这都标志着激烈竞争...
(图源:UNIST)据外媒报道,韩国蔚山国家科学技术研究院(UNIST)的研究人员,演示了一种新型无溶剂单锂离子导电共价有机骨架。这项研究由 UNIST能源和化学工程学院的教授Sang-Young Lee 和Sang Kyu Kwak共同领导。在研究过程中,研究小组展示“固体离子导体”的新概念,可以有选择性地使锂离子通过离子通道。由于它们是固体,而且能够有效地传输锂...
  2020年第三季度自动化(中国)有限公司新品【移动机器人HD-1500】即日起在中国市场首次对外发布,实现了重型货物运输的自动化。   这款的自动化移动机器人重型载荷能力为1500kg!更高的载荷能力可以令客户实现以前无法实现的自动化搬运,如栈板运输、总成搬运及其他重型货物和设备。   HD1500还可以替代叉车作业,从而较大程度降低人工作业风...
据韩媒报道,9月8日,三星显示器在首尔COEX举办的“Global Tech Korea 2021”会议上发表主题演讲,推出了13英寸可拉伸OLED显示屏。顾名思义,可拉伸OLED是一种可拉伸的显示器。显示屏可以根据显示内容进行三维拉伸。在三星显示器当天发布的操作视频中,可伸缩显示屏在表现三维效果方面表现出色。当用可拉伸的OLED来表现流动的熔岩图像时,屏幕会随着熔...

史海拾趣

问答坊 | AI 解惑

微型高效调频发射模块

1。调频发射模块FM1 19元一个          调频发射模块FM1的体积只有10X36X6毫米(其中高度仅指器件中的最高点),大小和小手指差不多,工作电压为3~8伏,最佳工作电压为6伏,对应的工作电流4~50毫安,发 ...…

查看全部问答∨

电子工业出版社“国外电子与通信教材系列 ”目录1

1、 应用Web和MATLAB的信号与系统基础(第二版) 作者:(美)Edward Kamen, Bonnie Heck, Ed Kamen 2、CMOS 射频集成电路设计(英文版) 作者:美Lee,T.H.著    3、MATLAB原理与工程应用 作者:(美)Edward B.Magrab    ...…

查看全部问答∨

step7 v5.3 的授权文件

解压到s7bin 文件夹下,运行下就可以用了. …

查看全部问答∨

现在千兆网都用什么方案?

来自EEWORLD合作群arm fpga linux 嵌入1(63762526) 群主:wangkj…

查看全部问答∨

K77键可编程键盘疑问

哪位高手用过 可编程键盘啊 我的是 K77键可编程键盘 这个东西怎么用,有什么用…

查看全部问答∨

powerpc体系结构

这是经典的powerpc体系结构的文档,传上来…

查看全部问答∨

【MSP430共享】基于继电保护装置相位控制的设计

结合继电保护装置对相住测试的需要, 介绍) ~ MS P 4 3 0 单片机产生多路可控制相位的正弦信号来模拟测试继电保护装置的实际动作。 该系统利用了MS P 4 3 0 单 片机的片内资源, 既简化了系统设计, 又提高了系统的可靠性。  [ 本帖最后由 ...…

查看全部问答∨

上拉电阻和下拉电阻问题

上拉电阻: 1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。 2、OC门电路必须加上拉电阻,才能使用。 3、为加大输出引脚的驱动能力, ...…

查看全部问答∨

学习完了,考试完成,查查成绩

昨中午加上今早上,学习总算完成,学习过程跟踪帖子: https://bbs.eeworld.com.cn/thread-355463-1-3.html 考试通过80分 继续努力! …

查看全部问答∨

F28027的ADC问题

1.我想问下ADCTRIG这个应该怎么使能?我没在ADC的头文件里找到这一位。具体附图。2.我想问下ADCINT·~9这9个位置都有什么区别,难道只是提供了九个中断? 3.我想问下INTSEL9N10这些位是干嘛的啊~ 拜托各位啦,我最近自己学这个真是好烦恼啊,唉唉 ...…

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

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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