Последовательное общение в Matlab действительно медленное.Есть ли способ ускорить это? - PullRequest
4 голосов
/ 09 апреля 2011

Я написал программу для некоторой последовательной связи (RS232) в Matlab, которая должна общаться с микропроцессором. Он отлично работает, получая данные от него, но при отправке данных это занимает от 0,2 до 0,5 секунд на 2 байта данных. Есть ли известный способ ускорить последовательную связь в Matlab или мне придется с этим смириться?

Вот код, который я использую для написания:

% confa serieporten
com_port = '/dev/tty.FireFly-16CB-SPP';
ser = serial(com_port, 'BaudRate', 115200);
ser.BytesAvailableFcnCount = 1;
ser.BytesAvailableFcnMode = 'byte';
ser.Timeout = 5;


i = 1;
while i <=length(buffer)
fwrite(ser, buffer(i));
i = i + 1;
end

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Прежде всего, прежде чем выполнять какую-либо оптимизацию, вы должны выполнить профилирование.

Меню -> Рабочий стол -> Профилировщик

Откройте профилировщик Matlab, запустите программуи узнайте, где находится узкое место.

2 голосов
/ 06 января 2012

Я вполне уверен, что объект SERIAL использует API Java (по крайней мере, раньше; реализация могла измениться, так как я работал с ним).Затраты на использование объектной системы MATLAB, в отличие от непосредственного общения с объектами Java в MATLAB, тривиальны.Поэтому я не стал бы пытаться пропустить объект SERIAL и перейти к «прямо на Java».

Мой вопрос к вам: «Есть ли у вас 1004 * попытки отправить каждыйбайт немедленно ? "Связь должна быть намного более эффективной, если вы используете большее значение для BytesAvailableFcnCount.

Если ваше оборудование не имеет особых ограничений, я рекомендую выбрать больший размер буфера.( может потребовать принудительного сброса при завершении потока данных, поскольку вы не можете рассчитывать на саму запись байта автоматически. Но, вероятно, вы уже закрываете и удаляете объект в соответствующее время,поэтому не должно быть сложным дополнительно очищать буфер одновременно).

Если вы не укажете значение, MATLAB использует значение по умолчанию 48 байтов.Я не помню, как было выбрано это точное значение, но запись нескольких значений одновременно будет гораздо более эффективной, чем запись в буферы и их сброс в байты за раз.

РЕДАКТИРОВАТЬ: Другая мысль;У меня нет MATLAB для проверки этого прямо сейчас, но что произойдет, если вы не записываете данные в цикл for - вместо этого оставьте для BytesAvailableFcnCount значение 1, иfwrite весь буфер за один снимок?

Способ, которым я читаю документацию , BytesAvailableFcnCount, определяет только "триггер" для того, насколько большим может быть буфер до его очистки, не насколько большой буфер может быть.Таким образом, наличие BytesAvailableFcnCount из 1 и запись в буфер размером (скажем) 128 за один снимок может выполнить сброс на устройство только один раз вместо 128 раз, как это делает ваш существующий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...