Arduino Matlab串行数据流

36视图(30天)
霁
2014年2月10日
亲爱的所有,
我从事一个项目,利用Matlab从Arduino电路板不断读取模拟数据。在第一步,Arduino代码编程发送3号连续串行端口(COM11)。然后我想从matlab代码读取数字3以连续的方式。附加这里是matlab代码arduino和代码。我的问题是,我运行matlab代码的一切,它给了我两个错误。但反应显示数字3。我猜问题开始发生当我准备数据流。请让我知道我如何能浮现出它。非常感谢。
错误消息:
响应=
3
错误使用串行/ subsasgn(第153行)BytesAvailableFcnMode OBJ开放时不能设置。
错误serialDataStream(第112行)obj.BytesAvailableFcnMode =“字节”;
Matlab代码
函数serialDataStream
% SERIALDATASTREAM是接收和函数的设计模式
%过程的连续流数据从一个设备连接到一个USB或
%串行端口。这个函数不执行写;它包括
%的解释和例子捕获数据所需的所有步骤
%,持续传播或串行接口。它
%使用MATLAB的一些高级特性,串口接口
%用于流高数据率1.5 MB /秒。特性
% Windows、Mac OS X和Linux。MATLAB仪器控制
%工具箱不是必需的。
%
%大多数USB驱动程序包括作为“虚拟串口的功能
%端口”或“虚拟COM端口”(VCP)。此功能用于
% MATLAB接口,所以确保你的设备驱动程序
%的能力。所有司机OS X和Linux包含这个特性。在
%的窗户,VCP有时是一个单独的功能,或需要额外的
%安装步骤。这段代码是使用FTDI USB接口开发的,
但它不是特定于FTDI百分比。
%
%这段代码不执行如经上所记,这是一个设计模式。读
%和修改它为您的需要。
%
%
%马修Hopcroft
% mhopeng@gmail.com
% Mar2012 v1.1更新描述
% Jun2011 v1.0
%
删除(instrfindall);
% % 1。识别串口
%串行端口有不同的系统标识符,根据
%的操作系统。
% Windows使用“COM”端口。系统为每个新分配一个新的COM端口
%的设备连接。使用设备编号可以修改
%的经理。通常1 - 3 COM端口号是留给系统使用。
USBport =“COM11”;
% Mac OS X使用Unix / dev条目。设备的名称开头
%”/ dev /电传。usbserial——“其次是USB设备的序列号
%相连接。
% USBport = / dev / tty.usbserial-FTDI5463”;
%的Linux (Ubuntu, Debian)使用Unix / dev条目。设备的名称
%开头“/ dev / ttyUSB”后跟一个数字。其他Linux发行版
%可以使用不同的约定。
% USBport = / dev / ttyUSB0”;
%可选:
%在Windows中,您可以使用系统命令列出可用的COM“模式”
%港口,但它不提供任何信息,设备连接。
% (mstat availableCOMports] =系统(“模式”);%的窗户
%在OS X和Linux,您可以确定通过检查/ dev的港口名称
%的条目:
% availableDevices = ls (/ dev / tty.usbserial - *);OS X %
% availableDevices = ls (/ dev / ttyUSB *);% Linux
% % 2。创建序列对象
%的串口对象表示连接到设备。在
% MATLB文档,这个变量通常被称为“obj”。你会
%读写数据从您的USB设备通过串口对象。
obj =串行(USBport);
%你需要根据你的设备设置串口设置
%的要求。一些常见的设置。看到MATLAB
%的文档为你的设备所有可能性。
%
%的波特率的数据传输速率是每秒字节
%大多数USB设备可以支持1.5 e6的波特率万博1manbetx,但一些
%的操作系统不支持“非标准”为串口波特率。万博1manbetx
%“标准”包括:波特率
% 300,600,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200,128000,230400,460800,921600
obj.BaudRate = 9600;
%终止字符的数据序列
obj.Terminator =“CR”;
%解释二进制数据的字节顺序是很重要的
obj.ByteOrder =“bigEndian”;
% % 3。设置你的设备
%你的USB设备可能需要一些设置通过接口命令。来
%发送和接收命令,使用流(obj)和fscanf (obj)。
%必须打开串口对象进行交流沟通的
如果比较字符串(obj.Status“关闭”),fopen (obj);结束
%发出一个命令。上面的终结者字符集将附加。
流(obj,“唤醒”);
%读取响应
响应= fscanf (obj);
响应
% % 4。准备数据流
%从USB设备的数据将由一个串行端口
%时自动函数叫做一定数量的字节
%已收到在输入缓冲区。你的串口函数
%把数据从缓冲和处理它。调整缓冲区大小
%和字节数的函数来满足您的应用程序。
%的输入缓冲区必须大到足以容纳的数据量
%将收到时程序正忙着处理之前
%收到的数据块。有一个缓冲,太大不是
%的问题大多数现代电脑。
obj.InputBufferSize = 512;%的字节
%时都会调用“BytesAvailableFcn”功能
% BytesAvailableFcnCount从USB已收到的字节数
%的设备。
obj.BytesAvailableFcnMode =“字节”;
obj.BytesAvailableFcnCount = 1;% 1 kB的数据
%的名字BytesAvailableFcn函数在这个例子
%”getNewData”,它有一个额外的输入参数(“__arg1”)。
obj。BytesAvailableFcn = {@getNewData, __arg1};
%使用串口对象之间传递数据的主要功能
%和串口函数(“getNewData”)。
%可以包括数据点读,总数
%时间戳等在这里。
obj.UserData.newData = [];
obj.UserData.isNew = 0;
% % 5。处理传入的数据
%在这个例子中,我们使用一个循环所发送的数据流图
%的USB设备。
%一个全局变量用于退出循环
全球PLOTLOOP;PLOTLOOP = 1;
%初始化数据绘图。“plotWindow”的长度
%轴数据曲线图。
plotData = 0 (plotWindow);
newData = [];
%为策划创建图
pfig =图;
%这让我们停止测试通过按一个键
集(pfig,“KeyPressFcn”,@stopStream);
%向设备发送命令来启动数据流。
流(obj,“开始”);
PLOTLOOP
%等到我们有新的数据
如果obj.UserData.isNew = = 1
%从串口对象获取数据(数据将row-oriented)
newData = mr.UserData.newData ';
%表明数据被读取
mr.UserData.isNew = 0;
%连接策划的新数据
plotData = [plotData(大小(newData 1) + 1:,:);newData];
%画出数据
情节(pfig plotData);
drawnow;
结束
%的循环将退出用户按下返回时,使用
% KeyPressFcn情节的窗口
结束
% % 6。完成和清理
%添加任何所需的命令关闭您的设备。
%向设备发送命令停止数据传输
流(obj,“停止”);
%冲输入缓冲区
英航=得到(obj,“BytesAvailable”);
如果英航> 0,从文件中读(先生,ba);结束
%关闭串口
文件关闭(obj);
删除(obj);
返回
% %数据处理功能
函数__arg1 getNewData (obj、事件)
% GETNEWDATA过程到达串口的数据。
% GETNEWDATA是串口的“BytesAvailableFcn”对象,所以它
%是BytesAvailableFcnCount字节的数据时自动调用
%在串口收到。
%从端口读取数据。
%二进制数据,使用从文件中读。你需要提供的字节数
%阅读和数据的格式。看到MATLAB文档。
%为ASCII数据,您可能仍然使用fread格式的“字符”,所以
%你不必处理终止字符。
[Dnew, Dcount Dmsg] =从文件中读(obj);
%你可以做一些初始数据的处理在这个函数。
%,我建议保持处理最小和做
%的大部分工作在主循环为最佳性能。
%的数据返回给主循环为策划/处理
如果obj.UserData.isNew = = 0
%表明我们有新的数据
obj.UserData.isNew = 1;
obj.UserData.newData = Dnew;
其他的
%如果主循环没有有机会前面的批处理过程
%的数据,然后将这些新数据附加到前面的“新”数据
(obj.UserData obj.UserData.newData =。newData Dnew];
结束
返回
% %循环控制功能函数[]= stopStream (src, evnt) % stopStream是当地一个函数,停止主循环通过%全局变量设置为0,当用户按下返回。全球PLOTLOOP;
如果比较字符串(evnt.Key,“返回”)PLOTLOOP = 0;流('回车键。');结束
返回
% % % %
Arduino代码
无效设置(){
/ /初始化串行沟通以每秒9600位:
Serial.begin (9600);
}
无效循环(){
如果(Serial.available ()) {
以(3);
延迟(100);/ /延迟读取之间稳定
}
}

答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!