求一个Xamarin下用C#编写的Android 串口通信的实例

只需要简单的连接串口,完成数据的收发即可。硬件环境是手机连接CH340,CH340连接其它设备。感激不尽!

以下是使用C#在Xamarin.Android中实现串口通信的简单示例代码,假设连接串口的设备为CH340,使用了开源库“SerialPort”。

using System.IO;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Widget;
using Android.Hardware.Usb;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Util;
using Java.IO;
using Java.Lang;
using Java.Util;

namespace SerialPortSample
{
    [Activity(Label = "SerialPortSample", MainLauncher = true)]
    public class MainActivity : Activity
    {
        private static readonly string TAG = "SerialPortSample";
        private SerialPort mSerialPort;
        private InputStream mInputStream;
        private OutputStream mOutputStream;
        private Button mButtonSend;
        private EditText mEditText;

        private const int REQUEST_PERMISSIONS = 1;

        private readonly string[] PERMISSIONS = {
            Android.Manifest.Permission.WriteExternalStorage,
            Android.Manifest.Permission.ReadExternalStorage
        };

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Main);

            mButtonSend = FindViewById<Button>(Resource.Id.buttonSend);
            mEditText = FindViewById<EditText>(Resource.Id.editText);

            mButtonSend.Click += (sender, e) =>
            {
                SendData();
            };

            if (CheckSelfPermission(PERMISSIONS[0]) != Permission.Granted
                    || CheckSelfPermission(PERMISSIONS[1]) != Permission.Granted)
            {
                RequestPermissions(PERMISSIONS, REQUEST_PERMISSIONS);
            }
            else
            {
                OpenSerialPort();
            }
        }

        protected override void OnDestroy()
        {
            base.OnDestroy();
            CloseSerialPort();
        }

        private void OpenSerialPort()
        {
            try
            {
                mSerialPort = new SerialPort("/dev/ttyUSB0", 9600, 0);
                mInputStream = mSerialPort.InputStream;
                mOutputStream = mSerialPort.OutputStream;
            }
            catch (IOException e)
            {
                Log.Error(TAG, "Failed to open serial port: " + e.Message);
            }
        }

        private void CloseSerialPort()
        {
            try
            {
                if (mSerialPort != null)
                {
                    mSerialPort.Close();
                    mSerialPort.Dispose();
                }
            }
            catch (IOException e)
            {
                Log.Error(TAG, "Failed to close serial port: " + e.Message);
            }
            finally
            {
                mSerialPort = null;
            }
        }

        private void SendData()
        {
            string data = mEditText.Text;

            try
            {
                byte[] bytes = Encoding.ASCII.GetBytes(data);
                mOutputStream.Write(bytes);
            }
            catch (IOException e)
            {
                Log.Error(TAG, "Failed to send data: " + e.Message);
            }
        }
    }
}


该示例中,在OnCreate()方法中,首先检查是否已授予权限。如果未授予权限,将请求授予权限。如果已授予权限,则打开串口连接。在OnDestroy()方法中关闭串口连接。

OpenSerialPort()方法打开串口连接,并创建输入和输出流。CloseSerialPort()方法关闭串口连接。SendData()方法将用户在EditText中输入的文本转换为字节数组,并使用输出流将其发送到串口设备。

需要注意的是,使用SerialPort类需要添加using Java.IO和using Java.Util命名空间,它们包含Java类SerialPort、InputStream和OutputStream,这些类提供了与串口通信相关的方法。

此外,在Xamarin.Android应用程序中使用串口通信,通常需要添加以下代码到AndroidManifest.xml文件中的标记中,以允许应用程序访问USB设备:


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

在这个示例中,我们没有使用CH340连接设备的具体细节,因为它可以与任何串口设备通信。不过,为了确保与CH340设备的通信,您需要使用与CH340的连接所需的正确波特率、数据位、停止位和校验位等参数。

博主您好,
以下是一个简单的示例,演示如何在Xamarin Android应用程序中使用C#进行串口通信,以读取和发送数据。请注意,此示例使用了一个称为**Xamarin.Android.USBSerial__**库的第三方库来简化串口通信。需要将其添加到项目中。

