首页 文章

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

提问于
浏览
0

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

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

2)在监测数据几秒钟后,大量噪声进入系统

Here is my matlab code

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;

Here is my arduino code

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

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

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

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

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

  • 0

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

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

相关问题