从串口读取数据并实时绘图

时间:2017-02-01 19:36:29

标签: matlab arduino

我希望从Arduino Uno板上的温度传感器获取数据并让matlab存储数据,同时还可以实时绘制图表上的数据以监控传感器变化。最终将使用不同的传感器实现这一点,这更像是一个概念验证。我有两个问题困扰着我:

1)我需要每秒1000x收集数据点(我目前的代码不能这样做)

2)经过几秒钟监测数据后,大量噪音进入系统

这是我的matlab代码

SerialPort = 'com6';

s = serial(SerialPort, 'BaudRate', 250000, 'DataBits', 8);

fopen(s);

voltage = 0;

t = 0;

y = 1;

voltage = fscanf(s);
VoltageValue(y,1)=str2double(voltage);
h = animatedline(t,VoltageValue(y,1));

xlim([0 1000]);
ylim([100 200]);


tic
while t <= 1000
voltage = fscanf(s);
VoltageValue(y,1)=str2double(voltage);
addpoints(h, t, VoltageValue(y,1));
 t= t+1;
 y= y+1;
 drawnow
end
toc

fclose(s);
delete(s);
clear s;

这是我的arduino代码

int tmppin = 0;

void setup() {
  // put your setup code here, to run once:

Serial.begin(250000);
pinMode(tmppin, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

int tempreading = analogRead(tmppin);

Serial.println(tempreading);
}

2 个答案:

答案 0 :(得分:0)

根据我的尝试,38400bd的串行通信足以在1kHz发送一个int。你可以使用115200bds;你的速度不支持500000bds,即使它通常有效。

ADC在1000Hz时没有问题。 Arduino命令analogRead的工作频率为10kHz;如果你直接访问atmel MCU的寄存器,你可以将analogRead加速到100kHz。

使用drawnow减慢了您的代码速度。你不需要在1kHz刷新;如果你以10Hz刷新,那将是你眼睛的实时。

在arduino sketch中你应该放一个delay(1)(1ms),所以你知道串口缓冲区不会满了。

答案 1 :(得分:0)

此外,为了加快传输速度,以二进制形式发送数据将大大有助于您使用Serial.println(tempreading);以字符串形式发送数据。表示它将每次发送6个字符。 (5个字符+ CR)。以二进制形式发送仅需要2个字节。 ;已经是3倍的速度增量。
要在arduino中以二进制形式发送数据,请使用

serial.write(data_to_send>>8);        //send most significant byte
serial.write( data_to_send && f);     //send least significant byte