MATLAB的串行端口性能

时间:2014-03-20 07:20:12

标签: matlab serial-port

我目前正在开发一个基于GUI的应用程序,它记录来自嵌入式系统的串行数据,该系统以50Hz的频率传输。问题是MATLAB似乎无法可靠地记录这些数据,并丢弃样本。传输数据的格式如下:

4918  22279  29342   3161      0  24953  29814   5319      1      0
4919  22279  29348   2997      1  24953  29838   5037      0      0
4920  22279  29357   2682      0  24953  29853   4544      0      0

每行由CR / LF终止。我已经编写了一个测试函数来试图弄清楚发生了什么 - 下面是代码。

function stack_stream(time)
    column_count = 10;

    serial_object = create_serial_object;
    fopen(serial_object);

    date_vector = clock;
    file_name = datestr(date_vector,30);
    file_name = [file_name '.txt'];

    file_identifier = fopen(file_name,'w');
    tic;

    while (toc < time)
        if (serial_object.UserData.is_new_data == true)
            raw_chunk = serial_object.UserData.data;
            serial_object.UserData.is_new_data = false;

            data_chunk = sscanf(raw_chunk,'%d');
            data_chunk_length = length(data_chunk);

            if (mod(data_chunk_length,column_count) == 0)
                data_column_count = data_chunk_length/column_count;

                data = reshape(data_chunk,column_count,data_column_count);

                fprintf(file_identifier,...
                    '%6d %6d %6d %6d %6d %6d %6d %6d %6d %6d\r\n',data);
            end
        end
    end

    fclose(file_identifier);
    fclose(serial_object);
    delete(serial_object);
end

function serial_object_callback(object,event)
    new_data = fscanf(object,'%c',object.BytesAvailable);

    if (object.UserData.is_new_data == false)
        object.UserData.data = new_data;
        object.UserData.is_new_data = true;
    else
        object.UserData.data = [object.UserData.data new_data];
    end
end

function serial_object = create_serial_object()
    serial_object = serial('COM2');

    serial_object.BaudRate = 57600;
    serial_object.DataBits = 8;
    serial_object.FlowControl = 'none';
    serial_object.StopBits = 1;

    serial_object.Terminator = 'CR/LF';
    serial_object.InputBufferSize = 2^18;
    serial_object.BytesAvailableFcnMode = 'terminator';
    serial_object.BytesAvailableFcn = {@serial_object_callback};

    serial_object.UserData.data = [];
    serial_object.UserData.is_new_data = false;
    serial_object.UserData.response = [];
    serial_object.UserData.is_new_response = false;
end

本质上,此函数将time秒的数据写入文件,使用回调在串行对象缓冲区和用户缓冲区之间传输数据。使用stack_stream我发现每收到3000个,我就会错过大约10行数据 - 即每分钟大约10行。

轶事证据会让我相信MATLAB能够处理kHz范围内的串行数据,所以我有点不知道为什么我无法让它在微小的50Hz下正常工作。有什么办法可以提高性能而不必诉诸于Windows等的实时目标吗?

0 个答案:

没有答案