分享

MATLAB串口通信与实时数据处理

 书剑阁2013 2013-12-03

% 主要用到的命令及函数

% 所有注释文字均为原创,用词并非一定准确,仅供参考

% 没有写GUI的程序,若用VC或.NET写串口通讯的界面程序,需要考虑到多线程任务的处理,比较复杂,因为MATLAB有中断响应事件instrcallback,大大简化了程序的编写;

% 设置串口号,字符串形式

strSerialPortNum = input('串口号(数字):');

strSerialPortName = ['COM',num2str(strSerialPortNum)];


% 设置串口参数

% 设置串口对象

s = serial(strSerialPortName);

% 设置串口波特率(38400),校验位(偶校验)

% 其他参数可查看MATLAB帮助文档

set(s,'BaudRate',38400,'parity','even');

% 设置中断反馈函数

set(s, 'BytesAvailableFcn', {'instrcallback'});

% 注意函数“instrcallback”的位置,比如我的是D:\Program Files\MATLAB\R2011b\toolbox\shared\instrument\@instrument\instrcallback.m,经验证,把instrcallback.m复制到主程序目录下并不产生作用,应该是只能修改安装目录下%toolbox\shared\instrument\@instrument\instrcallback.m的文件中的程序才有用。

% 设置中断响应(有10个可用字节时,产生中断)

set(s, 'BytesAvailableFcnCount', 10);

% 设置中断响应模式(有“byte”和“Terminator”两种模式可选,“byte”是达到一定字节数产生中断,“Terminator”可用作键盘某个按键事件来产生中断)

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

% 设置串口数据最大读写时间,如果超过这个时间,仍读取不到数据,那么则终止读写

% 注:串口的一些参数必须在打开串口之前进行设置,即在串口状态是“Close”的情况下来进行设置

set(s, 'TimeOut', 1);

% 打开串口

fopen(s);

% 向串口发送数据(这里发送一个大写字母“S”,这是我的硬件数据通信握手指令;本来用fprintf(s,'S')命令发送,但是结果只产生一帧的数据,后来在中断响应函数instrcallback中也加入fprintf(s,'S')命令来不断的向硬件发送握手请求,但发现数据的传输速率慢了好几倍,本来是硬件中设置的是发送一次“S”指令,即可不断的产生数据,这样数据传输速率基本能达到每9ms接收10KB的数据,而在上位机MATLAB中循环发送握手指令,数据传输速率慢且不稳定,平均25-40ms接收10KB的数据。查看MATLAB的帮助文档,发现fprintf(s,'S')命令其实是向串口发送了“S\n”这样的指令,所以才会出现只能接收一帧数据(我这里是10KB)的情况。我需要的是单发送字符“S”,需用fprintf(s,'%c','S')指令);

fprintf(s,'%c','S');

% 逐帧读取串口数据,这里一帧是10个字节,以2进制方式读取,用uint8(8位无符号整型)参数;

receiveData = fread(s,10,'uint8');

% 上面这句命令我是写在中断响应函数instrcallback中的,还有一些数据处理的代码,有时间会详细写在以后的博文中;这句之后即可加上N多的数据处理代码了(instrcallback函数的作用也在于此);

% 关闭串口对象

fclose(s);

% 删除串口对象(并非必须)

delete(s);

% 清楚串口对象所占内存(并非必须)

clear s;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多