IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android串口通信 -> 正文阅读

[移动开发]android串口通信

开始学android,在串口上卡了十几个小时后靠GitHub解放了我。

首先是这个库:

https://github.com/mik3y/usb-serial-for-android

按照大佬的指示,第一步添加库引用:

Add jitpack.io repository to your root build.gradle:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Add library to dependencies

dependencies {
    implementation 'com.github.mik3y:usb-serial-for-android:3.4.2'
}

使用新版android studio的时候要注意,

maven { url 'https://jitpack.io' }

这段代码要放在setting.gradle里面。。。不然会报错说找不到。

第二步添加程序读写USB的权限。在自己的AndroidManifest.xml里面加如下内容。

<activity
    android:name="..."
    ...>
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
    <meta-data
        android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
        android:resource="@xml/device_filter" />
</activity>

然后在studio中新建device_filter.xml文件,如下图

第三步,开始写代码

代码很简单,两按钮,一个打开串口一个关闭串口。打开串口后根据协议读温度显示在TextView上。串口七合一空气采样模块的说明和购买链接见https://item.taobao.com/item.htm?spm=a230r.1.14.24.61c02c16A0NTtD&id=568535232415&ns=1&abbucket=3#detail

public class MainActivity extends AppCompatActivity {
    UsbSerialPort port;
    SerialInputOutputManager usbio;
    ArrayList<Byte> buffer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_openport=(Button) this.findViewById(R.id.open_port);
        TextView tx=(TextView) this.findViewById(R.id.serial_data);
        btn_openport.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
                List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
                if (availableDrivers.isEmpty()) {
                    return;
                }

                // Open a connection to the first available driver.
                UsbSerialDriver driver = availableDrivers.get(0);
                UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
                if (connection == null) {
                    // add UsbManager.requestPermission(driver.getDevice(), ..) handling here
                    return;
                }

                port = driver.getPorts().get(0); // Most devices have just one port (port 0)
                try{
                    port.open(connection);
                    port.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
                    Log.i("port","open success");
                    buffer=new ArrayList<Byte>();
                    usbio=new SerialInputOutputManager(port, new SerialInputOutputManager.Listener() {
                        @Override
                        public void onNewData(byte[] data) {
                            Log.i("port read size",String.valueOf(data.length));
                            if(data.length>0){
                                for(int i=0;i<data.length;i++){
                                    buffer.add(data[i]);
                                    Log.i("port read",String.valueOf(data[i]));
                                }
                                if(buffer.size()>=17){
                                    for(int i=0;i<buffer.size();i++){
                                        if(buffer.get(i)==0x3c && buffer.get(i+1)==0x02 && (i+17)<=buffer.size()){
                                            Log.i("tmp",String.valueOf(buffer.get(i+12)));
                                            String temp=String.valueOf(buffer.get(i+12))+"."+String.valueOf(buffer.get(i+13));
                                            runOnUiThread(() -> {tx.setText(temp);});//把温度显示在UI上,中断函数不允许操作UI,所以要另开一个线程
                                            buffer.clear();
                                        }
                                    }
                                }
                            }
                        }

                        @Override
                        public void onRunError(Exception e) {

                        }
                    });
                    usbio.start();


                }
                catch (IOException e){

                }



            }
        });
        Button btn_closeport=(Button) this.findViewById(R.id.close_port);
        btn_closeport.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try{
                    usbio.stop();
                    port.close();
                    Log.i("port","close port");
                }
                catch (IOException e){

                }

            }
        });
    }
}

需要注意的就是onNewData基本上每来1个字节就触发一次,因为9600的波特率太低了,1ms来一个字节。。。所以需要自己维护一个数组或者队列,当数组或队列的长度足够大且检测到有一串完整协议数据的时候读出温度值 。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:16:16  更:2021-09-06 11:17:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:33:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码