Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB';s串行端口性能_Matlab_Serial Port - Fatal编程技术网

MATLAB';s串行端口性能

MATLAB';s串行端口性能,matlab,serial-port,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

我目前正在开发一个基于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
函数堆栈\u流(时间)
列计数=10;
串行对象=创建串行对象;
fopen(串行对象);
日期向量=时钟;
文件名=datestr(日期向量,30);
文件名=[文件名'.txt'];
file_identifier=fopen(文件名'w');
抽搐;
while(总有机碳<时间)
if(serial_object.UserData.is_new_data==true)
raw_chunk=serial_object.UserData.data;
serial_object.UserData.is_new_data=false;
数据块=sscanf(原始块,'%d');
数据块长度=长度(数据块);
if(mod(数据块长度、列计数)==0)
数据\列\计数=数据\区块\长度/列\计数;
数据=重塑(数据块、列计数、数据列计数);
fprintf(文件标识符,。。。
“%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\r\n”,数据);
终止
终止
终止
fclose(文件标识符);
fclose(串行对象);
删除(串行对象);
终止
函数串行\对象\回调(对象、事件)
new_data=fscanf(对象,'%c',object.bytesavable);
if(object.UserData.is_new_data==false)
object.UserData.data=新的_数据;
object.UserData.is_new_data=true;
其他的
object.UserData.data=[object.UserData.data新数据];
终止
终止
函数serial\u object=创建\u serial\u object()
串行对象=串行('COM2');
串行_object.BaudRate=57600;
串行_object.DataBits=8;
serial_object.FlowControl='none';
串行_object.StopBits=1;
串行对象终止符='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;
终止
本质上,此函数使用回调在串行对象缓冲区和用户缓冲区之间传输数据,将
time
秒的数据写入文件。使用
stack\u stream
我发现每收到3000行数据,我就会丢失大约10行数据,即大约每分钟10行


传闻证据会让我相信MATLAB能够处理kHz范围内的串行数据,因此我有点不知所措,无法确定为什么我不能让它在微不足道的50Hz下正常工作。我可以做些什么来提高性能而不必求助于windows之类的实时目标吗?

这对任何串行端口来说都是“正常”的吗?我记得我必须写很多代码来检查RS422/485连接上的数据的完整性,正是因为这种问题……这是用C语言编写的,与MATLAB无关。如果我没记错的话,数据是按原样发送的,在任何标准协议中都没有任何错误检查机制。所以,电缆长度、连接质量等机械因素对成功率非常重要。但是,如果我错了,请纠正我。这种行为是不正常的。如果我使用超级终端来记录从嵌入式系统发送到文件的数据,而不是MATLAB,我可以让它运行数小时而不会丢失一行数据(每行数据都经过枚举,因此很容易找出丢失的内容)。我确信这个问题是MATLAB特有的,尽管我很高兴被证明是错误的。