MATLAB串口通信与实时数据处理
% 主要用到的命令及函数 % 所有注释文字均为原创,用词并非一定准确,仅供参考 % 没有写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;
请发表评论