使用Matlab从计算机串行端口向定制硬件发送多个字节的数据

时间:2018-07-30 06:17:10

标签: matlab serial-port

我正在使用以下matlab程序通过USB串行端口通过PC发送多个串行端口数据

close all; clear all; clc;

array_1st = ones(64, 1, 'uint8'); 
array_1st = array_1st';
for i=1:64
    array_1st(i) = array_1st(i) * i ;
end

dummy_var = zeros(1,1);

if ~isempty(instrfind)
    fclose(instrfind);
    delete(instrfind);
end

s=serial('COM9');
set(s,'Terminator','CR','DataBits',8,'Parity','none','StopBits',1,'baudrate', 38400);

fopen(s);
disp('fopen(s)');

fwrite(s, array_1st);
pause(0.5);
dummy_var = fread(s, 1);

dummy_var

fclose(s);
clear s

自定义硬件已连接到串行端口。我已经能够使用类似的matlab程序读取PC中自定义硬件发送的多个字节的数据(也就是说,从硬件-> PC通过使用matlab的串行端口进行的多字节传输正在工作)

我期望上面的代码在执行fwrite(s, array_1st);函数时写入一个8位无符号整数数组。此时,自定义硬件在IDE的终端中显示在串行端口中接收到的字节,并在matlab程序中的dummy_var = fread(s, 1);被称为

之前在断点处等待

问题是matlab始终仅将array_1st数组的第一个字节发送到串行端口硬件。我已经尝试了上述程序的各种变体,例如删除array_1st = array_1st';行,使用char代替uint8,为LF属性使用usinf terminator在串行端口对象中,但问题始终相同:实际上,只有要发送的阵列的第一个bte通过串行端口硬件到达自定义设备。

调用fwrite(s, array_1st);后,matlab还会显示以下警告:

  

警告:指定数量的数据未在   超时时间。

fopen()之后的串行对象的属性:

   Serial Port Object : Serial-COM9

   Communication Settings 
      Port:               COM9
      BaudRate:           38400
      Terminator:         'CR'

   Communication State 
      Status:             open
      RecordStatus:       off

   Read/Write State  
      TransferStatus:     idle
      BytesAvailable:     0
      ValuesReceived:     0
      ValuesSent:         0

执行dummy_var = fread(s, 1);行之后的属性是:

   Serial Port Object : Serial-COM9

   Communication Settings 
      Port:               COM9
      BaudRate:           38400
      Terminator:         'CR'

   Communication State 
      Status:             open
      RecordStatus:       off

   Read/Write State  
      TransferStatus:     idle
      BytesAvailable:     0
      ValuesReceived:     0
      ValuesSent:         64

ValuesSent属性已从0更新为64,我想这表明,至少就matlab串行端口对象而言,正在发送64数据,但由于某些原因,第一个实际上是通过串行端口硬件

这可能是什么原因?是不是matlab不支持我想做的事情?如果仅1个数据通过串行端口硬件发送,为什么ValuesSent显示64?

Matlab版本为R2009b

编辑1:-----

我使用串行/记录功能记录了串行对象数据,这是它记录的内容:

Legend: 
  * - An event occurred.
  > - A write operation occurred.
  < - A read operation occurred.

1      Recording on 29-Jul-2018 at 23:27:19.241. Binary data in little endian format.
2      > 64 uchar values.
       01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 
       11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 
       21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 
       31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 

3      < 0 uchar values.

4        Recording off.

0 个答案:

没有答案