Android平板电脑上没有从com到usb的消息
我需要帮助! 我需要在Android平板电脑上通过COM端口将一些NMEA数据从设备发送到USB端口。当我将我的silab CP210x UART桥接器连接到平板电脑时,它会自动启动我的程序,但当我尝试发送一些数据时,我的程序看不到它。我正在为android库()使用usb串行接口。我遵循github的所有指示。 这是我的密码:Android平板电脑上没有从com到usb的消息,android,serial-port,usb,nmea,Android,Serial Port,Usb,Nmea,我需要帮助! 我需要在Android平板电脑上通过COM端口将一些NMEA数据从设备发送到USB端口。当我将我的silab CP210x UART桥接器连接到平板电脑时,它会自动启动我的程序,但当我尝试发送一些数据时,我的程序看不到它。我正在为android库()使用usb串行接口。我遵循github的所有指示。 这是我的密码: package com.example.simplexyplotactivity; import java.io.IOException; import andro
package com.example.simplexyplotactivity;
import java.io.IOException;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.PointF;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.util.EventLog;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import com.androidplot.Plot;
import com.androidplot.ui.SizeLayoutType;
import com.androidplot.ui.SizeMetrics;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.PointLabelFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbDevice;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
public class Simple_xy_plot_example extends Activity implements OnTouchListener {
private int com_cnt;
private String buf;
private String[] fields;
private int buf_max_length;
private int buf_idx;
private boolean buf_started;
public float course=0;
SoundPool sound_pool;
int rot_sound_ID;
private static final String ACTION_USB_PERMISSION ="com.prolific.pl2303hxdsimpletest.USB_PERMISSION";
private static final int SERIES_SIZE = 200;
private XYPlot plotOne;
private SimpleXYSeries series1 = null;
private PointF minXY;
private PointF maxXY;
NMEA_Receiver data;
private Thread myThread;
private String str;
private String stroka;
float zoomRatio = 2, leftBoundary, rightBoundary;
USB2ComDetector mUSB2ComDetector;
Handler CBhandler;
private UsbManager usb_manager;
private static UsbSerialPort ser_port = null;
ComponentName service_name;
byte temp_buf[]=new byte[4096];
private class MyPlotUpdater implements Observer {
Plot plot;
public MyPlotUpdater(Plot plot) {
this.plot = plot;
}
@Override
public void update(Observable o, Object arg) {
plot.redraw();
}
}
private boolean USB2ComConnect() {
/*if (ser_port != null) return false;
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usb_manager);
if (availableDrivers.isEmpty()) {
} else {
// open connection to first avail. driver
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = usb_manager.openDevice(driver.getDevice());
if (connection == null) {
} else { // Read some data! Most have just one port (port 0).
List<UsbSerialPort> myPortList = driver.getPorts();
UsbSerialPort port = myPortList.get(0);
try {
port.open(connection);
port.setParameters(4800, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); // sets baud rate,databits, stopbits, & parity
byte temp_buf[]=new byte[4096]; // 1 byte per pressure sensor, plus 2 bytes for carriage return
int numBytesRead = port.read(temp_buf, 1000);
String arduinoData = new String(temp_buf, "US-ASCII");
Toast.makeText(getApplicationContext(), arduinoData, Toast.LENGTH_SHORT).show(); // Toast debugging
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Error: couldn't read data from USB device", Toast.LENGTH_LONG).show(); // Toast debugging
}
}
}
/* List<UsbSerialPort> ports=availableDrivers.get(0).getPorts();
ser_port=ports.get(0);
UsbDeviceConnection connection=usb_manager.openDevice(ser_port.getDriver().getDevice());
try {
ser_port.open(connection);
ser_port.setParameters(4800, UsbSerialPort.DATABITS_8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
ser_port.purgeHwBuffers(true, true);
} catch (IOException e) {
Log.e("NMEAParser", "Cant open or set parameter to serial port");
e.printStackTrace();
return true;
}*/
return false;
}
//**********
public boolean IsCOMopened(){return ser_port!=null?true:false;}
private MyPlotUpdater plotUpdater;
public void onResume() {
// kick off the data generating thread:
myThread = new Thread(data);
myThread.start();
super.onResume();
// try {
// data.EnableRec(true);
// } catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
// }
}
public void stopThread() {
keepRunning = false;
}
@Override
public void onPause() {
// data.stopThread();
super.onPause();
}
private boolean keepRunning = false;
class NMEA_Receiver implements Runnable {
private static final int SAMPLE_SIZE = 30;
public int k = 1;
private int kk = 1;
private UsbSerialDriver driver;
private boolean rec_enabled=false;//enable/disable when cable plug in/off
private boolean rec_alive=true;//to terminate thread when stop app
byte rec_buf[]=new byte[256];
boolean rec_started=false;
boolean trans_started;
private boolean buf_started;
private String buf;
int rec_idx=0;
NMEA_Receiver(UsbSerialDriver driver){
this.driver=driver;
}
public void stopThread() {
keepRunning = false;
}
synchronized private void SuspendRec(){
}
synchronized public void EnableRec(boolean en) throws IOException {
rec_enabled = en;
UsbDevice dev;
if (en) {
try {
//driver.open();
//driver.setBaudRate(4800);
}
catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
//driver.close();
}
}
// ***********************************************************************************
// ***********************************************************************************
String GetRecBuf(){
return new String(rec_buf);
}
// ***********************************************************************************
public int Transmit(String tr_buf){
return 1;
}
// ***********************************************************************************
public boolean IsCOMMConnected(){
// return mPL2303.isConnected();
return false;
}
public void run() {
//byte temp_buf[]=new byte[4096];
int yy1;
int yy2;
int yy3;
int yy4;
int yy5;
int i=0;
int length=0;
try {
length=ser_port.read(temp_buf, 1000);
} catch (Exception e) {
e.printStackTrace();
}
String str2;
String str3, str4, str5;
boolean terminate=false;
keepRunning = true;
while (keepRunning) {
str5=temp_buf.toString();
Toast toast = Toast.makeText(getApplicationContext(),
str5, Toast.LENGTH_SHORT);
toast.show();
for(int k=0;k<length;k++){
if (temp_buf[0]=='$') {
buf_started = true;
}
if(buf_started){
buf+=(char)temp_buf[k];
if(temp_buf[k]=='\n'){
str = buf;
yy1 = Character.getNumericValue(str.charAt(7));
if (str.charAt(8) == '.') {
str3 = String.valueOf(str.charAt(8));
str2 = "" + yy1 + str3;
} else {
yy2 = Character.getNumericValue(str.charAt(8));
str2 = "" + yy1 + yy2;
}
if (str.charAt(9) == '.') {
str4 = String.valueOf(str.charAt(9));
str2 = str2 + str4;
} else {
if ((str.charAt(9) >= '0' && str.charAt(9) <= '9')) {
yy3 = Character.getNumericValue(str.charAt(9));
str2 = str2 + yy3;
}
}
if (str.charAt(10) == '.') {
str4 = String.valueOf(str.charAt(10));
str2 = str2 + str4;
} else if ((str.charAt(10) >= '0' && str.charAt(10) <= '9')) {
yy4 = Character.getNumericValue(str.charAt(10));
str2 = str2 + yy4;
}
if ((str.charAt(11) >= '0' && str.charAt(11) <= '9')) {
yy5 = Character.getNumericValue(str.charAt(11));
str2 = str2 + yy5;
}
course = Float.parseFloat(str2); //добавить необходимое число
kk++;
series1.addLast(kk, course);
plotOne.setRangeLabel(String.valueOf(course));
plotOne.redraw();// для выведения глубины
}
}
}
}
}
public Number getY(int series, int max) {
return 1;
}
}
public class USB2ComDetector extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent arg1) {
//try {
//data.EnableRec(false);
//} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_xy_plot_example);
// USB2ComConnect();
// try{
// USB2ComConnect();}
// catch (NullPointerException e){
// e.printStackTrace();
// }
// UsbManager usb_mngr=(UsbManager)getSystemService(Context.USB_SERVICE);
// List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usb_mngr);
//if(availableDrivers.isEmpty()==false){
// List<UsbSerialPort> ports=availableDrivers.get(0).getPorts();
// UsbDeviceConnection connection=usb_mngr.openDevice(ports.get(0).getDriver().getDevice());
// }
//
//UsbSerialDriver driver = UsbSerialProber.getDefaultProber().findAllDrivers(usb_manager);
//data = new NMEA_Receiver();
try {
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.isEmpty()){
Toast toast = Toast.makeText(getApplicationContext(),
"FAIL", Toast.LENGTH_SHORT);
toast.show();
}
//try {
// data.EnableRec(true);
//} catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();}
} catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
return;
}
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
return;
}
// Read some data! Most have just one port (port 0).
List<UsbSerialPort> myPortList = driver.getPorts();
UsbSerialPort port = myPortList.get(0);
try {
port.open(connection);
port.setParameters(4800, 8, UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE); // sets baud rate,databits, stopbits, & parity
} catch (IOException e) {
Toast.makeText(getApplicationContext(),"Error: couldn't read data from USB device",Toast.LENGTH_LONG).show(); // Toast debugging
}
mUSB2ComDetector=new USB2ComDetector();
IntentFilter filter=new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mUSB2ComDetector,filter);
sound_pool=new SoundPool(1, AudioManager.STREAM_MUSIC,0);
rot_sound_ID=sound_pool.load("/system/media/audio/ui/VideoRecord.ogg",1 );
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//plot setup
plotOne = (XYPlot) findViewById(R.id.myFirstXYPlot);
plotOne.setOnTouchListener(this);
plotOne.getGraphWidget().setTicksPerRangeLabel(2);
plotOne.getGraphWidget().setTicksPerDomainLabel(2);
plotOne.getGraphWidget().setRangeLabelWidth(25);
//plotOne.setRangeLabel("");
plotOne.setDomainLabel("");
plotOne.setBorderStyle(Plot.BorderStyle.NONE, null, null);
plotOne.getLayoutManager().remove(plotOne.getLegendWidget());
plotOne.getGraphWidget().setSize(new SizeMetrics(0,SizeLayoutType.FILL,
0, SizeLayoutType.FILL));
plotOne.setPlotMargins(0,0,0,0);
//********
//series setup
series1 = new SimpleXYSeries("PARAM");
series1.useImplicitXVals();
LineAndPointFormatter line1 = new LineAndPointFormatter();
line1.setPointLabelFormatter(new PointLabelFormatter());
plotOne.addSeries(series1, line1);
plotOne.redraw();
plotOne.calculateMinMaxVals();
minXY = new PointF(plotOne.getCalculatedMinX().floatValue(),
plotOne.getCalculatedMinY().floatValue());
maxXY = new PointF(plotOne.getCalculatedMaxX().floatValue(),
plotOne.getCalculatedMaxY().floatValue());
leftBoundary = series1.getX(0).floatValue();
rightBoundary = series1.getX(series1.size() - 1).floatValue();
}
//*****************
// Definition of the touch states
static final int NONE = 0;
static final int ONE_FINGER_DRAG = 1;
static final int TWO_FINGERS_DRAG = 2;
int mode = NONE;
PointF firstFinger;
float distBetweenFingers;
boolean stopThread = false;
@Override
public boolean onTouch(View arg0, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: // Start gesture
firstFinger = new PointF(event.getX(), event.getY());
mode = ONE_FINGER_DRAG;
stopThread = true;
break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP:
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_DOWN: // second finger
distBetweenFingers = spacing(event);
// the distance check is done to avoid false alarms
if (distBetweenFingers > 5f) {
mode = TWO_FINGERS_DRAG;
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == ONE_FINGER_DRAG) {
PointF oldFirstFinger = firstFinger;
firstFinger = new PointF(event.getX(), event.getY());
scroll(oldFirstFinger.x - firstFinger.x);
plotOne.setDomainBoundaries(minXY.x, maxXY.x,
BoundaryMode.FIXED);
plotOne.redraw();
} else if (mode == TWO_FINGERS_DRAG) {
float oldDist = distBetweenFingers;
distBetweenFingers = spacing(event);
zoom(oldDist / distBetweenFingers);
plotOne.setDomainBoundaries(minXY.x, maxXY.x,
BoundaryMode.FIXED);
plotOne.redraw();
}
break;
}
return true;
}
private void zoom(float scale) {
float domainSpan = maxXY.x - minXY.x;
float oldMax = maxXY.x;
float oldMin = minXY.x;
float domainMidPoint = maxXY.x - (domainSpan / 2.0f);
float offset = domainSpan * scale / 2.0f;
minXY.x = domainMidPoint - offset;
maxXY.x = domainMidPoint + offset;
float newSpan = maxXY.x - minXY.x;
if (newSpan < (float)5) {
minXY.x = oldMin;
maxXY.x = oldMax;
}
if (minXY.x < leftBoundary) {
minXY.x = leftBoundary;
maxXY.x = leftBoundary + domainSpan * zoomRatio;
if (maxXY.x > series1.getX(series1.size() - 1).floatValue())
maxXY.x = rightBoundary;
}
if (maxXY.x > series1.getX(series1.size() - 1).floatValue()) {
maxXY.x = rightBoundary;
minXY.x = rightBoundary - domainSpan * zoomRatio;
if (minXY.x < leftBoundary) minXY.x = leftBoundary;
}
}
private void scroll(float pan) {
float domainSpan = maxXY.x - minXY.x;
float step = domainSpan / plotOne.getWidth();
float offset = pan * step;
minXY.x = minXY.x + offset;
maxXY.x = maxXY.x + offset;
if (minXY.x < leftBoundary) {
minXY.x = leftBoundary;
maxXY.x = leftBoundary + domainSpan;
}
if (maxXY.x > series1.getX(series1.size() - 1).floatValue()) {
maxXY.x = rightBoundary;
minXY.x = rightBoundary - domainSpan;
}
}
private float spacing(MotionEvent
event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
}
package com.example.simplexyplotactivity;
导入java.io.IOException;
导入android.app.Activity;
导入android.content.BroadcastReceiver;
导入android.content.ComponentName;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.graphics.PointF;
导入android.hardware.usb.UsbDeviceConnection;
导入android.hardware.usb.UsbManager;
导入android.media.AudioManager;
导入android.media.SoundPool;
导入android.os.Bundle;
导入android.util.EventLog;
导入android.util.FloatMath;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.view.OnTouchListener;
导入android.view.WindowManager;
导入java.util.List;
导入java.util.Observable;
导入java.util.Observer;
导入com.androidplot.Plot;
导入com.androidplot.ui.SizeLayoutType;
导入com.androidplot.ui.SizeMetrics;
导入com.androidplot.xy.BoundaryMode;
导入com.androidplot.xy.LineAndPointFormatter;
导入com.androidplot.xy.PointLabelFormatter;
导入com.androidplot.xy.SimpleXYSeries;
导入com.androidplot.xy.XYPlot;
导入com.hoho.android.usbserial.driver.UsbSerialDriver;
导入com.hoho.android.usbserial.driver.UsbSerialProber;
导入com.hoho.android.usbserial.driver.UsbSerialPort;
导入android.hardware.usb.UsbDevice;
导入android.hardware.usb.UsbManager;
导入android.hardware.usb.UsbDevice;
导入android.os.Handler;
导入android.os.Message;
导入android.widget.Toast;
公共类Simple_xy_plot_示例将活动实现扩展到了TouchListener{
私人国际公司;
私有字符串buf;
私有字符串[]字段;
私有内部最大长度;
私人国际机场;
私有布尔buf_启动;
公共浮动航线=0;
声水池声水池;
int rot_sound_ID;
私有静态最终字符串操作\u USB\u PERMISSION=“com.prolific.pl2303hxdsimpletest.USB\u PERMISSION”;
专用静态最终整数系列_尺寸=200;
私有xyplotone;
私有SimpleXYSeries系列1=null;
私有点f minXY;
私有点f maxXY;
NMEA_接收机数据;
私有线程读取;
私有字符串str;
私有字符串stroka;
float zoomRatio=2,leftBoundary,righboundary;
USB2ComDetector mUSB2ComDetector;
处理程序CBhandler;
专用usb管理器usb_管理器;
专用静态UsbSerialPort ser_port=null;
组件名称服务名称;
字节temp_buf[]=新字节[4096];
私有类MyPlotUpdater实现了Observer{
情节;
公共MyPlotUpdater(绘图){
this.plot=绘图;
}
@凌驾
公共无效更新(可观察o,对象arg){
plot.redraw();
}
}
专用布尔值USB2ComConnect(){
/*if(ser_port!=null)返回false;
List availableDrivers=UsbSerialProber.getDefaultProber().findAllDrivers(usb_管理器);
if(availableDrivers.isEmpty()){
}否则{
//打开与first avail.driver的连接
UsbSerialDriver driver=availableDrivers.get(0);
usbdeviconnection connection=usb_manager.openDevice(driver.getDevice());
if(连接==null){
}else{//读取一些数据!大多数只有一个端口(端口0)。
List myPortList=driver.getPorts();
UsbSerialPort port=myPortList.get(0);
试一试{
端口。打开(连接);
port.setParameters(4800,8,UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE);//设置波特率、数据位、停止位和奇偶校验
字节temp_buf[]=新字节[4096];//每个压力传感器1个字节,外加2个用于回车的字节
int numBytesRead=端口读取(温度为1000);
String arduinoData=新字符串(temp_buf,“US-ASCII”);
Toast.makeText(getApplicationContext(),arduinoData,Toast.LENGTH_SHORT).show();//Toast调试
}捕获(IOE异常){
Toast.makeText(getApplicationContext(),“错误:无法从USB设备读取数据”,Toast.LENGTH_LONG.show();//Toast调试
}
}
}
/*List ports=availableDrivers.get(0.getPorts();
ser_port=ports.get(0);
usbdeviconnection connection=usb_manager.openDevice(ser_port.getDriver().getDevice());
试一试{
ser_端口打开(连接);
ser_port.setParameters(4800,UsbSerialPort.DATABITS_8,UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE);
ser_端口purgeHwBuffers(真,真);
}捕获(IOE异常){
Log.e(“nMessager”,“无法打开或将参数设置为串行端口”);
e、 printStackTrace();
返回true;
}*/
返回false;
}
//**********
公共布尔IsCOMopened(){return ser_port!=null?true:false;}
私有MyPlotUpdater plotUpdater;
恢复时公开作废(){
//启动数据生成线程:
myThread=新线程(数据);
myThread.start();
super.onResume();
//试一试{
//data.EnableRec(真);
//}捕获(IOE异常){
//TODO自动生成的捕捉块
//e.printStackTrace();
// }
}
公共void stopThread(){
保持修剪=错误;
}
@凌驾
公共无效暂停(){
//data.stopThread();
super.onPause();
}
私有布尔基