前幾天我寫了年度總結,然后有人說讓我教一下他Xamarin串口通訊怎么做,其實跟java沒有多大區別。
記得我剛開始接到公司這個項目的時候很懵逼,我去看了別的安卓串口工具,都不行我當時是RS232串口,后來我就去Google Pay 下載了個串口工具,試了一下,正好可以,然后我看了它用了哪些開源庫,終於被我發現了,於是我就像Xamarin有這個庫嗎,果不其然,老天救了我,我找到了。
第一步:使用Nuget去獲取一個包:LusoVU.XamarinUsbSerialForAndroid 就是這個包!哈哈 哈哈
第二步:
在OnCreate() 生命周期中進行如下操作:
//獲取所有USB服務和已經連接的USB設備
UsbManager manager = GetSystemService(Context.UsbService) as UsbManager;
IList<IUsbSerialDriver> availableDrivers = UsbSerialProber.DefaultProber.FindAllDrivers(manager);
最后一步:
寫一個串口通訊的方法:
#region 串口通訊
///<summary>
///串口通訊
///</summary>
void UsbSerial()
{
//打開USB連接
IUsbSerialDriver driver = availableDrivers[0];
UsbDeviceConnection connection = manager.OpenDevice(driver.Device);
if (connection == null)
{
RunOnUiThread(() =>
{
ConnUsbOrBluetooth.Text = "失敗";
}
);
sc.TextSpeak("USB連接失敗,請重啟設備重試。");
return;
}
RunOnUiThread(() =>
{
ConnUsbOrBluetooth.Text = "成功";
ConnUsbOrBluetooth.Enabled = false;
}
);
sc.TextSpeak("USB連接成功!");
Thread t = new Thread(Query);
t.Priority = System.Threading.ThreadPriority.Highest;
t.Start();
//讀取USB數據
IUsbSerialPort port = driver.Ports[0];
//串口信息 波特率 數據位 停止位 流控
serialIoManager = new SerialInputOutputManager(port)
{
BaudRate = 9600,
DataBits = 7,
StopBits = StopBits.One,
Parity = Parity.None,
};
serialIoManager.Open(manager, 1024);
StringBuilder sb = new StringBuilder();
//獲取數據
serialIoManager.DataReceived += (sender, e) =>
{
sb.Append(System.Text.Encoding.Default.GetString(e.Data));
if (sb.Length >= 30)
{
BlueData bd = UiBlueData;
bd(sb.ToString());
sb.Clear();
}
}
;
}
;
#endregion
解釋:
availableDrivers[0] 這里這個0就是說打開usb中的第一個設備。
//然后這里有部分是可以忽略的 像:TextSpeak() 與RunOnUiThread里的東西。一個是TTS的代碼,另一個是為UI線程賦值的代碼。
重新開啟現成的代碼:
Thread t = new Thread(Query);
t.Priority = System.Threading.ThreadPriority.Highest;
t.Start();
這部分也可以忽略,是我項目里要用到的。
接下來就是重點了,讀取USB的數據,設置串口的信息:如波特率BaudRate,數據位:DataBits和停止位:StopBits,流控:Parity。
下面就是我接受數據的代碼了,
由於串口不斷發來數據,所以發放到 DataReceived事件中:並把獲取到的數據30個長度一切割,從而拿到想要的數據。
至此Xamarin的串口通訊就可以實現了,還有什么疑問,大家可以留言。