首先,需要在**MainActivity.cs__文件中添加以下代码来检测是否连接了CH340__**设备:

private UsbManager usbManager;
private UsbSerialDriver serialDriver;
private UsbDevice device;

private void CheckDevice()
{
    usbManager = (UsbManager)GetSystemService(Context.UsbService);

    var usbDevices = usbManager.DeviceList;
    if (usbDevices.Count == 0)
    {
        Toast.MakeText(this, "No USB devices found!", ToastLength.Long).Show();
        return;
    }

    foreach (var usbDevice in usbDevices.Values)
    {
        if (usbDevice.VendorId == 6790 && usbDevice.ProductId == 29987) // VendorId and ProductId of CH340
        {
            device = usbDevice;
            break;
        }
    }

    if (device == null)
    {
        Toast.MakeText(this, "CH340 device not found!", ToastLength.Long).Show();
        return;
    }

    var permissionIntent = PendingIntent.GetBroadcast(this, 0, new Intent("com.android.example.USB_PERMISSION"), 0);
    usbManager.RequestPermission(device, permissionIntent);
}



然后,可以使用以下代码在串口上打开连接:

private UsbSerialPort serialPort;

private void OpenSerialPort()
{
    serialDriver = UsbSerial.ProbeSingleDevice(usbManager, device);
    if (serialDriver == null)
    {
        Toast.MakeText(this, "Error opening serial port!", ToastLength.Long).Show();
        return;
    }

    serialPort = serialDriver.Ports[0];
    if (serialPort == null)
    {
        Toast.MakeText(this, "Error opening serial port!", ToastLength.Long).Show();
        return;
    }

    serialPort.Open(usbManager.OpenDevice(serialDriver.Device), 115200);
    serialPort.SetParameters(115200, 8, StopBits.One, Parity.None);
}


接下来,可以使用以下代码读取和发送数据:

// Read data
var buffer = new byte[1024];
var numBytesRead = serialPort.Read(buffer, 0, buffer.Length);
var receivedData = Encoding.ASCII.GetString(buffer, 0, numBytesRead);

// Send data
var sendData = "Hello, world!";
var sendBuffer = Encoding.ASCII.GetBytes(sendData);
serialPort.Write(sendBuffer, 0, sendBuffer.Length);


最后,在OnDestroy方法中,应该关闭串口连接:

protected override void OnDestroy()
{
    base.OnDestroy();

    serialPort?.Close();
}


这是一个非常简单的示例,但希望可以为您提供一个起点来使用C#编写Xamarin Android应用程序的串口通信功能。

以下是一个使用C#编写的Xamarin Android串口通信的简单示例。其中,使用了SerialPort类来实现串口通信。建议在使用该示例前先了解SerialPort类的相关知识。


