【问题标题】:Error disabling serialEvent?禁用 serialEvent 时出错?
【发布时间】:2017-06-18 19:27:47
【问题描述】:

好的,我已经非常简化了这个问题。我正在尝试将编码器电机反馈发送到将显示在处理中的处理。但错误是这样的: 为“COM3”null 禁用 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++;
}

【问题讨论】:

  • 正确缩进你的代码。这不容易阅读。
  • @JLH 我已经编辑了这个问题,您现在可以再次查看。

标签: python arduino processing avr avr-gcc


【解决方案1】:

您正在硬编码"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 而不是您的整个项目。

【讨论】:

  • 非常确定 COM3 的事情,因为我进入设备管理器并在将其写入代码之前检查了它,机器人也通过蓝牙完美地由 GUI 控制,但来自机器人的编码器反馈无法到来进行处理,我们收到上述错误。
  • 我已经发布了具有类似错误的最小示例。
【解决方案2】:

您必须做的一件事是对您在 ISR 中修改的变量使用 volatile 关键字。请在 StackOverflow 或任何地方阅读此处,了解您为什么需要 volatile。如果您在 ISR 中修改纯 int,则几乎可以保证您的代码不起作用。这是我最先想到的。

我想知道的另一件事是使用低速串行通信电机位置编码。除非您的电机运动非常缓慢,否则您将需要使用快速中断来捕获编码器信号。这是非常规的,可能不会像您预期的那样工作。

【讨论】:

  • 好吧 9600 是我认为足以传输数据的波特率。是的,我正在使用非常快的中断来捕获编码器信号,因为我在尝试在 arduino 串行监视器上进行串行通信之前已经预先检查过它。编码器工作得非常好,中断速度足以捕捉编码器信号。我唯一怀疑问题在于传输或接收处理中的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多