2017-08-07 39 views
1

我正在使用壓力傳感器D6F-PH來測量壓力差。這是我編寫的用於從傳感器獲取值的Arduino代碼。使用串行/ fopen錯誤(第72行)MATLAB

#include "Wire.h" 
    #define addrs 0x6C // I2C bus address 
    int P; 
    int I; 
    float T;c 

int initialize(int i2c_addr) 
{ 
    //INITIALIZATION AFTER POWER UP 
    Wire.beginTransmission(i2c_addr); 
    Wire.write(0x0B); 
    Wire.write(0x00); 
    int x = Wire.endTransmission(); 
    return x; 
} 

int pressure(int i2c_addr) 
{ 
    //MCU MODE 
    Wire.beginTransmission(i2c_addr); 
    Wire.write(0x00); 
    Wire.write(0xD0); // reg 0 - address register high byte 
    // Wire.write(0x51); // reg 1 - address register low byte 
    Wire.write(0x40); // reg 1 - address register low byte 
    Wire.write(0x18); // reg 2 - serial control register - indicate # bytes among others (page 7 bottom) 
    Wire.write(0x06); // reg 3 - value to be written to SENS control register 
    int x = Wire.endTransmission(); 

    delay(33); 

    //WRITE 
    Wire.beginTransmission(i2c_addr); 
    Wire.write(0x00); 
    Wire.write(0xD0); 
    Wire.write(0x51); 
    Wire.write(0x2C); 
    x = Wire.endTransmission(); 

    //READ 
    Wire.beginTransmission(i2c_addr); 
    Wire.write(0x07); 
    x = Wire.endTransmission(); 

    Wire.requestFrom(i2c_addr, 2); 
    byte hibyte = Wire.read(); 
    byte lobyte = Wire.read(); 
    long raw = word(hibyte, lobyte); 
    //Serial.print("raw pressure:\t "); 
    Serial.println(raw); 

    // D6F-PH5050AD3 ==> rangeMode=500 ==> int rd_pressure = ((raw - 1024) * rangeMode * 2/60000L) - rangeMode 
    // D6F-PH0505AD3 ==> rangeMode=50 ==> int rd_pressure = ((raw - 1024) * rangeMode * 2/60000L) - rangeMode 
    // D6F-PH0025AD1 ==> rangeMode=250 ==> int rd_pressure=(raw - 1024) * rangeMode/60000L 
    //int rangeMode = 50; 
    int rangeMode = 250; 
    int rd_pressure = (raw - 1024) * rangeMode/60000L; 
    //int rd_pressure = ((raw - 1024) * rangeMode * 10/60000L) - rangeMode; 
    return rd_pressure; 
} 

float temperature(int i2c_addr) 
{ 
    //MCU MODE 
    Wire.beginTransmission(i2c_addr); 
    Wire.write(0x00); 
    Wire.write(0xD0); // reg 0 - address register high byte 
    // Wire.write(0x51); // reg 1 - address register low byte 
    Wire.write(0x40); // reg 1 - address register low byte 
    Wire.write(0x18); // reg 2 - serial control register - indicate # bytes among others (page 7 bottom) 
    Wire.write(0x06); // reg 3 - value to be written to SENS control register 
    int x = Wire.endTransmission(); 

    delay(33); 

    //WRITE 
    Wire.beginTransmission(i2c_addr); 
    Wire.write(0x00); 
     Wire.write(0xD0); 
     Wire.write(0x61); 
     Wire.write(0x2C); 
     x = Wire.endTransmission(); 

     //READ 
     Wire.beginTransmission(i2c_addr); 
     Wire.write(0x07); 
     x = Wire.endTransmission(); 

     Wire.requestFrom(i2c_addr, 2); 
     byte hibyte = Wire.read(); 
     byte lobyte = Wire.read(); 
     long raw = word(hibyte, lobyte); 
     //Serial.print("raw temperature:\t "); 
     //Serial.println(raw); 
     int temp = round((float)(raw - 10214)/3.739); // this is the temperature multiplied by 10... 
     return (temp/10.0);   // ...and the function returs the float 
    temperature with 0.1°C resolution 
    } 

    void setup() 
    { // Open serial communications 
     Wire.begin(); 
     Serial.begin(9600); 
     I = initialize (addrs); // start wire connection 

    } 

    void loop() 
    { 
     P = pressure(addrs); 
     Serial.print("pressure:\t "); 
     Serial.println(P); 
     T = temperature(addrs); 
     Serial.print("temperature:\t "); 
     Serial.println(T); 
     delay(300); //delay for 30 seconds 

    } 

我可以測量壓力和使用串行監控從Arduino的UNO板的溫度。

當我嘗試使用MATLAB檢索數據時,我無法這樣做。

s=serial('COM6','BaudRate',9600); 
fopen(s); 

這是我收到的時候我嘗試打開端口的錯誤信息:採用串行/的fopen(線72) 打開失敗錯誤:無法連接到COM2端口。可能的原因是另一個 應用程序連接到端口或端口不存在。

我已經檢查過COM端口號,並且還使用了刪除(instrfindall);指揮但無濟於事。 請幫忙

回答

0

已解決。在創建與MATLAB的連接之前,我需要關閉串行監視器。