csharp
Copy code
using System;
using System.IO.Ports;
using Android.App;
using Android.Widget;
using Android.OS;
namespace SerialPortApp
{
    [Activity(Label = "SerialPortApp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        private SerialPort port;
        private Button btnConnect;
        private Button btnSend;
        private TextView txtData;
        private EditText txtCommand;
        private bool isConnected = false;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            btnConnect = FindViewById<Button>(Resource.Id.btnConnect);
            btnSend = FindViewById<Button>(Resource.Id.btnSend);
            txtData = FindViewById<TextView>(Resource.Id.txtData);
            txtCommand = FindViewById<EditText>(Resource.Id.txtCommand);
            btnConnect.Click += BtnConnect_Click;
            btnSend.Click += BtnSend_Click;
        }
        private void BtnConnect_Click(object sender, EventArgs e)
        {
            if (!isConnected)
            {
                try
                {
                    // 设置串口参数
                    port = new SerialPort("/dev/ttyUSB0", 9600, Parity.None, 8, StopBits.One);
                    port.Open();
                    port.DataReceived += Port_DataReceived;
                    isConnected = true;
                    btnConnect.Text = "断开";
                    Toast.MakeText(this, "连接成功", ToastLength.Short).Show();
                }
                catch (Exception ex)
                {
                    Toast.MakeText(this, "连接失败:" + ex.Message, ToastLength.Short).Show();
                }
            }
            else
            {
                if (port != null)
                {
                    port.DataReceived -= Port_DataReceived;
                    port.Close();
                    port.Dispose();
                    port = null;
                }
                isConnected = false;
                btnConnect.Text = "连接";
                txtData.Text = "";
                Toast.MakeText(this, "已断开", ToastLength.Short).Show();
            }
        }
        private void BtnSend_Click(object sender, EventArgs e)
        {
            if (port != null && port.IsOpen)
            {
                string command = txtCommand.Text;
                port.Write(command + "\r\n");
                Toast.MakeText(this, "发送成功", ToastLength.Short).Show();
            }
            else
            {
                Toast.MakeText(this, "请先连接串口", ToastLength.Short).Show();
            }
        }
        private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string data = port.ReadExisting();
            RunOnUiThread(() =>
            {
                txtData.Append(data);
            });
        }
        protected override void OnDestroy()
        {
            if (port != null)
            {
                port.DataReceived -= Port_DataReceived;
                port.Close();
                port.Dispose();
                port = null;
            }
            base.OnDestroy();
        }
    }
}


该示例中,通过SerialPort类实现串口的打开、关闭、数据发送和接收功能。其中,打开串口时需要指定串口的名称和波特率等参数。数据接收时,可以通过DataReceived事件来处理收到的数据。最后,在程序退出时需要关闭串口并释放资源。
需要注意的是,串口通信需要使用系统的串口设备名称,具体设备名称可以通过系统设置或者相关文档查询得到。同时,需要确保使用的串口设备与硬件设备的连接正确,并且串口参数设置正确。同时,由于串口通信可能存在数据传输异常等问题,建议在代码中加入相关异常处理和日志记录等功能。

  1. 首先,你需要添加一个 Xamarin.Android 应用程序项目,并在项目中添加 System.IO.Ports 引用,以便使用串口通信。
  1. 创建一个类,用于打开和关闭串口连接,读取和写入数据。示例代码如下:
using System;
using System.IO;
using System.IO.Ports;

namespace SerialCommunicationApp
{
    public class SerialCommunication
    {
        private SerialPort serialPort;

        public void Open(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
        {
            serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
            serialPort.Open();
        }

        public void Close()
        {
            if (serialPort != null && serialPort.IsOpen)
            {
                serialPort.Close();
            }
        }

        public string Read()
        {
            string data = "";
            if (serialPort != null && serialPort.IsOpen)
            {
                data = serialPort.ReadLine();
            }
            return data;
        }

        public void Write(string data)
        {
            if (serialPort != null && serialPort.IsOpen)
            {
                serialPort.Write(data);
            }
        }
    }
}

  1. 在主 Activity 中,实例化 SerialCommunication 类,并使用 Open 方法打开串口连接。示例代码如下:
using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Widget;

namespace SerialCommunicationApp
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        private SerialCommunication serialCommunication;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.activity_main);

            // Instantiate SerialCommunication class
            serialCommunication = new SerialCommunication();

            // Open serial port connection
            serialCommunication.Open("/dev/ttyS1", 9600, Parity.None, 8, StopBits.One);

            // Read data from serial port
            string data = serialCommunication.Read();

            // Write data to serial port
            serialCommunication.Write("Hello, World!");

            // Close serial port connection
            serialCommunication.Close();
        }
    }
}

在 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_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<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.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS

在 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_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<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.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.SERIAL_PORT" />

最后,在应用程序中使用 SerialCommunication 类的 Open、Read、Write 和 Close 方法来进行串口通信。
注意事项:

需要在 Android 设备上使用支持串口的 USB 转串口线。
串口名称和波特率应与连接的设备匹配。
需要在 AndroidManifest.xml 文件中添加串口权限才能访问串口。