android实现串口接入

1. 硬件准备

  • USB OTG支持:确保你的安卓设备支持USB On-The-Go(OTG)。大多数现代手机都支持这一功能,但为了保险起见,可以在购买前确认或通过测试应用检测。

  • 串口转换器:准备一个兼容Android的USB-to-Serial转换器。常见的芯片包括FT232、PL2303和CP210x。这些设备带有相应的驱动程序,确保它们与安卓系统的兼容性。

2. 安装开发环境

  1. 安装Android Studio

    • 从Google官方网站下载并安装最新版本的Android Studio。
  2. 配置开发者选项

    • 打开手机的"设置">>"关于手机",连续点击"Build Number"七次以解锁开发者模式。
    • 返回"设置">>“系统”>>“开发者选项”,启用“USB调试”和“Root访问”。
  3. 安装ADB工具

    • 在计算机上安装Android SDK,并确保ADB命令可在终端中运行。可以通过验证adb devices是否列出连接的装置来确认安装成功。

3. 创建新项目

  1. 启动Android Studio,创建一个新的Android项目。

  2. 选择 Empty Activity 模板,以便从简单的UI界面开始构建项目。

4. 添加必要的权限

AndroidManifest.xml中注册所需的应用权限:


此外,如果你的应用需要访问特定的USB设备,建议声明硬件附加功能:

5. 集成串口通信库

为了简化开发过程,推荐使用流行的开源串口通信库,如UsbSerial。通过添加以下依赖项到你的build.gradle文件中:

dependencies {
    implementation 'com.github.mik3y/usb-serial-for-android:usbSerial:2.1.0'
}

然后同步项目以下载和安装相关库。

6. 实现串口通信逻辑

以下是一个基本的示例,展示如何初始化、打开串口以及读取数据:

MainActivity.java:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.github.mik3y.usbserial.UsbSerial;
import com.github.mik3y.usbserial.UsbSerialInterface;

public class MainActivity extends Activity {

    private static final String TAG = "SerialPort";
    private Button connectButton, sendButton;
    //private TextView statusTextView, dataReceivedTextView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化按钮点击事件
        connectButton = (Button) findViewById(R.id.connect_button);
        sendButton = (Button) findViewById(R.id.send_button);
        
        setButtonListeners();
    }

    private void setButtonListeners() {
        connectButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 连接串口设备
                onConnect(v);
            }
        });

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 发送数据到串口
                String message = "Hello, Android!";
                sendData(message);
            }
        });
    }

    private void onConnect(View view) {
        UsbSerial device = findUsbDevice();
        if (device != null) {
            try {
                device.open();
                device.setBaudRate(9600); // 设置波特率
                device.setDataBits(8);
                device.setParity(UsbSerial.PARITY_NONE);
                device.setStopBits(UsbSerial.STOP_BITS_1);

                String receivedData = device.read(1024);
                Log.d(TAG, "接收到数据: " + receivedData);
                
            } catch (Exception e) {
                e.printStackTrace();
                Log.e(TAG, "无法打开设备" + e.getMessage());
            }
        } else {
            Log.w(TAG,"未找到指定的串口设备");
        }
    }

    private void sendData(String message) {
        try {
            UsbSerial device = findUsbDevice();
            if (device != null && device.isOpen()) {
                byte[] data = message.getBytes();
                device.write(data);
                Log.i(TAG, "成功发送:" + message);
            } else {
                throw new RuntimeException("设备未连接");
            }
        } catch (Exception e) {
            Log.e(TAG, "数据发送失败:" + e.getMessage());
        }
    }

    private UsbSerial findUsbDevice() {
        // 使用库方法查找连接的USB串口设备
        return UsbSerial.find UsbManager manager = (UsbManager) getSystemService(USB_SERVICE);
        for (UsbDevice device : manager.getDeviceList().values()) {
            if (device.getInterfaceCount() > 0 && 
                device.getVendorId() == YOUR_VID && // 替换为实际设备VID
                device.getProductId() == YOUR_PID) { // 替换为实际设备PID
                
               return UsbSerial.createUsbSerial(device, false);
            }
        }
        return null;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (device != null && device.isOpen()) {
            try {
                device.close();
            } catch (IOException e) {
                Log.e(TAG, "关闭设备失败");
            }
        }
    }
}

7. 设计用户界面

修改activity_main.xml,添加以下组件:




    

8. 处理权限和意图过滤

在应用首次运行时,系统会根据连接的硬件设备自动触发intent。为了确保正确处理这些intent,需要添加相关权限以及定义intent filter。

修改AndroidManifest.xml:



        
            
                
            
            
            
        

    ....

然后在res/xml/目录下创建一个新的文件device_filter.xml,内容如下:



    

请将 YOUR_VID 和 YOUR_PID 替换为你的串口设备的实际VID和PID。

9. 测试应用程序

按照以下步骤进行测试:

  1. 将Android设备连接到计算机
  2. 在开发者选项中启用USB调试
  3. 使用数据线将硬件设备接入手机,确保驱动已正确安装
  4. 打开你的串口通信应用,点击“连接串口”按钮
  5. 输入要发送的文本内容,并点击“发送数据”
  6. 在日志或界面中查看是否成功收到反馈

注意事项:

  • 确保所有操作都是在子线程进行,以避免阻塞主UI线程
  • 处理可能发生的异常和错误,如设备未连接、权限不够等
  • 确认硬件设备支持OTG模式(或使用适当的转换器)
  • 对于不同厂商的串口设备,可能需要进行不同的初始化设置,请参考其资料

你可能感兴趣的:(物联网,android,串口)