本文介紹了MATLAB SIMULINK對加工編程(串口通信)?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
如何從MATLAB SIMULINK(串行發送擋路)發送一些數據并在處理編程中接收該值?我完全需要一個浮點型或整型。
我使用的是虛擬串行端口,例如用于Simulink串行配置的COM1和用于處理的COM2。
推薦答案
您可以使用Processing Serial Library與串行端口連接。
一旦選擇了”快速且臟”選項,則將數據作為字符串從Simulink發送,該字符串以換行符('
)結尾。
'
使用bufferUntil('
和
')serialEvent()
的組合,您可以偵聽完整的字符串(可以是整型字符串或浮點型字符串),只需對其進行分析即可。
以下是上面示例的修改版本,用于說明解析:
// Example by Tom Igoe
import processing.serial.*;
Serial myPort; // The serial port
PFont myFont; // The display font
String inString; // Input string from serial port
int lf = 10; // ASCII linefeed
void setup() {
size(400,200);
// You'll need to make this font with the Create Font Tool
myFont = loadFont("ArialMS-18.vlw");
textFont(myFont, 18);
// List all the available serial ports:
printArray(Serial.list());
// I know that the first port in the serial list on my mac
// is always my Keyspan adaptor, so I open Serial.list()[0].
// Open whatever port is the one you're using.
myPort = new Serial(this, Serial.list()[0], 9600);
myPort.bufferUntil(lf);
}
void draw() {
background(0);
text("received: " + inString, 10,50);
}
void serialEvent(Serial p) {
inString = p.readString();
// if we received a valid string from Simulink
if(inString != null && inString.length() > 0){
// trim white space (
, etc.)
inString = inString.trim();
// parse value
int valueAsInt = int(inString);
float valueAsFloat = float(inString);
println("received: ", valueAsInt, valueAsFloat);
}
}
注意上面的內容沒有經過測試(因為我沒有Simulink),但是它應該說明了這個想法。(記住在運行之前仔細檢查并更新使用的串行端口,當然還要匹配Simulink和Processing之間的波特率)。
這將是一種簡單的方法,但不是非常有效的方法,因為您將為浮點值發送多個字節。
如果您只需要發送一個最大255(一個字節)的int,則只需在處理中使用readByte()
即可。如果您需要發送一個更大的整數(例如,16位或32位整數),那么您將需要類似readBytes()
的內容來緩沖單個字節,然后將它們放在一起形成一個更大的更高精度的整數。(與彩車類似)。
很多年前,我記得我和一位才華橫溢的工程師一起研究機器人,他使用的是Simulink,但我們沒有使用Serial,而是簡單地使用本地機器上的套接字來讓軟件相互通信。在那個場景中,因為我們需要恒定的快速數據流,所以我們使用了UDP套接字(在處理過程中可以由oscP5 library處理)。也許值得檢查一下是否有用于UDP上的OSC(Open Sound Control,開放聲音控制)協議的Simulink插件/庫。這將使使用整型/浮點型打包命名消息變得更加容易,因為您不必從頭開始構建通信協議。
這篇關于MATLAB SIMULINK對加工編程(串口通信)?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,