2012-03-10 80 views
1

我是一个总noob。我的目标是通过udp发送传感器数据(陀螺仪磁铁)。另一方面,matlab将接收数据。如何通过udp发送传感器值

  1. 如果传感器未注册,我可以发送一个udp数据包。
  2. 如果我不使用udp发送数据,我可以显示传感器。
  3. 我不能同时做两个!

此代码应该读取加速度计并显示它,同时它会尝试每隔2000毫秒异步发送一个预定义的udp数据包。 但它无法运行!有什么建议么? 我的代码是这样的:

public class udp_sensors_matlab extends Activity implements SensorEventListener{ 
/** Called when the activity is first created. */ 
SensorManager sensorManager = null; 

//for accelerometer values 
TextView outputX; 
TextView outputY; 
TextView outputZ; 

String messageStr="test udp"; 
String ip; 
udpOut task; 
int server_port = 12345; 
DatagramSocket s = null; 
int msg_length=messageStr.length(); 
byte[] message = messageStr.getBytes(); 
InetAddress local = null; 
DatagramPacket p=null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
    //just some textviews, for data output 
    outputX = (TextView) findViewById(R.id.TextView01); 
    outputY = (TextView) findViewById(R.id.TextView02); 
    outputZ = (TextView) findViewById(R.id.TextView03); 
    try { 
     s = new DatagramSocket(); 
    } catch (SocketException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     local = InetAddress.getByName("81.31.187.32"); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    task = new udpOut(); 
    task.execute("g"); 
    timer= new Timer(); 
    timerTask=new TimerTask(){ @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     task = new udpOut(); 
     task.execute("g"); 
    }}; 
    timer.scheduleAtFixedRate(timerTask, 2000, 2000); 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); 
} 
@Override 
protected void onStop() { 
    super.onStop(); 
    sensorManager.unregisterListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)); 
} 
synchronized public void onSensorChanged(SensorEvent event) { 

     switch (event.sensor.getType()){ 
      case Sensor.TYPE_ACCELEROMETER: 
       outputX.setText("\tx:"+Float.toString(event.values[0])); 
       outputY.setText("\ty:"+Float.toString(event.values[1])); 
       outputZ.setText("\tz:"+Float.toString(event.values[2])); 
      break; 
    } 
} 
@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) {} 

class udpOut extends AsyncTask <String, Integer, Long> { 

    protected Long doInBackground(String... messageStr) { 
     p = new DatagramPacket(message, msg_length,local,server_port); 
     try { 
      s.send(p); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    protected void onProgressUpdate() { 
    } 
} 
+0

嗨,想知道你是否能够修复你的代码?我正在做同样的事情,它可以是很好,如果你能分享你如何修复它;谢谢你的朋友:) – 2014-06-19 15:18:30

回答

1

我建议通过与调试器单步执行代码,看看是否让你对什么是/是没有发生更具体的信息。当你试图同时做这两件事时,你是否会遇到任何异常?您还应该使用AlarmManager而不是TimerTask。 @CommonsWare在AlarmManager上有很多很好的信息,例如:Android: How to use AlarmManager

下面是一个使用Eclipse调试器的教程:http://www.vogella.de/articles/EclipseDebugging/article.html

根据我对Android的经验,最好在异常之前尝试设置一个断点并从那里开始。否则,如果您只是在发生调试器时才能解密异常,则很难。

+0

谢谢你的重播。有没有关于如何使用eclipse和监视exeptions进行调试的教程? (我对matlab有相当的经验,但对我很惭愧,我不知道如何在eclipse中进行调试。) – misalu2001 2012-03-10 16:18:12

+0

在上面添加了一个链接,如果你是Google的话,还有更多。还增加了一些额外的建议。 – elevine 2012-03-10 17:05:46

+0

@elevine想知道你是否能够修复你的代码?我正在做同样的事情,它可以很好,如果你可以分享你如何修复它:)感谢buddy – 2014-06-19 13:55:07