2017-06-18 30 views
-2

好吧,我已經非常簡化了這個問題。我正在嘗試將編碼器電機反饋發送到將在處理中顯示的處理。但錯誤是這樣的: 錯誤禁用「COM3」null的serialEvent? 處理:禁用serialEvent錯誤?

import processing.serial.*; 
Serial port; 
int index=0; 
String lmotor,rmotor,data,status; 

void setup() 
{ 
    size(500,500); 
    port= new Serial(this, "COM3", 9600); 
    port.bufferUntil('A'); 

} 
void serialEvent(Serial port) 
{ 
    if(data!=null) 
    { 
    println(data); 
    data=port.readStringUntil('A'); 
    data=data.substring(0,data.length()-1); 
    index=data.indexOf(","); 
    lmotor= data.substring(0, index); 
    rmotor= data.substring(index+1 , data.length()); 
    } 
} 
void draw() 
{ 
    background(255); 
    textSize(100); 
    fill(random(0,255),0,random(0,255)); 
    text(lmotor,50,150); 
    textSize(100); 
    fill(0,random(0,255),random(0,255)); 
    text(rmotor, 300,150); 

} 

的Arduino/AVR代碼:

#include <avr/io.h> 
    #include <util/delay.h> 

    #define SETBIT(ADDRESS, BIT) (ADDRESS|=(1<<BIT)); 
    #define CLEARBIT(ADDRESS, BIT) (ADDRESS&=~(1<<BIT)); 
    #define CHECKBIT(ADDRESS, BIT) (ADDRESS & (1<<BIT)); 
    char c; 
    int sfl=0,sfr=0,y=0,temp; 

    void interrupt_init() 
    { 
     cli(); 
     EIMSK=0x03; 
     EICRA=0x0A; 
     sei(); 

    } 
    void encoder_pin_config_init() 
    { 
     DDRD=DDRD & 0xF3; 
     //INTERNALPULLUPS 
     SETBIT(PORTD, PD3); 
     SETBIT(PORTD, PD2); 
    } 
    void byte_init (int baud) 
    { 
     UBRR0H = (baud>>8);      // shift the register right by 8 bits 
     UBRR0L = baud;       // set baud rate 
     UCSR0B|= (1<<TXEN0)|(1<<RXEN0);    // enable receiver and transmitter 
     UCSR0C|= (1<<UCSZ00)|(1<<UCSZ01); // 8bit data format 
    } 
    void byte_transmit (unsigned char data) 
    { 
     while (!(UCSR0A & (1<<UDRE0)));    // wait while register is free 
     UDR0 = data;         // load data in the register 
    } 
    unsigned char byte_receive (void) 
    { 
     while(!(UCSR0A) & (1<<RXC0));     // wait while data is being received 
     return UDR0;         // return 8-bit data 
    } 

    void setup() { 
     interrupt_init(); 
     byte_init(103); 
     encoder_pin_config_init(); 
    Serial.begin(9600); 
    pinMode(4,HIGH); 
    pinMode(5,OUTPUT); 
    pinMode(6,OUTPUT); 
    pinMode(7,OUTPUT); 
    pinMode(9,OUTPUT); 
    pinMode(10,OUTPUT); 
    digitalWrite(9,HIGH); 
    digitalWrite(10,HIGH); 
    } 

void loop() { 

    digitalWrite(4, HIGH); 
    digitalWrite(5,LOW); 
    digitalWrite(6, HIGH); 
    digitalWrite(7,LOW); 
temp=sfl; 
while(temp>0) 
{ 
    y=temp%10; 
    c=y+'0'; 
    byte_transmit(c); 
    temp=temp/10; 

} 
byte_transmit(','); 
temp=sfr; 
while(temp>0) 
{ 
    y=temp%10; 
    c=y+'0'; 
    byte_transmit(c); 
    temp=temp/10; 

} 
byte_transmit('A'); 

digitalWrite(5,LOW); 
digitalWrite(6,LOW); 
digitalWrite(7,LOW); 
digitalWrite(4,LOW); 

} 


ISR(INT0_vect) 
{ 
    sfl++; 
} 
ISR(INT1_vect) 
{ 
    sfr++; 
} 
+0

正確縮進代碼。這並不容易閱讀。 – TomServo

+0

@JLH我已經編輯了這個問題,你現在可以再次檢查它。 –

回答

0

你硬編碼"COM3" - 你確定端口是正確的?

the Serial reference

// Example by Tom Igoe 

import processing.serial.*; 

// The serial port: 
Serial myPort;  

// List all the available serial ports: 
printArray(Serial.list()); 

// Open the port you are using at the rate you want: 
myPort = new Serial(this, Serial.list()[0], 9600); 

// Send a capital A out the serial port: 
myPort.write(65); 

請注意,此代碼使用Serial.list()功能列出有效的端口。嘗試使用此來找出哪些端口正在使用。

如果仍然無法正常工作,請發佈minimal example而不是整個項目。

+0

很確定COM3的事情,因爲我進入設備管理器,並將其寫入代碼之前檢查它也是由GUi通過藍牙完美控制機器人,但機器人的編碼器反饋無法處理,我們正在獲取錯誤如上所述。 –

+0

我發佈了具有類似錯誤的最小示例。 –

0

你必須做的一件事就是使用volatile關鍵字作爲你在ISR中修改的變量。請在這裏閱讀StackOverflow - 或任何地方 - 爲什麼你需要volatile。如果您修改ISR中的純int,那麼您的代碼幾乎可以保證不起作用。這是第一件直接跳到我身上的東西。

我想知道的另一件事是使用低速串行通信電機位置編碼。除非您的電機運動速度非常緩慢,否則您需要使用快速中斷來捕捉編碼器信號。這是非常規的,可能不會像你期望的那樣工作。

+0

well 9600是我認爲足以傳輸數據的波特率。是的,我正在使用中斷,這是非常快的捕捉編碼器信號,因爲我已經預先檢查它在嘗試Arduino串行監視器上的串行通信之前。編碼器工作得很好,中斷速度足以捕捉編碼器信號。我唯一懷疑問題是在傳輸中還是在接收處理中的數據。 –