MATLAB与DSP串口通讯并实时显示图像

一、准备工作

在ccs中编写关于SCI发数据的代码,将数据存写到SCI的端口。然后将串口转USB通讯线连接在电脑上,并确认已连接上电脑(在设备管理器的端口中观察com口)。

二、CCS中代码主要是SCI的编写

SCI读写数据头文件好源文件如下::

  1. 头文件

    #ifndef SCI2MATLAB_H_
    #define SCI2MATLAB_H_
    #include "DSP280x_Device.h"     // DSP2833x Headerfile Include File
    #include "DSP280x_Sci.h"
    #include<string.h>
    #include "DSP280x_Examples.h"   // DSP2833x Examples Include File 注:头文件有顺序要求如sci要引用device,device必须在前面
    #define SCIA 0x1
    #define SCIB 0x2
    void intsci(Uint16 channel);
    void scisendata(Uint16 channel,Uint16 data);
    void intpietable();
    double scisendchar(Uint16 channel,double *listdata);
    Uint16 scireceive(Uint16 channel);
    interrupt void sciaRX(void);
    interrupt void sciaTX(void);
    interrupt void scibRX(void);
    interrupt void scibTX(void);
    

    #endif /* SCI2MATLAB_H_ */

  2. 源文件程序

    #include “DSP280x_Device.h” // DSP2833x Headerfile Include File
    #include “DSP280x_Sci.h”
    #include<string.h>
    #include “DSP280x_Examples.h” // DSP2833x Examples Include File 注:头文件有顺序要求如sci要引用device,device必须在前面
    #include “SCI2MATLAB.h”
    Uint16 Data;
    void intpietable()
    {
    intsci(SCIA); //初始化SCIA设置
    intsci(SCIB);
    EALLOW;
    PieVectTable.SCIRXINTA=&sciaRX;
    PieVectTable.SCITXINTA=&sciaTX; //将两个中断地址放在中断向量列表中
    PieVectTable.SCIRXINTB=&scibRX;
    PieVectTable.SCITXINTB=&scibTX; //将两个中断地址放在中断向量列表中
    EDIS;
    IER|=M_INT9; //使能CPU中断
    PieCtrlRegs.PIECTRL.bit.ENPIE=1; //使能中断向量表,地址从向量表中提取
    PieCtrlRegs.PIEIER9.bit.INTx1=1;
    PieCtrlRegs.PIEIER9.bit.INTx2=1; //使能PIE中断
    PieCtrlRegs.PIEIER9.bit.INTx3=1;
    PieCtrlRegs.PIEIER9.bit.INTx4=1; //使能PIE中断
    EINT; //使能全局中断
    ERTM;
    }
    void intsci(Uint16 channel)
    {
    if(channelSCIA)
    {
    InitSciaGpio();
    SciaRegs.SCICCR.all=0x07;
    SciaRegs.SCICTL1.all=0x03;
    #if(CPU_FRQ_150MHZ)
    SciaRegs.SCILBAUD=0x00E7;
    SciaRegs.SCIHBAUD=0x0001;
    #endif
    #if(CPU_FRQ_100MHZ)
    SciaRegs.SCILBAUD=0x0044;
    SciaRegs.SCIHBAUD=0x0001;
    #endif
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;
    ScibRegs.SCICTL2.bit.TXINTENA=1;
    SciaRegs.SCICCR.bit.LOOPBKENA=1;
    SciaRegs.SCICTL1.bit.SWRESET=1;
    }
    if(channel
    SCIB)
    {
    InitScibGpio();
    ScibRegs.SCICCR.all=0x07;
    ScibRegs.SCICTL1.all=0x03;
    #if(CPU_FRQ_150MHZ)
    ScibRegs.SCILBAUD=0x00E7;
    ScibRegs.SCIHBAUD=0x0001;
    #endif
    #if(CPU_FRQ_100MHZ)
    ScibRegs.SCILBAUD=0x0044;
    ScibRegs.SCIHBAUD=0x0001;
    #endif
    ScibRegs.SCICTL2.bit.RXBKINTENA=1;
    ScibRegs.SCICTL2.bit.TXINTENA=1;
    ScibRegs.SCICCR.bit.LOOPBKENA=1;
    ScibRegs.SCICTL1.bit.SWRESET=1;
    }
    }
    void scisendata(Uint16 channel,Uint16 data)
    {
    if(channelSCIA)
    {
    SciaRegs.SCITXBUF=data;
    while(SciaRegs.SCICTL2.bit.TXRDY
    0);
    }
    if(channelSCIB)
    {
    ScibRegs.SCITXBUF=data;
    while(ScibRegs.SCICTL2.bit.TXRDY
    0);
    }
    }
    double scisendchar(Uint16 channel,double *listdata)
    {
    Uint16 i;
    i=0;
    if(channelSCIA)
    {
    SciaRegs.SCICTL2.bit.TXINTENA=0; //关闭中断,避免SCI发送数据是一个字符一个字符发送
    while(listdata[i]!=’\0’) //直到字符结束停止循环
    {
    scisendata(SCIA,listdata[i]);
    i++;
    }
    SciaRegs.SCICTL2.bit.TXINTENA=1; //开启中断,并在字符串传送完产生中断
    }
    if(channel
    SCIB)
    {
    ScibRegs.SCICTL2.bit.TXINTENA=0;
    while(ScibRegs.SCITXBUF!=’\0’)
    {
    scisendata(SCIB,listdata[i]);
    i++;
    }
    ScibRegs.SCICTL2.bit.TXINTENA=1;
    }
    return *listdata;
    }
    Uint16 scireceive(Uint16 channel)
    {
    Uint16 data;
    if(channelSCIA)
    {
    data=SciaRegs.SCIRXBUF.all;
    }
    if(channel
    SCIB)
    {
    data=ScibRegs.SCIRXBUF.all;
    }
    return data;
    }
    interrupt void sciaRX(void)
    {
    Data=scireceive(SCIA);
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
    }
    interrupt void sciaTX(void)
    {
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
    }
    interrupt void scibRX(void)
    {
    Data=scireceive(SCIB);
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
    }
    interrupt void scibTX(void)
    {
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
    }

三、MATLAB程序

3.1主程序

delete(instrfindall('Type','serial'));
clc;

global t;
global x;
global m;
global ii;

t = [];
m = [];
ii = 1;
x = 0;
p = animatedline('Color','r','LineWidth',3,'LineStyle','-.','Marker' ,'*','MarkerSize',3);
%  axis([x x+500 0 8]);
grid on;

%%
try
    s=serial('com7');
catch
    error('cant serial');
end
set(s,'BaudRate', 9600,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none');
% s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcnMode='byte';%中断触发事件为'bytes-availableEvent'
s.BytesAvailableFcnCount=1;%接收缓存     区每收到1个字节时,触发回调函数
s.BytesAvailableFcn ={@callback,p} ;%指定函数回调
fopen(s);
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);
pause;
fclose(s);
delete(s);
clear s
close all;

3.2回调程序

function callback(s,~,p)
    
    global t;
    global x;
    global m;
    global ii;
    out =fread(s,1);%ASCII方式时用fscanf,二进制用fread
    data = double(out);
    t = [t ii];
    m = [m data];
    addpoints(p,t(ii),m(ii));
    drawnow limitrate
    x = x + 1;
    axis([x-500 x+500 0 10]);
    ii=ii+1;
end

四、结果

只显示了动态的一部分
在这里插入图片描述

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值