• «
  • 1
  • 2
  • 3
  • »
  • Pages: 1/3     Go
主题 : 串口读数据时,read()函数怎么用? 复制链接 | 浏览器收藏 | 打印
学无止境
级别: 新手上路
UID: 41406
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
综合积分: 76 分
注册时间: 2011-03-29
最后登录: 2011-10-15
楼主  发表于: 2011-05-30 22:13

 串口读数据时,read()函数怎么用?

小弟在使用android系统的s3c2410_serial2口,在电脑上用串口调试助手调试,向6410板子上发送数据,程序总是运行到read()时就自动退出,不知道怎么回事?已经检查出了openSerialPort和select都正常,纠结ing
级别: 侠客
UID: 42175
精华: 0
发帖: 75
金钱: 375 两
威望: 75 点
综合积分: 150 分
注册时间: 2011-04-05
最后登录: 2012-01-30
1楼  发表于: 2011-05-31 09:03

 回 楼主(风月连城) 的帖子

每一次不断地用read只会阻塞,你要先用select函数来看串口是否有数据到来,有的话才用read读数据出来。
学无止境
级别: 新手上路
UID: 41406
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
综合积分: 76 分
注册时间: 2011-03-29
最后登录: 2011-10-15
2楼  发表于: 2011-05-31 09:21

 回 1楼(fll8888) 的帖子

对啊 我是先select的,read是在select的判断语句里
级别: 侠客
UID: 42175
精华: 0
发帖: 75
金钱: 375 两
威望: 75 点
综合积分: 150 分
注册时间: 2011-04-05
最后登录: 2012-01-30
3楼  发表于: 2011-05-31 09:22

 回 2楼(风月连城) 的帖子

你写的是android程序吗?
学无止境
级别: 新手上路
UID: 41406
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
综合积分: 76 分
注册时间: 2011-03-29
最后登录: 2011-10-15
4楼  发表于: 2011-05-31 16:38

 回 3楼(fll8888) 的帖子

恩 是的  我的程序很简单 就是当有数据过来的时候 用TextView显示出来 下面是我的主要程序

private TextView myTextView;
HardwareControler seri = new HardwareControler();
String str;
byte[] str1;
int fd;

myTextView=(TextView)findViewById(R.id.myView);
fd=HardwareControler.openSerialPort("/dev/s3c2410_serial2", 19200, 8, 1);

if(seri.select(fd,100,0)==1)
        {
        seri.read(fd, str1, 300);
        str=str1.toString();
        myTextView.setText(str);
        seri.close(fd);
        }
级别: 侠客
UID: 42175
精华: 0
发帖: 75
金钱: 375 两
威望: 75 点
综合积分: 150 分
注册时间: 2011-04-05
最后登录: 2012-01-30
5楼  发表于: 2011-05-31 22:30

 回 4楼(风月连城) 的帖子

把select放在线程里面用好点吧!
学无止境
级别: 新手上路
UID: 41406
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
综合积分: 76 分
注册时间: 2011-03-29
最后登录: 2011-10-15
6楼  发表于: 2011-06-09 09:31

 回 5楼(fll8888) 的帖子

我把程序改了下,但数据来了还是一运行到read()就退出。你帮看看能不能改善下啊 原意是一按button按钮就接受数据显示在EditText里的,但运行的时候要是有数据来,到read()程序就退出,我晕死,导师说进度完全停滞了。。。。帮帮我啊大哥

public class Read4 extends Activity {
    /** Called when the activity is first created. */
    int fd;
    HardwareControler seri = new HardwareControler();
    Handler handler=new Handler();
    Runnable updateThread=new Runnable(){
      public void run(){
        EditText myView=(EditText)findViewById(R.id.myView);
        int fuck=seri.select(fd,0,100);
        if(fuck==1)
                                     {
            System.out.println("1234");
            System.out.println("5678");
            byte[] str1=null;
            seri.read(fd, str1, 300);
                                                       String str=str1.toString();
                                                       myView.setText(str);
            handler.postDelayed(updateThread, 3000);
                                }
    }
};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        fd=HardwareControler.openSerialPort("/dev/s3c2410_serial2", 19200, 8, 1);
        Button showButton=(Button)findViewById(R.id.show);
        class showButtonListener implements OnClickListener{
            public void onClick(View v){
                handler.post(updateThread);
            }
        }
        showButton.setOnClickListener(new showButtonListener());
}  
级别: 新手上路
UID: 42212
精华: 0
发帖: 42
金钱: 210 两
威望: 42 点
综合积分: 84 分
注册时间: 2011-04-06
最后登录: 2012-03-25
7楼  发表于: 2011-06-09 11:05
byte[] str1=null;
seri.read(fd, str1, 300);

这个问题吧,读数据的缓冲区不能是null,它不会帮你分配内存再返回给你的,你要自己new,改做
byte[] str1=new byte[300];
seri.read(fd, str1, 300);

试试
级别: 侠客
UID: 42175
精华: 0
发帖: 75
金钱: 375 两
威望: 75 点
综合积分: 150 分
注册时间: 2011-04-05
最后登录: 2012-01-30
8楼  发表于: 2011-06-09 11:25
你试试这样。

Timer timer = new Timer();
final Handler handler = new Handler(){
public void handleMessage(Message msg){
EditText readdisplay = (EditText) findViewById(R.id.readdisplay);
switch(msg.what){
case 1:{
readdisplay.setText(readserial.toString());
}
break;
}
super.handleMessage(msg);
}
};
TimerTask task = new TimerTask(){
public void run(){
Message message = new Message();
message.what = 1;
readserial = serial.ComRd(0, 50, 600);
handler.sendMessage(message);
}
};
级别: 侠客
UID: 42175
精华: 0
发帖: 75
金钱: 375 两
威望: 75 点
综合积分: 150 分
注册时间: 2011-04-05
最后登录: 2012-01-30
9楼  发表于: 2011-06-09 11:28
我在c文件里面再做select和read函数的读取数据的。
  • «
  • 1
  • 2
  • 3
  • »
  • Pages: 1/3     Go