历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2018年09月09日 | matlab与stm32之间利用串口通信记录

2018-09-09 来源:eefocus

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。


推荐阅读

史海拾趣

Euvis Inc公司的发展小趣事

Euvis Inc公司自成立以来,始终将技术创新作为发展的核心动力。公司投入大量研发资源,成功开发出一款具有革命性意义的新型半导体材料,该材料具有更高的导电性能和更低的能耗,极大地提升了电子产品的性能。随着这款材料的广泛应用,Euvis Inc公司在半导体材料市场迅速崛起,成为行业内的领军企业。

Gauthier Connectique公司的发展小趣事
使用红外线遥控器对电路进行信号测试。观察电路是否能够准确接收并响应遥控器发出的指令。如有问题,需检查电路连接、元器件性能等是否存在问题。
Extech公司的发展小趣事

1994年,Extech公司推出了国内第一套基于“AutoCAD FOR WINDOWS”的XTMCAD软件,这一创新举措标志着公司在CAD领域迈出了坚实的步伐。XTMCAD软件凭借其先进的技术和易用性,迅速获得了市场的认可,并在同年荣获了国家教委科技进步一等奖。这一荣誉不仅是对Extech公司技术实力的肯定,也为公司未来的发展奠定了坚实的基础。

广州基安彼(GMB)公司的发展小趣事

进入新世纪后,Extech公司迎来了新的发展机遇。2000年,公司成为国家第一批863/CIMS系统集成和咨询服务企业,同时也是国家863/CIMS示范应用工程的主流供应商。这一荣誉的获得不仅体现了公司在技术实力和服务能力方面的优势,也为公司未来的发展提供了更广阔的空间。

Heatron公司的发展小趣事

进入21世纪后,Heatron公司开始积极寻求国际合作机会,以进一步拓展其全球业务。公司先后与多个国家的知名企业建立了战略伙伴关系,共同开发新产品、新技术。通过资源共享和市场互补,Heatron不仅成功进入了多个新兴市场,还显著提升了其品牌在国际市场上的知名度和影响力。

Gwconnect (Molex)公司的发展小趣事
分立元件易于更换,便于维修和故障排查。

问答坊 | AI 解惑

Protel99SE精彩教程

Protel99SE精彩教程 此教程采用的样板软件是PROTEL99SE汉化版,对于学习PROTEL99SE很有用~99SE是PROTEL家族中目前最稳定的版本,功能强大。采用了*.DDB数据库格式保存文件,所有同一工程相关的SCH、PCB等文件都可以在同一*.DDB数据库中并存,非常 ...…

查看全部问答>

和初学者说说我学单片机的经过(ZT)

和初学者说说我学单片机的经过(ZT) 第一次知道"单片机"这三个字,那是1997年.那时我还在读中专,疯狂的在自学电子,这三个字是从 < <电子报> > 上看到的,但当时对单片机没一点认识,电子方面也是一片空白,所以单片机到底是何物,就 ...…

查看全部问答>

我爱龙芯之简介篇

     前段时间在论坛上上传了一个关于龙芯的PPT,应管理员soso的想法,觉得可以收集一点龙芯的资料,让我们认识自己中国人的芯。以下部分是我结合百科词条摘录的一部分内容,作为对龙芯的简单介绍吧!     其实, ...…

查看全部问答>

请教AD9851的电压放大问题

要做一个基于AD9851的信号发生电路,初定指标是频率1Hz~30M,已经是高频了,电压为5V。 最关键的是芯片产生信号后,要进行滤波,电压放大,以及功率放大 不知道选择哪款的运放比较合适,是否需要进行级联? 恳请论坛里有模电或者高频经验的高手 ...…

查看全部问答>

MSDN <>中的问题:

Super servers address all of these issues. Rather than have each service accept connections on its own thread, services.exe spins one thread on system startup and listens on a number of sockets, up to 64, for services that request ...…

查看全部问答>

关于启动起址的问题

小弟请问,平时我们把bootloader拷到flash中后,但是如果程序在链接时指定的入口地址是在SDRAM中,那么上电后,硬件是不是会把程序copy到sdram中相应的位置去呢?还是就在flash中执行?谢谢! 还有skyeye执行程序时,用file=bootloader,boot=yes &nbs ...…

查看全部问答>

LED灯具损坏常见原因及保护方案

replyreload += \',\' + 697127;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

在DC综合后的网表文件怎么导入到PT中进行时序分析

做的一个简单的cla电路,综合后得到电路网表。然后使用write -hierarchy -output cla.db 和write -format Verilog -hierarchy -output cla.v 保存了综合后的网表。但是用pt读后:read_db cla.db 这个说No-Design were read和read_verilog cla.v 这 ...…

查看全部问答>

MSP430如何直接用IAR烧写D43文件

MSP430如何直接用IAR烧写D43文件,用MSP430 USB型仿真器直接通过IAR建工程烧写IAR编译生成的.D43结尾的文件,方便用于生产使用,不用给原代码,防止工程师原代码泄露,方便实用 [ 本帖最后由 kingheimer 于 2013-3-5 12:59 编辑 ]…

查看全部问答>

赛前题目分析

本帖最后由 paulhyde 于 2014-9-15 03:37 编辑 赛前题目分析.doc    …

查看全部问答>