问题描述
如何从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对加工编程(串口通信)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!