之前用 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
新建一个数据表
这里以阿里云的虚拟主机为例,其他的虚拟主机也类似。
- 你需要以下的信息:
- 数据库地址
- 数据库名
- 数据库用户名
- 数据库密码
- 你需要在你的云端数据库中新建一个数据表(本文举例,比如
abc
),然后再加几列你想要新建的数据名称( 本文举例,比如第一列name
, 第二列date
, 第三列item
,第四列number
、第五列total
)。 - 此外,如果想要进行测试的话,可以通过
随机新建数据
随机生成一堆你想要的数据(日期、数字、文字等),用来进行 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