• «
  • 1
  • 2
  • 3
  • »
  • Pages: 3/3     Go
主题 : 串口读数据时,read()函数怎么用? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 49850
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2011-06-15
最后登录: 2011-06-15
20楼  发表于: 2011-06-15 22:10
我也遇到过同样的问题,不过后解决了,把代码贴出来,分享一下,大家多多指教。

import com.friendlyarm.AndroidSDK.HardwareControler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class MapGuider_Activity extends Activity{

    private int serial_fd=0;
    private byte[] serial_RevBuf=new byte[100];
    private byte[] serial_SendBuf="fsjajd".getBytes();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapguider);
        serial_fd=HardwareControler.openSerialPort("/dev/s3c2410_serial1", 115200, 8, 1);
        if(serial_fd!=-1)
        {
            System.out.println("打开串口成功");
            HardwareControler.write(serial_fd, serial_SendBuf);
            lac_handler.post(RevicePosDataThread);        
            }
        else
        {
            System.out.println("指定的串口不存在或在其它进程中已被打开");    
        }
      }
    
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        HardwareControler.close(serial_fd);
        System.out.println("关闭串口");    
        lac_handler.removeCallbacks(RevicePosDataThread);
        super.onDestroy();
    }

    Handler lac_handler =new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
        }
        
    };
    Runnable RevicePosDataThread =new Runnable()
    {
        int err=0;
        String s;
        public void run() {
            // TODO Auto-generated method stub
            while(true)
            {
            //Looper.prepare();
            err=HardwareControler.select(serial_fd, 1, 0);
            if(err==1)//有数据可读
            {
                HardwareControler.read(serial_fd, serial_RevBuf, 10);
                s=new String(serial_RevBuf);
                System.out.println("接收到串口数据"+s);
            }
            else if(err==0) //无数据可读
            {
                System.out.println("没有接收到串口数据");    
            }
            else  //出错
            {
                System.out.println("接收到串口数据出错");    
            }
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         }
        }
        
    };

}
级别: 新手上路
UID: 40703
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
综合积分: 54 分
注册时间: 2011-03-21
最后登录: 2017-09-13
21楼  发表于: 2011-06-18 23:39

 回 20楼(ywkady) 的帖子

不要用全局变量度数据,把数据封装了在线程中传递。
级别: 侠客
UID: 35779
精华: 0
发帖: 52
金钱: 260 两
威望: 52 点
综合积分: 104 分
注册时间: 2011-01-06
最后登录: 2013-12-30
22楼  发表于: 2011-09-07 14:20
为什么用20楼的代码,数据能在logcat看到,但是我的其他控件就卡住了
级别: 侠客
UID: 35779
精华: 0
发帖: 52
金钱: 260 两
威望: 52 点
综合积分: 104 分
注册时间: 2011-01-06
最后登录: 2013-12-30
23楼  发表于: 2011-09-07 14:21
logcat看到的东西是

09-07 14:16:03.700: INFO/System.out(1679): byte len:4string len :12data:7e 45 00 ff
09-07 14:16:03.700: INFO/System.out(1679): byte len:11string len :33data:ff 00 00 02 00 89 03 02 f0 41 7e
09-07 14:16:04.680: INFO/System.out(1679): byte len:15string len :45data:7e 45 00 ff ff 00 00 02 00 89 03 03 d1 51 7e
09-07 14:16:05.660: INFO/System.out(1679): byte len:15string len :45data:7e 45 00 ff ff 00 00 02 00 89 03 04 36 21 7e
09-07 14:16:06.630: INFO/System.out(1679): byte len:14string len :42data:7e 45 00 ff ff 00 00 02 00 89 03 05 17 31
09-07 14:16:06.630: INFO/System.out(1679): byte len:1string len :3data:7e
09-07 14:16:07.610: INFO/System.out(1679): byte len:15string len :45data:7e 45 00 ff ff 00 00 02 00 89 03 06 74 01 7e
09-07 14:16:08.590: INFO/System.out(1679): byte len:15string len :45data:7e 45 00 ff ff 00 00 02 00 89 03 07 55 11 7e

每次我的包好像接受不完整
级别: 侠客
UID: 35779
精华: 0
发帖: 52
金钱: 260 两
威望: 52 点
综合积分: 104 分
注册时间: 2011-01-06
最后登录: 2013-12-30
24楼  发表于: 2011-09-07 14:25
我的代码是:

