2017-06-18 1 views
-2

okayh j'ai beaucoup simplifié la question. J'essaie d'envoyer le signal du moteur du codeur au traitement qui sera affiché sur le traitement. mais l'erreur vient quelque chose comme: erreur désactivant serialEvent pour "COM3" null? traitement:Erreur lors de la désactivation de 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/Code 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

Indentez correctement votre code. Ce n'est pas facile à lire. – TomServo

+0

@JLH J'ai édité la question que vous pouvez vérifier à nouveau maintenant. –

Répondre

0

Vous hardcoding "COM3" - êtes-vous sûr que le port est correct?

De 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); 

Notez que ce code utilise la fonction Serial.list() pour lister les ports valides. Essayez d'utiliser ceci pour déterminer quels ports sont utilisés.

Si vous ne parvenez toujours pas à le faire fonctionner, veuillez publier un minimal example au lieu de l'ensemble de votre projet.

+0

assez sûr de la chose COM3 parce que je suis allé dans le gestionnaire de périphériques et vérifié avant de l'écrire dans le code aussi le bot est contrôlé par GUi parfaitement par bluetooth, mais le retour d'encodeur de bot est incapable de traiter et nous obtenons le erreur comme indiqué ci-dessus. –

+0

J'ai posté l'exemple minimal ayant l'erreur similaire. –

0

Une chose que vous devez faire est d'utiliser le mot-clé volatile pour les variables que vous modifiez dans les ISR. S'il vous plaît lire ici sur StackOverflow - ou n'importe où - sur pourquoi vous avez besoin volatile. Votre code est presque garanti de ne pas fonctionner si vous modifiez un int dans un ISR. C'est la première chose qui me saute aux yeux.

L'autre chose que je m'interroge est l'utilisation de série à faible vitesse pour communiquer le codage de la position du moteur. À moins que votre moteur ne bouge très lentement, vous devrez utiliser des interruptions rapides pour attraper les signaux de votre encodeur. Ceci est très peu conventionnel et ne fonctionnera probablement pas comme prévu.

+0

bien 9600 est le débit en bauds qui je pense est suffisant pour transmettre les données. et oui j'utilise des interruptions qui sont assez rapides pour attraper les signaux de l'encodeur comme je l'ai vérifié avant d'essayer la communication série sur le moniteur série arduino. les encodeurs fonctionnent parfaitement bien avec des interruptions assez rapides pour capter le signal de l'encodeur. la seule chose dans laquelle je doute que le problème soit dans la transmission ou dans la réception des données dans le traitement. –