安卓实现串口通信

1、串口通信232的接线

一般通讯使用232串口的话,我们会用到2、3、5接口,根据安卓平板的标记依次接线(小白注意:接收端要与发送端接入,不要根据名称一样就接线)

2、导入第三方文件包

将以下包文件导入,然后遍历一下整个工程文件。

    //串口
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.jakewharton:butterknife:8.8.1'
    implementation 'com.jakewharton:butterknife:10.2.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'

    implementation 'tp.xmaihh:serialport:2.1'

 3、创建串口连接类serialport

package com.example.PipetterRobot.until;

import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

import java.io.IOException;
import java.io.InputStream;

import tp.xmaihh.serialport.SerialHelper;
import tp.xmaihh.serialport.bean.ComBean;
import tp.xmaihh.serialport.stick.AbsStickPackageHelper;

public class serialport {
    public static SerialHelper serialHelper;
    public static 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;
        }
    });

    public static void initSerialConfig() {
        //初始化SerialHelper对象,设定串口名称和波特率
        serialHelper = new SerialHelper(Const.SPORT_NAME, Const.BAUD_RATE) {
            @Override
            protected void onDataReceived(ComBean paramComBean) {
                Message message = mHandler.obtainMessage();
                message.obj = paramComBean;
                mHandler.sendMessage(message);
            }
        };

        /*
         * 默认的BaseStickPackageHelper将接收的数据扩展成64位,一般用不到这么多位
         * 我这里重新设定一个自适应数据位数的
         */

        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;
            }
        });
    }

}

 4、创建类文件Const,主要用于存取串口号和波特率,该方法可以设置成动态变量,目前该工程是定死的,可以自己更改

package com.example.PipetterRobot.until;


public class Const {

    //串口 波特率
    public static final String SPORT_NAME = "/dev/ttyS1";
    public static final int BAUD_RATE = 9600;

    public static final String TXT_TYPE_SEND = "hello";
    public static final String HEX_TYPE_SEND = "123ABC";
}

5、打开串口,该方法可以直接写在你需要的点击事件里面直接用,使用之前一定要在界面oncreat中初始化一下串口配置

        serialport.initSerialConfig();
  if (serialport.serialHelper.isOpen()) {
                    Toast.makeText(LisActivity.this, Const.SPORT_NAME + "串口已经打开", Toast.LENGTH_SHORT).show();
                    return;
                }
                try {
                    serialport.serialHelper.open();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Toast.makeText(LisActivity.this, Const.SPORT_NAME + "串口打开成功", Toast.LENGTH_SHORT).show();

6、发送数据。直接将该方法复制到你的点击事件里面,我写了一个for循环传输,可以自己改

if (!serialHelper.isOpen()) {
                    Toast.makeText(getActivity(), Const.SPORT_NAME + "串口没打开 发送失败", Toast.LENGTH_SHORT).show();
                    return;
                }
                for(int i = 0;i<20;i++){
                    String sendContent = "*PR96|" + (5+i) + "|1|" + (10+i);
                    serialHelper.sendTxt(sendContent);
                }

7、关闭串口

        serialHelper.close();
        serialHelper = null;
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Android Studio实现串口通信,您需要遵循以下步骤: 1. 配置权限:在AndroidManifest.xml文件中添加以下行: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.WRITE_PROFILE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.BODY_SENSORS" /> <uses-permission android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <uses-permission android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> <uses-feature android:name="android.hardware.usb.host" /> ``` 2. 添加依赖项:在build.gradle文件中添加以下依赖项: ``` dependencies { implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation files('libs/usbSerialForAndroid.jar') } ``` 3. 添加代码:在您的Android Studio项目中添加以下代码: ``` public class MainActivity extends AppCompatActivity implements UsbSerialInterface.UsbReadCallback { private static final String TAG = MainActivity.class.getSimpleName(); private UsbManager usbManager; private UsbDevice device; private UsbSerialDevice serialPort; private UsbDeviceConnection connection; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.text_view); usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(usbReceiver, filter); //获取设备列表 HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); if (!deviceList.isEmpty()) { boolean keep = true; for (UsbDevice device : deviceList.values()) { // 判断设备VID和PID是否符合 if (device.getVendorId() == 0x1a86 && device.getProductId() == 0x7523) { // 找到设备 this.device = device; Log.i(TAG, "找到设备"); break; } else { connection = null; this.device = null; } } if (device == null) { Log.e(TAG, "没有找到设备"); return; } } else { Log.e(TAG, "没有设备"); return; } // 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯 connection = usbManager.openDevice(device); if (connection == null) { Log.e(TAG, "连接失败"); return; } serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection); if (serialPort != null) { if (serialPort.open()) { // 开启设备 //设置波特率 serialPort.setBaudRate(9600); //设置数据位 serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); //设置停止位 serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); //设置校验位 serialPort.setParity(UsbSerialInterface.PARITY_NONE); //设置流控制 serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); // 开启读取线程,开始接收数据 serialPort.read(this); Log.i(TAG, "连接成功"); } else { serialPort.close(); Log.e(TAG, "开启设备失败"); } } else { Log.e(TAG, "没有找到设备"); } } @Override public void onReceivedData(byte[] bytes) { // 接收到数据的回调 runOnUiThread(() -> { String s = new String(bytes); textView.setText(s); }); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(usbReceiver); if (serialPort != null) { serialPort.close(); } } private BroadcastReceiver usbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // USB设备插入 Log.i(TAG, "USB设备已插入"); } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // USB设备拔出 Log.i(TAG, "USB设备已拔出"); } } }; } ``` 在这个示例中,我们使用了USB to TTL串口模块。请注意,您需要正确设置波特率、数据位、停止位、校验位和流控制,以便与您的设备通信。 希望这个步骤能够帮助您在Android Studio实现串口通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天三公里,为地球减重

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值