日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android串口编程--开关灯Demo(附源码)

發(fā)布時間:2023/12/18 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android串口编程--开关灯Demo(附源码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、項目簡述
第二次玩硬件了,第一次是通過局域網(wǎng)控制門的開關,這次是通過ZB(大概就是這么叫,具體名字不清楚)控制燈的開關,感覺控制硬件也就是給硬件發(fā)個byte數(shù)組而已。

這里有個框架usb-serial-for-android 可以直接使用,但是里面并沒有教你怎么寫數(shù)據(jù),我還是一個一個類里面找write相關方法,后來終于找到了是通過UsbSerialPort類下的write(final byte[] src, final int timeoutMillis)方法實現(xiàn)數(shù)據(jù)的發(fā)送的。

2、實現(xiàn)后的感想
這個demo感覺挺難測試的,而且一旦發(fā)現(xiàn)問題,很難找到問題所在。?
測試難在于,電腦上的模擬器是沒法測試的(反正我的模擬器是測試失敗的),因為模擬器訪問不到電腦的USB接口,在手機上也是很難測試,因為手機是沒法給外部接口供電的,除非你有這樣一根帶供電功能的OTG線。?


所以我們測試對象就是一些安卓設備,比如說Android電視之類的。

3、操作步驟
(1)當你在初始界面獲得到串口信息時?
(2)點擊一個串口,可以進入到另一個Activity里去?
(3)在這里你就可以通過UsbSerialPort的write進行寫數(shù)據(jù)了。?
說的是這么簡單,但是實際上第一次接觸的猿友應該是會感到很迷茫的。

4、主要代碼
? ? public void writeData(String data) {
? ? ? ? if(mSerialPort == null) return;
? ? ? ? try {
? ? ? ? ? ? //這里需要對數(shù)據(jù)做一次處理,可能是因為接收方(臺燈)那邊需要對數(shù)據(jù)解析,不一定每個接收方都需要處理,PS:我在這里就踩了個坑了
? ? ? ? ? ? byte[] bytes = StringToBytes.getFCSData(data.getBytes());?
? ? ? ? ? ? int result = mSerialPort.write(bytes, 1000);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
1
2
3
4
5
6
7
8
9
10
這個就是我寫數(shù)據(jù)時的代碼,通過UsbSerialPort進行寫數(shù)據(jù),但是我寫之前,先對傳進來的字符串進行處理,不處理的話,發(fā)送到燈上的數(shù)據(jù)是沒有用的,發(fā)送成功了,燈也不會亮。在此,我可是踩到了個大坑的。

因為這個demo要集成到項目中去,所以我把代碼整理了一下,只需要在初始化一下,然后調用WriteData方法,即可發(fā)送數(shù)據(jù)了(前提是你得訪問到了串口),具體代碼如下:


/**
?* Created by Administrator on 2017-03-27.
?* Author jiangxiaochang
?*/
public class DeviceManager {
? ? private static final int MESSAGE_REFRESH = 101;
? ? private static final long REFRESH_TIMEOUT_MILLIS = 5000;
? ? private List<UsbSerialPort> mPortList = new ArrayList<>();
? ? private UsbManager mUsbManager;
? ? private UsbSerialPort mSerialPort;
? ? private SerialInputOutputManager mSerialIoManager;
? ? private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();

? ? public Context mContext;

? ? public DeviceManager(Context context) {
? ? ? ? mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
? ? ? ? mContext = context;
? ? }

? ? private final Handler mHandler = new Handler() {
? ? ? ? @Override
? ? ? ? public void handleMessage(Message msg) {
? ? ? ? ? ? switch (msg.what) {
? ? ? ? ? ? ? ? case MESSAGE_REFRESH:
? ? ? ? ? ? ? ? ? ? refreshDeviceList();
? ? ? ? ? ? ? ? ? ? mHandler.sendEmptyMessageDelayed(MESSAGE_REFRESH, REFRESH_TIMEOUT_MILLIS);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? super.handleMessage(msg);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? };

? ? public void resume() {
? ? ? ? mHandler.sendEmptyMessage(MESSAGE_REFRESH);
? ? }

? ? public void pause() {
? ? ? ? mHandler.removeMessages(MESSAGE_REFRESH);
? ? }

? ? private void refreshDeviceList() {
? ? ? ? new AsyncTask<Void, Void, List<UsbSerialPort>>() {
? ? ? ? ? ? @Override
? ? ? ? ? ? protected List<UsbSerialPort> doInBackground(Void... params) {
? ? ? ? ? ? ? ? SystemClock.sleep(1000);

? ? ? ? ? ? ? ? final List<UsbSerialDriver> drivers =
? ? ? ? ? ? ? ? ? ? ? ? UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager);

? ? ? ? ? ? ? ? final List<UsbSerialPort> result = new ArrayList<UsbSerialPort>();
? ? ? ? ? ? ? ? for (final UsbSerialDriver driver : drivers) {
? ? ? ? ? ? ? ? ? ? final List<UsbSerialPort> ports = driver.getPorts();
? ? ? ? ? ? ? ? ? ? result.addAll(ports);
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return result;
? ? ? ? ? ? }

? ? ? ? ? ? @Override
? ? ? ? ? ? protected void onPostExecute(List<UsbSerialPort> result) {
? ? ? ? ? ? ? ? mPortList.clear();
? ? ? ? ? ? ? ? mPortList.addAll(result);
? ? ? ? ? ? ? ? if (!result.isEmpty()) {
? ? ? ? ? ? ? ? ? ? mSerialPort = mPortList.get(0);
? ? ? ? ? ? ? ? ? ? //獲取到一次即可,隨后刪除消息
? ? ? ? ? ? ? ? ? ? mHandler.removeMessages(MESSAGE_REFRESH);
? ? ? ? ? ? ? ? ? ? initPort();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }.execute((Void) null);
? ? }

? ? private void initPort() {
? ? ? ? UsbDeviceConnection connection = mUsbManager.openDevice(mSerialPort.getDriver().getDevice());
? ? ? ? if (connection == null) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? mSerialPort.open(connection);
? ? ? ? ? ? //默認參數(shù)
? ? ? ? ? ? //sPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
? ? ? ? ? ? //串口調試參數(shù)
? ? ? ? ? ? mSerialPort.setParameters(38400, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? mSerialPort.close();
? ? ? ? ? ? } catch (IOException e2) {
? ? ? ? ? ? ? ? // Ignore.
? ? ? ? ? ? }
? ? ? ? ? ? mSerialPort = null;
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? onDeviceStateChange();
? ? }

? ? public void writeData(String data) {
? ? ? ? if(mSerialPort == null) return;
? ? ? ? try {
? ? ? ? ? ? byte[] bytes = StringToBytes.getFCSData(data.getBytes());
? ? ? ? ? ? int result = mSerialPort.write(bytes, 1000);
? ? ? ? ? ? Toast.makeText(mContext, data + ":" + result, Toast.LENGTH_SHORT).show();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }

? ? private void stopIoManager() {
? ? ? ? if (mSerialIoManager != null) {
? ? ? ? ? ? mSerialIoManager.stop();
? ? ? ? ? ? mSerialIoManager = null;
? ? ? ? }
? ? }

? ? private void startIoManager() {
? ? ? ? if (mSerialPort != null) {
? ? ? ? ? ? mSerialIoManager = new SerialInputOutputManager(mSerialPort, mListener);
? ? ? ? ? ? mExecutor.submit(mSerialIoManager);
? ? ? ? }
? ? }

? ? private void onDeviceStateChange() {
? ? ? ? stopIoManager();
? ? ? ? startIoManager();
? ? }

? ? private final SerialInputOutputManager.Listener mListener =
? ? ? ? ? ? new SerialInputOutputManager.Listener() {

? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void onRunError(Exception e) {
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void onNewData(final byte[] data) {

? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
在我的Activity中是這樣寫的,就是這樣了。


public class MainActivity extends Activity {

? ? DeviceManager mManager;

? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? mManager = new DeviceManager(this);

? ? ? ? findViewById(R.id.LightOn).setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View v) {
? ? ? ? ? ? ? ? mManager.writeData("LightOn");
? ? ? ? ? ? }
? ? ? ? });
? ? }

? ? @Override
? ? protected void onResume() {
? ? ? ? super.onResume();
? ? ? ? mManager.resume();
? ? }

? ? @Override
? ? protected void onPause() {
? ? ? ? super.onPause();
? ? ? ? mManager.pause();
? ? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
注:建議第一次接觸的人,還是先去看看usb-serial-for-android 這個框架,能獲取到串口設備后,再來看看我寫的方法。

5、Demo下載
【點擊下載】


原文:https://blog.csdn.net/chang_1134/article/details/68062212?

總結

以上是生活随笔為你收集整理的Android串口编程--开关灯Demo(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。