嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
引用Android.UsbSerial 程序集;设备采用Type_C 转USB转换器与USB红外设备进行连接,根据设备类型在程序集中匹配合适驱动,通过报文的编码逻辑组织报文,以达到数据发送和接收的目的。
using Android.Icu.Text; using Android.Telephony.Euicc; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Hoho.Android.UsbSerial.Driver; using MauiUsbSerialForAndroid.Converter; using MauiUsbSerialForAndroid.Helper; using MauiUsbSerialForAndroid.Model; using Microsoft.Maui.Controls.Compatibility.Platform.Android; using System.Collections.ObjectModel; using System.Text; using System.Text.RegularExpressions;
namespace MauiUsbSerialForAndroid.ViewModel { [ObservableObject] public partial class SerialDataViewModel : IQueryAttributable { [ObservableProperty] bool isOpen = false; public UsbDeviceInfo DeviceInfo { get; set; } public string[] AllEncoding { get; } = new string[] { "HEX", "ASCII", "UTF-8", "GBK", "GB2312", "Unicode" }; public int[] AllBaudRate { get; } = new[] { 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 43000, 57600, 76800, 115200, 128000, 230400, 256000, 460800, 921600, 1382400 }; public int[] AllDataBits { get; } = new[] { 5, 6, 7, 8 }; public string[] AllParity { get; } = Enum.GetNames(typeof(Parity)); public string[] AllStopBits { get; } = Enum.GetNames(typeof(StopBits));
[ObservableProperty] string encodingSend = "HEX"; [ObservableProperty] string encodingReceive = "HEX"; [ObservableProperty] int intervalReceive = 50; [ObservableProperty] int intervalSend = 1000; [ObservableProperty] bool cycleToSend = false; [ObservableProperty] bool showTimeStamp = true; [ObservableProperty] bool autoScroll = true; [ObservableProperty] string sendData = ""; [ObservableProperty] SerialOption serialOption = new SerialOption(); [ObservableProperty] string softName = ""; // 终端地址; [ObservableProperty] string terminalAddr = "20785593"; //终端操作; [ObservableProperty] string terminalOperation = ""; //测量点操作; [ObservableProperty] string pointOperation = ""; //测量点编号; [ObservableProperty] string pointIndex = ""; //终端操作; [ObservableProperty] bool terminalChecked = true; //测量点操作; [ObservableProperty] bool pointChecked; //信息操作; [ObservableProperty] bool msgChecked; public ObservableCollection<SerialLog> Datas { get; } = new(); System.Timers.Timer timerSend; [ObservableProperty] string receivedText; public SerialDataViewModel() { SerialPortHelper.WhenDataReceived().Subscribe(data => { ReceivedText = SerialPortHelper.GetData(data, EncodingReceive); //Shell.Current.DisplayAlert("TooFast", ReceivedText, "ok"); if (receivedText.Length > 0) { AddLog(new SerialLog($"{TerminalAddr}: {TerminalOperation} 成功", false)); } else { AddLog(new SerialLog($"{TerminalAddr}: {TerminalOperation} 失败", false)); } //AddLog(new SerialLog($"终端地址:{convertedText}", false)); //AddLog(new SerialLog($"终端地址:{convertedText}", false)); }); timerSend = new System.Timers.Timer(intervalSend); timerSend.Elapsed = TimerSend_Elapsed; timerSend.Enabled = false;
SerialPortHelper.WhenUsbDeviceAttached((usbDevice) => { if (usbDevice.DeviceId == DeviceInfo.Device.DeviceId) { AddLog(new SerialLog("Usb device attached", false)); Open(); } });
SerialPortHelper.WhenUsbDeviceDetached((usbDevice) => { if (usbDevice.DeviceId == DeviceInfo.Device.DeviceId) { AddLog(new SerialLog("Usb device detached", false)); Close(); } }); } private void TimerSend_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Send(); } partial void OnIntervalReceiveChanged(int value) { SerialPortHelper.IntervalChange(value); } async partial void OnIntervalSendChanged(int value) { if (value < 5) { await Shell.Current.DisplayAlert("TooFast", "Set at least 5 milliseconds", "ok"); IntervalSend = 5; } timerSend.Interval = IntervalSend; } partial void OnCycleToSendChanged(bool value) { timerSend.Enabled = value; } Regex regHexRemove = new Regex("[^a-fA-F0-9 ]"); partial void OnSendDataChanged(string value) { if (EncodingSend == "HEX") { string temp = regHexRemove.Replace(value, ""); if (SendData != temp) { Shell.Current.DisplayAlert("Only hex", "Only HEX characters can be entered", "Ok"); SendData = temp; } } } public void ApplyQueryAttributes(IDictionary<string, object> query) { if (query.ContainsKey("Serial")) { DeviceInfo = (UsbDeviceInfo)query["Serial"]; Open(); } } [RelayCommand] public void Toggle() { if (IsOpen) { Close(); } else { Open(); } } [RelayCommand] public async void Open() { if (!IsOpen) { string r = await SerialPortHelper.RequestPermissionAsync(DeviceInfo); if (SerialPortHelper.CheckError(r, showDialog: false)) { r = SerialPortHelper.Open(DeviceInfo, SerialOption); if (SerialPortHelper.CheckError(r, showDialog: false)) { IsOpen = true; } else { AddLog(new SerialLog(r, false)); } } else { AddLog(new SerialLog(r, false)); } } } [RelayCommand] public void Close() { try { SerialPortHelper.Close(); CycleToSend = false; IsOpen = false; } catch (Exception) { } } [RelayCommand] public void Clear() { Datas.Clear(); } /// <summary> /// 发送信息,先判断是何种操作; /// </summary> [RelayCommand] public void Send() { if (SoftName.Length == 0) { Shell.Current.DisplayAlert("Choose right softname", "请选择合适的操作软件!", "Ok"); } else { if ("二层集抄".Equals(SoftName)) { EcjcConverter ecjc = new EcjcConverter(); if (terminalChecked is true) //如果是终端操作; { if (TerminalOperation.Equals("读终端地址")) { SendData = ecjc.ReadAddressMethod(TerminalAddr);
} else if ("写终端地址".Equals(TerminalOperation)) { SendData=ecjc.WriteAddressMethod(TerminalAddr);
} else if ("硬件初始化".Equals(TerminalOperation)) { SendData = ecjc.HardwareFormatingMethod(TerminalAddr);
} else if ("数据区初始化".Equals(TerminalOperation)) { SendData = ecjc.DataAreaFormatingMethod(TerminalAddr);
} } } // 不是二层集抄 else if ("GW376".Equals(SoftName)) { Gw376Converter gw376 = new Gw376Converter(); if (terminalChecked is true) //如果是终端操作; { if (TerminalOperation.Equals("读终端地址")) { SendData=gw376.ReadAddressMethod(TerminalAddr);
} else if ("写终端地址".Equals(TerminalOperation)) { SendData=gw376.WriteAddressMethod(this.terminalAddr);
} else if ("硬件初始化".Equals(TerminalOperation)) { SendData = gw376.HardwareFormatingMethod(TerminalAddr);
} else if ("数据区初始化".Equals(TerminalOperation)) { SendData=gw376.DataAreaFormatingMethod(TerminalAddr); } } } byte[] send = SerialPortHelper.GetBytes(SendData, EncodingSend); if (send.Length == 0) { return; } string s = SerialPortHelper.Write(send);
if (SerialPortHelper.CheckError(s)) { if (EncodingSend == "HEX") { //AddLog(new SerialLog(SendData.ToUpper(), true)); AddLog(new SerialLog($"{terminalOperation}:{TerminalAddr}", true)); } else { AddLog(new SerialLog(SendData, true)); } } else { AddLog(new SerialLog(s, true)); } } } [RelayCommand] public async void Back() { Close(); await Shell.Current.GoToAsync(".."); } void AddLog(SerialLog serialLog) { Datas.Add(serialLog);
//fix VirtualView cannot be null here Task.Delay(50); } [RelayCommand] void SerialOptionChange() { SerialPortHelper.SetOption(serialOption); } } } |
using CommunityToolkit.Mvvm.ComponentModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MauiUsbSerialForAndroid.Helper; using System.Collections.ObjectModel; using Hoho.Android.UsbSerial.Driver; using Android.Hardware.Usb; using CommunityToolkit.Mvvm.Input; using MauiUsbSerialForAndroid.Model; using MauiUsbSerialForAndroid.View; using Android.OS; using Android.Content; using Android.Util;
namespace MauiUsbSerialForAndroid.ViewModel { [ObservableObject] public partial class SerialPortViewModel : IQueryAttributable {
bool openIng = false; public ObservableCollection<UsbDeviceInfo> UsbDevices { get; } = new(); public SerialPortViewModel() { SerialPortHelper.WhenUsbDeviceAttached((usbDevice) => { GetUsbDevices(); });
SerialPortHelper.WhenUsbDeviceDetached((usbDevice) => { GetUsbDevices(); }); } public void ApplyQueryAttributes(IDictionary<string, object> query) { GetUsbDevices(); } [RelayCommand] public async Task GetUsbDevices() { UsbDevices.Clear(); var list = SerialPortHelper.GetUsbDevices(); foreach (var item in list) { UsbDevices.Add(item); //fix VirtualView cannot be null here await Task.Delay(50); } } [RelayCommand] async Task Open(UsbDeviceInfo usbDeviceInfo) { if (openIng) { return; } openIng = true; await Shell.Current.GoToAsync(nameof(SerialDataPage), new Dictionary<string, object> { { "Serial",usbDeviceInfo} }); openIng = false; }
} }
|