你好,我也正打算用matlab读串口数据

你好,我也正打算用matlab读串口数据,第1张

最近看到有人讨论matlab 串口通信的话题,结合以往的VB串口通信,做了这么个小实验。

需要用到的软件:matlab 7,VB 6,还有一个就是虚拟串口 Virtual Serial Port Driver!

前面2个软件就不用解释了,虚拟串口 Virtual Serial Port Driver 就是生成一对虚拟串口2和3,

本实验中一个matlab来存取COM2,另一个COM3就用VB编程打开,而且这2个串口是连接在一起的,一个输出数据,就可以从另外一个得到数据!

VB程序

放一个MSComm 控件在form上,在 Form_Load里设置相关属性,当然还包括串口通信参数字符串:

Private Sub Form_Load()

MSComm1CommPort = 3

MSComm1InputMode= comInputModeBinary

MSComm1RThreshold = 1

MSComm1Settings = "9600,e,8,1"

MSComm1PortOpen = True

End Sub

再在MSComm1的OnComm事件里加入数据生成代码:

Private Sub MSComm1_OnComm()

Dim i%

Dim Data(1024) As Byte

Randomize

Select Case MSComm1CommEvent

Case comEvCD

Case comEvCTS

Case comEvDSR

Case comEvRing

Case comEvReceive

For i = 0 To 100

Data(i) = CByte(255 Rnd())

Next i

MSComm1Output = Data

Case comEvSend

End Select

End Sub

当收到对方一个数据时,触发此事件。这里用随机函数来生成100个数,赋值给Data数组,然后用串口输出!

运行VB程序,串口3就出在打开状态,当收到一个字符,就会发送出生成的100个byte型随机数据!

Matlab程序

clear

u=uint8(zeros(1024,1));

ser_port1=serial('COM2')

ser_port1InputBufferSize=4096;

ser_port1OutputBufferSize=4096;

ser_port1Timeout=10;

ser_port1BaudRate=9600;

ser_port1Parity='even';

ser_port1StopBits=1;

fopen(ser_port1);

fwrite(ser_port1,'S');

u=fread(ser_port1,100,'uint8');

fclose(ser_port1)

delete(ser_port1)

clear ser_port1

plot(u)

grid

程序运行时,先初始化u,然后设置串口通信的相关数据,打开串口2,发送一个字符S,对方收到后会发出100个数据,matlab 接收这100个数据,存放在u中,关闭串口,清楚变量,图示变量u 中的数据!

以上是用虚拟串口软件来模拟串口通信环境,实践中用2台电脑的串口建立真实的串口通信环境也可以。当然,连接时采用的是交叉线,即A机的发送Tx连B机的接收Rx,A机的接收Rx连B机的发送Rx,信号地相连。

本实验仅起抛砖引玉的作用,如果朋友们有兴趣还可以深入,比如建立握手过程、每次指定数据个数,或者PC串口连接单片机的通信环境等等。

另外,需要虚拟串口软件可以去官方网站去下载,也可以联系索取。

没大看明白你说的问题。串口是独占使用的,你在MATLAB打开了,串口调试工具里面就打不开了,反之亦然。老版本的matlab比如65打开串口后,即使fclose掉,也会占用该串口,必须关闭MATLAB才行。新版的fclose之后就释放了,其他程序可以使用。

如果一直读数据,可以使用一个Timer来读串口就可以了。但是,不用也可以,应为串口有一个属性可以当接收缓冲区中有数据的时候自动接收。如下:

comPort=get(handlespumComPort,'String');

handlesu_sCom=serial(comPort{get(handlespumComPort,'Value')});

baudRate=get(handlespumBaudRate,'String');

set(handlesu_sCom,'BaudRate',str2double(baudRate{get(handlespumBaudRate,'Value')}));

dataBits=get(handlespumDataBits,'String');

set(handlesu_sCom,'DataBits',str2double(dataBits{get(handlespumDataBits,'Value')}));

stopBits=get(handlespumStopBits,'String');

set(handlesu_sCom,'StopBits',str2double(stopBits{get(handlespumStopBits,'Value')}));

parity=get(handlespumParity,'String');

if strcmp(parity,'无')==1

set(handlesu_sCom,'Parity','none');

else

if strcmp(parity,'奇校验')==1

set(handlesu_sCom,'Parity','odd');

else

if strcmp(parity,'偶校验')==1

set(handlesu_sCom,'Parity','even');

else

set(handlesu_sCom,'Parity','none');

end

end

end

flowControl=get(handlespumFlowControl,'String');

if strcmp(flowControl,'无')==1

set(handlesu_sCom,'FlowControl','none');

else

if strcmp(flowControl,'硬件')==1

set(handlesu_sCom,'FlowControl','hardware');

else

if strcmp(flowControl,'软件')==1

set(handlesu_sCom,'FlowControl','software');

else

set(handlesu_sCom,'FlowControl','none');

end

end

end

set(handlesu_sCom,'Timeout',1);

set(handlesu_sCom,'InputBufferSize',1024);

set(handlesu_sCom,'BytesAvailableFcnMode','byte');

set(handlesu_sCom,'BytesAvailableFcnCount',1);

set(handlesu_sCom,'BytesAvailableFcn',{@BytesAvailableFcnCallback,handles});

fopen(handlesu_sCom);

set(handlestxtStatus,'String','打开端口成功');

set(hObject,'Enable','off');

set(handlesbtnClosePort,'Enable','On');

guidata(hObject,handles);

set(handlesbtnSendData,'Enable','On');

至于全部程序已经发给你了。

用matlab读了串口数据然后plot图,但我只会读一种数据。比如只读ADC value,或者只读 Time。但想用matlab把Arduino得到的时间和ADC值都读过去然后做出波形图。时间为横轴,ADC为纵轴。Arduino和matlab代码写在下面了,用那个代码做出来的图横坐标的时间都是不对的,所以必须把Arduino读出的时间也读过去。

Arduino:

#include <MsTimer2h>

const int INTERVAL = 3;

unsigned long n = 0;

void ggyy() {

n = millis();

int m = analogRead(A0);

Serialprint(n);

Serialprint(" ");

Serialprint(m);

}

void setup(){

Serialbegin(115200);

MsTimer2::set(INTERVAL,ggyy);

MsTimer2::start();

}

void loop() {

delay(800000);

}

Matlab:

s=serial('COM3');

set(s,'BaudRate',115200);

fopen(s);

interval=5000;

passo=1;

t=1;

x=0;

while(t<interval)

b=str2num(fgetl(s));

x=[x,b];

plot(x);

grid

t=t+passo;

drawnow;

end

fclose(s);

matlab对底层硬件支持较差,我也做这个,

虽然我无法帮你解决问题,我给你个建议,如果你有C基础或者C++,你可以使用VC++写个接口的再给数据传递该matlab引擎计算,或者直接建立一个MFC工程,用混合编程,解决问题,效果非常好,还有你可以在百度搜一下Matlab2008又可以下载的破解版,对硬件支持有所改观。你试下!

使用一个回调函数,一旦有数据满足要求就会转入到回调函数,在回调函数将传输过来的数据转化为你所需要的类型,并且在一个矩阵中存起来,这样就实现了接受数据,发送比较简单自己看一下百度一下就明白了~

以上就是关于你好,我也正打算用matlab读串口数据全部的内容,包括:你好,我也正打算用matlab读串口数据、关于matlab和stm32串口通信的问题、matlab读串口数据问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9472752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存