package com.yxl.testserial.mini6410;
import android.R.integer;
import android.R.string;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import android.view.View;
import android.view.View.OnClickListener;
import com.friendlyarm.AndroidSDK.*;
import android.util.Log;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class datadisplay extends Activity {
    public TextView secondtxt ;
    
    public int totalbyte = 0;
    private Button clearbtn = null;
    private Button back2btn = null;
    private Button pause = null;
    private Button send = null;
    private Button stopserial = null;
    private TextView viewdata;
    private int myserialfile = 0;
    public static final String[] usbdev={"/dev/ttyUSB0"};
    int stopbits = 1;
    int databits = 8;
    long  baude = 115200;
    public String str = null;
    public byte[] buf = new byte[300] ;
    
    Boolean canreadserialBoolean = false;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        //display the second layout
        setContentView(R.layout.viewdata);

        clearbtn = (Button)findViewById(R.id.btnclear);
        back2btn   = (Button)findViewById(R.id.secondbtnback);
        pause  = (Button)findViewById(R.id.btnpause);
        send  = (Button)findViewById(R.id.btnsend);
        stopserial  = (Button)findViewById(R.id.stopserial);
        viewdata = (TextView)findViewById(R.id.textviewdatadisplay);
        clearbtn.setOnClickListener(listener);
        back2btn.setOnClickListener(listener);
        pause.setOnClickListener(listener);
        send.setOnClickListener(listener);
        stopserial.setOnClickListener(listener);
        
    }
    @Override
    protected void onDestroy() {
        if(canreadserialBoolean == true)
        {
            //close serial
            HardwareControler.close(myserialfile); //关闭串口
            Log.d("rubin","in onDestroy close the serial");
            System.out.println("close the serial");
            lac_handler.removeCallbacks(ReceivePostDataThread);
            super.onDestroy();
        }
    }
    
    Handler lac_handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            super.handleMessage(msg);
        }
    };
    
    Runnable ReceivePostDataThread = new Runnable()
    {
        int err = 0;
        
        @Override
        
        public void run() {
            // TODO Auto-generated method stub
            while(true)
            {
                err = HardwareControler.select(myserialfile, 0, 100);
                if(err == 1)
                {
                    //have data come
                    int len = HardwareControler.read(myserialfile, buf, 200);
                    String s = "";
//                    char[] ch = null;
//                    System.out.println("byte len:"+buf[0]+" "+buf[1]);
                    for(int i = 0;i<len ;i++)
                    {
                        //s +=  Integer.toHexString(buf&0xff);
                        int b = buf&(0xff);
                        //when the data is single one
                        if(b>=0 && b < 16 )
                        {
                            s= s +"0";
                        }
                        s += Integer.toHexString(b);
                        /*
                        if(s.length() == 1)
                        {
                            s="0"+s+" ";
                            System.out.print("xx");
                    
                        }*/                        
                            s= s+" ";
                    }
                    
                    //ch = s.toCharArray();
//                    s = new String(buf,0,len);
                    //viewdata.setText(s);
                    
                    System.out.println("byte len:"+len+"string len :"+s.length()+"data:"+s);
//                    for(int j =0;j<ch.length;j++)
//                        System.out.print(ch[j]+" ");
//                    System.out.println();
                    
                }
                else if (err == 0)
                {
                    viewdata.setText("no data");
                }
                else
                {
                    viewdata.setText("error");
                }
                try {
                    Thread.sleep(2);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
            }
        }
    };
    private OnClickListener listener = new OnClickListener()
    {
        
        @Override
        public void onClick(View v)
        {
            Button btn = (Button) v;
            switch (btn.getId()) {
            case R.id.secondbtnback:
                System.out.println("back in second activity\n");
                Intent changeintent = new Intent();
                changeintent.setClass(datadisplay.this, Testserial_1Activity.class);
                startActivity(changeintent);
                break;
            case R.id.btnclear:
                
                myserialfile = HardwareControler.openSerialPort(usbdev[0], baude, databits, stopbits);
                if(myserialfile != -1)
                {
                    viewdata.setText("串口打开成功");
                    System.out.println("serial open success");
                    canreadserialBoolean = true;
                    lac_handler.post(ReceivePostDataThread);
                    System.out.println("lol >"+buf.length);
                }
                else
                {
                    System.out.println("串口打开失败");
                    Log.d("rubin", "open fail");
                    viewdata.setText("串口打开失败");
                    canreadserialBoolean = false;
                }
                System.out.println("btnclear"+myserialfile);
                break;
            //定义数据位
            case R.id.btnpause:
                System.out.println("btnpause\n");
                break;
            case R.id.btnsend:
                System.out.println("btnsend\n");
                break;
            case R.id.stopserial:
                if(canreadserialBoolean == true)
                {
                    viewdata.setText("close serial");
                    System.out.println("stopserial\n");
                    HardwareControler.close(myserialfile); //关闭串口
                    
                }
                else
                {
                    viewdata.setText("serial does not open please open the serial");
                }
                
                
                break;
            default:
                break;
            }
            
        }
    };

}
  • «
  • 1
  • 2
  • 3
  • »
  • Pages: 3/3     Go