之前用 matlab 做过挺多小的 gui 界面,比如这个。在很多情况下需要用到数据库,自己做着玩玩我喜欢使用网站的数据库,因为是现成的,也不用配置啥。如果您正好有一个这样的数据库,那么给 matlab 当作数据库玩玩还是挺好的。

准备工作

  • Matlab 在连接数据库时需要下载安装 MySQL 驱动文件。将解压文件中的 mysql-connector-java-5.1.42-bin.jar 拷贝到 matlab 安装文件夹的 java\jar\toolbox 下。
  • 然后找到这个路径(在你的 matlab 安装目录之下),接下来修改 matlab\R2014b\toolbox\local 下的 classpath.txt 文件,在其中添加语句(具体的文件名根据你所下载到的最新包进行更改):
$matlabroot/java/jar/toolbox/mysql-connector-java-5.1.42-bin.jar
  • 重启 matlab

新建一个数据表

这里以阿里云的虚拟主机为例,其他的虚拟主机也类似。

  1. 你需要以下的信息:
  • 数据库地址
  • 数据库名
  • 数据库用户名
  • 数据库密码
  1. 你需要在你的云端数据库中新建一个数据表(本文举例,比如abc),然后再加几列你想要新建的数据名称( 本文举例,比如第一列name, 第二列date , 第三列item ,第四列number、第五列total )。
  2. 此外,如果想要进行测试的话,可以通过随机新建数据随机生成一堆你想要的数据(日期、数字、文字等),用来进行 matlab 和数据库的模拟操作。

连接你的数据库

连接数据库时主要添加下面的一行代码即可,网上的许多参考资料都是连接本地数据库(比如 localhost),这里以阿里云的虚拟主机中的数据为例,其他类似,参照修改即可。

% 连接数据库
q=database('数据库名(阿里云中是***_db)','数据库用户名','数据库密码','com.mysql.jdbc.Driver','jdbc:mysql:数据库名.my3w.com:3306/(以阿里云为例,其他根据实际情况而变)')

% 读取数据
curs=exec(q,'select * from abc')  %从数据库q中选取表abc
curs=fetch(curs) %把数据库中的数据读取到Matlab中
curs=fetch(curs,RowLimit); %RowLimit为每次读取的数据参数的行数,不填就默认为全部读取

% 读取特定的数据
non_solve=exec(q,"select * from abc WHERE name='Jack' and total='1000' ")

% 向数据库中插入数据
insert(q,'abc',{'name','date','item','number','total'},{name,date,item,number,total}) %向abc表中插入一行新的数据,第一个大括号内是数据库表内每一列的名称,第二个大括号内是数据在matlab内的变量名

% 其他有用的参数
numrows=rows(curs)  %查看数据行数
numcols=cols(curs)  %查看数据列数
attribute=attr(curs)  %查看数据属性

串口操作

下列代码不完整,可能会运行失败,各取所需:

%% 串口
if ~isempty(instrfind)
     fclose(instrfind);
     delete(instrfind);
end

% 连接数据库
q=database('数据库名(阿里云中是***_db)','数据库用户名','数据库密码','com.mysql.jdbc.Driver','jdbc:mysql:数据库名.my3w.com:3306/(以阿里云为例,其他根据实际情况而变)')

s_answer = get(handles.edit1,'String')
% s1 = instrfind('Type','serial','Port','COM6','Tag','');    % 查看端口是否存在
%
% if (isempty(s1))           % 如果端口1存在,存创建端口
s = serial('COM7');      % 创建串口号
s.BaudRate = 9600;     % 设置波特率
% end

s.Parity = 'none';   % 无校验位
s.DataBits = 8; % 数据位
s.StopBits = 1;  % 停止位

s.Timeout = 0.1;
s.InputBufferSize = 3072;
s.OutputBufferSize = 3072;
s.ReadAsyncMode = 'continuous';

fopen(s); %打开串口

set(handles.uitable2,'Data',[]) //设置GUI表格为空
while (isempty(s) == 0)
    A = fscanf(s, '%s')  //扫描串口
    if(isempty(A)==0)  //如果不是空
        curs=exec(q,'select * from 数据表名称')
        curs=fetch(curs)
        rows(curs)
        receive_data = strsplit(A,',')  % 将string分割
        id = receive_data{1}   % matlab里面char就是string类型,此时类型为char
        name = receive_data{2}
        
       % speed = '1'
       % if (isequal(answer,s_answer)==1)
       %     right = '正确'
       % else
       %     right = '错误'
       % end
        
        time = fix(clock)
        date = strcat(num2str(time(:,1)),'年',num2str(time(:,2)),'月',num2str(time(:,3)),'日')
        time = strcat(num2str(time(:,4)),'时',num2str(time(:,5)),'分',num2str(time(:,6)),'秒')

        insert(q,'数据表名称',{'id1','name1'},{id,name}) %插入数据库
        uitabledata = get(handles.uitable2,'Data')
        newrow = {id,name}
        newdata = [uitabledata;newrow]
        set(handles.uitable2,'Data',newdata)
    end
    pause(1)
    
    % set(handles.edit3,'String','打开/连接成功!');
end

参考资料

https://blog.csdn.net/vinegar93/article/details/53928326

类似文章

发表评论

您的电子邮箱地址不会被公开。