señal - graficar voltaje en matlab
La comunicación serial en Matlab es realmente lenta. ¿Hay alguna manera de acelerarlo? (2)
He escrito un programa para algunas comunicaciones serie (RS232) en Matlab que se supone que debe comunicarse con un microprocesador. Funciona bien recibir datos de él, pero cuando se envían datos tarda entre 0,2-0,5 segundos para 2 bytes de datos. ¿Hay alguna manera conocida de acelerar las comunicaciones serie en Matlab o tendré que vivir con esto?
Aquí está el código que estoy usando para escribir:
% 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
En primer lugar, antes de hacer cualquier optimización, debe hacer perfiles.
Menú -> Escritorio -> Perfilador
Abra el perfilador Matlab, ejecute su programa y descubra dónde está el cuello de botella.
Estoy bastante seguro de que el objeto SERIAL está usando las API de Java (al menos, solía hacerlo; la implementación puede haber cambiado desde que trabajé con ella). La sobrecarga de usar el sistema de objetos MATLAB, en lugar de hablar con los objetos de Java "directamente" en MATLAB, es trivial. Por lo tanto, no me molestaría en intentar omitir el objeto SERIAL e ir directamente a Java.
Mi pregunta es: "¿Tienes que intentar enviar cada byte inmediatamente ?" La comunicación debería ser mucho más eficiente si usa un valor mayor para BytesAvailableFcnCount
.
A menos que su hardware tenga restricciones muy particulares, le recomiendo que elija un tamaño de búfer más grande. (Esto puede requerir que enjuague a la fuerza cuando finaliza la secuencia de datos, ya que no puede contar con que se haya escrito mucho byte automáticamente. Pero, presumiblemente, ya está cerrando y eliminando el objeto en el momento apropiado, por lo que no debería ser difícil de vaciar adicionalmente el buffer simultáneamente).
Si no especifica un valor, MATLAB usa un valor predeterminado de 48 bytes. No recuerdo cómo se eligió ese valor exacto, pero escribir varios valores a la vez será mucho más eficiente que escribir en los almacenamientos intermedios y vaciarlos un byte a la vez.
EDITAR: Otro pensamiento; No tengo un MATLAB para probar esto ahora, pero ¿qué sucede si no escribes los datos en un ciclo for
, en cambio, dejas el BytesAvailableFcnCount
en 1 y escribes todo el buffer en una sola toma?
La forma en que leo la documentación , BytesAvailableFcnCount
solo especifica el "desencadenante" de la capacidad del búfer antes de que se vacíe, no de lo grande que pueda ser el búfer. Por lo tanto, tener un BytesAvailableFcnCount
de 1 y escribir en un búfer de tamaño (digamos) 128 en una sola toma puede ir al dispositivo solo una vez, en lugar de 128 veces, lo que hace su código actual.