文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

快速开发和使用Android串口

2023-09-01 12:34

关注

        串口叫做串行接口,也称串行通信接口,也可以叫做COM口,按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB等。串行接口是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

串口通讯是一个字符一个字符地传输,每个字符一位一位地传输,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率。 

        通过使用serialport库,直接上代码 :

第一步导包:

// 在项目根目录的build.gradle文件中添加:
allprojects {
    repositories {
        ...
        mavenCentral()
    }
}
// 在项目Module下的build.gradle文件中添加:
dependencies {
    implementation 'io.github.xmaihh:serialport:2.1.1'
}

第二步代码:

import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.support.annotation.RequiresApi;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.RadioGroup;import android.widget.Toast;import com.alibaba.fastjson.JSONObject;import java.io.IOException;import java.io.InputStream;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;import tp.xmaihh.serialport.SerialHelper;import tp.xmaihh.serialport.bean.ComBean;import tp.xmaihh.serialport.stick.AbsStickPackageHelper;import tp.xmaihh.serialport.utils.ByteUtil;public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {    @BindView(R.id.rg_type)    RadioGroup mRgType;    @BindView(R.id.et_read_content)    EditText mEtReadContent;    @BindView(R.id.et_send_content)    EditText mEtSendContent;    private SerialHelper serialHelper;    private boolean isHexType = false;    private String text = "";    private Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            ComBean comBean = (ComBean) msg.obj;            String time = comBean.sRecTime;            String rxText;            rxText = new String(comBean.bRec);            if (isHexType) {                //转成十六进制数据                rxText = ByteUtil.ByteArrToHex(comBean.bRec);            }            text += "Rx-> " + time + ": " + rxText + "\r" + "\n";            mEtReadContent.setText(text);            return false;        }    });    @RequiresApi(api = Build.VERSION_CODES.M)    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        mRgType.setOnCheckedChangeListener(this);        initSerialConfig();    }    private void initSerialConfig() {        //初始化SerialHelper对象,设定串口名称和波特率(此处为接收扫码数据)        serialHelper = new SerialHelper("/dev/ttyACM0", 9600) {            @Override            protected void onDataReceived(ComBean paramComBean) {                Message message = mHandler.obtainMessage();                message.obj = paramComBean;                Log.e("TAG", "onDataReceived: " + JSONObject.toJSONString(message.obj));                mHandler.sendMessage(message);            }        };                serialHelper.setStickPackageHelper(new AbsStickPackageHelper() {            @Override            public byte[] execute(InputStream is) {                try {                    int available = is.available();                    if (available > 0) {                        byte[] buffer = new byte[available];                        int size = is.read(buffer);                        if (size > 0) {return buffer;                        }                    } else {                        SystemClock.sleep(50);                    }                } catch (IOException e) {                    e.printStackTrace();                }                return null;            }        });    }    @OnClick({R.id.bt_open, R.id.bt_close, R.id.bt_send, R.id.bt_clear_content})    public void onButtonClicked(View view){        switch (view.getId()) {            case R.id.bt_open:                if (serialHelper.isOpen()) {                    Toast.makeText(this, Const.SPORT_NAME + "串口已经打开", Toast.LENGTH_SHORT).show();                    return;                }                try {                    serialHelper.open();                } catch (IOException e) {                    e.printStackTrace();                }                Toast.makeText(this, Const.SPORT_NAME + "串口打开成功", Toast.LENGTH_SHORT).show();                break;            case R.id.bt_close:                if (serialHelper.isOpen()) {                    serialHelper.close();                    Toast.makeText(this, Const.SPORT_NAME + "串口已经关闭", Toast.LENGTH_SHORT).show();                }                break;            case R.id.bt_clear_content:                text = "";                mEtReadContent.setText(text);                break;            case R.id.bt_send:                if (!serialHelper.isOpen()) {                    Toast.makeText(this, Const.SPORT_NAME + "串口没打开 发送失败", Toast.LENGTH_SHORT).show();                    return;                }                String sendContent = mEtSendContent.getText().toString();                if (isHexType) {                    serialHelper.sendHex(sendContent);                } else {                    serialHelper.sendTxt(sendContent);                }                break;        }    }    @Override    public void onCheckedChanged(RadioGroup group, int checkedId) {        switch (checkedId) {            case R.id.rb_txt:                isHexType = false;                mEtSendContent.setText(Const.TXT_TYPE_SEND);                break;            case R.id.rb_hex:                isHexType = true;                mEtSendContent.setText(Const.HEX_TYPE_SEND);                break;        }    }    @Override    protected void onDestroy() {        super.onDestroy();        serialHelper.close();        serialHelper = null;    }}
                

 第三步说明:

        上面代码,在创建serialHelper之时,就已经传入了一个onDataReceived()方法,用来监听串口数据接收,但是如要打开串口才能开启监听。

SerialHelper创建完成,打开串口

serialHelper.open();

如果需要设置其他的属性,比如设置奇偶检验,需要在执行open()之前设定。

serialHelper.setPort(String sPort);      //设置串口
serialHelper.setBaudRate(int iBaud);     //设置波特率
serialHelper.setStopBits(int stopBits);  //设置停止位
serialHelper.setDataBits(int dataBits);  //设置数据位
serialHelper.setParity(int parity);      //设置校验位
serialHelper.setFlowCon(int flowcon);    //设置流控

发送数据

serialHelper.send(byte[] bOutArray); // 发送byte[]
serialHelper.sendHex(String sHex);  // 发送Hex
serialHelper.sendTxt(String sTxt);  // 发送ASCII

关闭串口

serialHelper.close(); 

效果图 

Android串口使用2之使用Google官方库android-serialport-api_android-serialport-api使用_Steven Jon的博客-CSDN博客

mirrors / xmaihh / Android-Serialport · GitCode 

来源地址:https://blog.csdn.net/weixin_43192102/article/details/131000951

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