送數(shù)據(jù)與接收數(shù)據(jù)(詳解))
大家好我是陳志寶一名天津全棧軟件開發(fā)工程師。本篇記錄開發(fā)時遇到的問題以及解決方案。最近在做自動售貨機的程序需要用到串口經(jīng)過幾天的時間終于搞明白了先來個效果圖下面是我發(fā)送的數(shù)據(jù)和接收數(shù)據(jù)的圖片下面直接上代碼新建一個類SerialPortFinder添加如下代碼public class SerialPortFinder { public class Driver { public Driver(String name, String root) { mDriverName name; mDeviceRoot root; } private String mDriverName; private String mDeviceRoot; VectorFile mDevices null; public VectorFile getDevices() { if (mDevices null) { mDevices new VectorFile(); File dev new File(/dev); File[] files dev.listFiles(); int i; for (i0; ifiles.length; i) { if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) { Log.d(TAG, Found new device: files[i]); mDevices.add(files[i]); } } } return mDevices; } public String getName() { return mDriverName; } } private static final String TAG SerialPort; private VectorDriver mDrivers null; VectorDriver getDrivers() throws IOException { if (mDrivers null) { mDrivers new VectorDriver(); LineNumberReader r new LineNumberReader(new FileReader(/proc/tty/drivers)); String l; while((l r.readLine()) ! null) { // Issue 3: // Since driver name may contain spaces, we do not extract driver name with split() String drivername l.substring(0, 0x15).trim(); String[] w l.split( ); if ((w.length 5) (w[w.length-1].equals(serial))) { Log.d(TAG, Found new driver drivername on w[w.length-4]); mDrivers.add(new Driver(drivername, w[w.length-4])); } } r.close(); } return mDrivers; } public String[] getAllDevices() { VectorString devices new VectorString(); // Parse each driver IteratorDriver itdriv; try { itdriv getDrivers().iterator(); while(itdriv.hasNext()) { Driver driver itdriv.next(); IteratorFile itdev driver.getDevices().iterator(); while(itdev.hasNext()) { String device itdev.next().getName(); String value String.format(%s (%s), device, driver.getName()); devices.add(value); } } } catch (IOException e) { e.printStackTrace(); } return devices.toArray(new String[devices.size()]); } public String[] getAllDevicesPath() { VectorString devices new VectorString(); // Parse each driver IteratorDriver itdriv; try { itdriv getDrivers().iterator(); while(itdriv.hasNext()) { Driver driver itdriv.next(); IteratorFile itdev driver.getDevices().iterator(); while(itdev.hasNext()) { String device itdev.next().getAbsolutePath(); devices.add(device); } } } catch (IOException e) { e.printStackTrace(); } return devices.toArray(new String[devices.size()]); }新建SerialPort類這個類主要用來加載SO文件通過JNI的方式打開關(guān)閉串口public class SerialPort { private static final String TAG SerialPort; /* * Do not remove or rename the field mFd: it is used by native method close(); */ private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException { /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { /* Missing read/write permission, trying to chmod the file */ Process su; su Runtime.getRuntime().exec(/system/bin/su); String cmd chmod 666 device.getAbsolutePath() \n exit\n; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() ! 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new SecurityException(); } } mFd open(device.getAbsolutePath(), baudrate, flags); if (mFd null) { Log.e(TAG, native open returns null); throw new IOException(); } mFileInputStream new FileInputStream(mFd); mFileOutputStream new FileOutputStream(mFd); } // Getters and setters public InputStream getInputStream() { return mFileInputStream; } public OutputStream getOutputStream() { return mFileOutputStream; } // JNI private native static FileDescriptor open(String path, int baudrate, int flags); public native void close(); static { System.loadLibrary(serial_port); } }發(fā)送和接收串口的Activitypublic class ComAActivity extends Activity { EditText editTextRecDisp; Button ButtonSendCOMA; SerialControl ComA;//串口 DispQueueThread DispQueue;//刷新顯示線程 SerialPortFinder mSerialPortFinder;//串口設(shè)備搜索 /** * Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main2); ComA new SerialControl(); DispQueue new DispQueueThread(); DispQueue.start(); setControls(); //開啟串口 ComA.setPort(/dev/ttyS2); ComA.setBaudRate(115200); OpenComPort(ComA); } Override public void onDestroy() { CloseComPort(ComA); super.onDestroy(); } Override public void onBackPressed() { AseoZdpAseo.initPush(this); Intent intent new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); AseoZdpAseo.initFinalTimer(this); startActivity(intent); } //---------------------------------------------------- private void setControls() { editTextRecDisp (EditText) findViewById(R.id.editTextRecDisp); ButtonSendCOMA (Button) findViewById(R.id.ButtonSendCOMA); ButtonSendCOMA.setOnClickListener(new ButtonClickEvent()); mSerialPortFinder new SerialPortFinder(); String[] entryValues mSerialPortFinder.getAllDevicesPath(); ListString allDevices new ArrayListString(); for (int i 0; i entryValues.length; i) { allDevices.add(entryValues[i]); } } //----------------------------------------------------清除按鈕、發(fā)送按鈕 class ButtonClickEvent implements View.OnClickListener { public void onClick(View v) { if (v ButtonSendCOMA) { sendPortData(ComA, 01023101000035); } } } //----------------------------------------------------串口控制類 private class SerialControl extends SerialHelper { public SerialControl() { } Override protected void onDataReceived(final ComBean ComRecData) { DispQueue.AddQueue(ComRecData);//線程定時刷新顯示(推薦) } } //----------------------------------------------------刷新顯示線程 private class DispQueueThread extends Thread { private QueueComBean QueueList new LinkedListComBean(); Override public void run() { super.run(); while (!isInterrupted()) { final ComBean ComData; while ((ComData QueueList.poll()) ! null) { runOnUiThread(new Runnable() { public void run() { DispRecData(ComData); } }); try { Thread.sleep(100);//顯示性能高的話可以把此數(shù)值調(diào)小。 } catch (Exception e) { e.printStackTrace(); } break; } } } public synchronized void AddQueue(ComBean ComData) { QueueList.add(ComData); } } //----------------------------------------------------顯示接收數(shù)據(jù) private void DispRecData(ComBean ComRecData) { StringBuilder sMsg new StringBuilder(); sMsg.append(ComRecData.sRecTime); sMsg.append([); sMsg.append(ComRecData.sComPort); sMsg.append(]); sMsg.append([Hex] ); sMsg.append(MyFunc.ByteArrToHex(ComRecData.bRec)); sMsg.append(\r\n); /** * 接收串口的數(shù)據(jù)返回值并且做相應(yīng)的處理 */ editTextRecDisp.append(sMsg); String[] temp MyFunc.StrToStrArray(MyFunc.ByteArrToHex(ComRecData.bRec)); if (temp.equals(FF 01 01 01 02 01 04 )) { Toast.makeText(ComAActivity.this, 您連接了主板, Toast.LENGTH_SHORT).show(); } } //----------------------------------------------------串口發(fā)送 private void sendPortData(SerialHelper ComPort, String sOut) { if (ComPort ! null ComPort.isOpen()) { ComPort.sendHex(sOut); } } //----------------------------------------------------關(guān)閉串口 private void CloseComPort(SerialHelper ComPort) { if (ComPort ! null) { ComPort.stopSend(); ComPort.close(); } } //----------------------------------------------------打開串口 private void OpenComPort(SerialHelper ComPort) { try { ComPort.open(); } catch (SecurityException e) { ShowMessage(打開串口失敗:沒有串口讀/寫權(quán)限!); } catch (IOException e) { ShowMessage(打開串口失敗:未知錯誤!); } catch (InvalidParameterException e) { ShowMessage(打開串口失敗:參數(shù)錯誤!); } } //------------------------------------------顯示消息 private void ShowMessage(String sMsg) { Toast.makeText(this, sMsg, Toast.LENGTH_SHORT).show(); } }布局文件?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthfill_parent android:layout_heightfill_parent android:orientationvertical LinearLayout android:idid/LinearLayoutRecDisp android:layout_widthmatch_parent android:layout_heightfill_parent android:layout_weight1 EditText android:idid/editTextRecDisp android:layout_widthfill_parent android:layout_heightmatch_parent android:layout_weight1 android:clickablefalse android:editablefalse android:gravitytop android:longClickablefalse android:textSize14sp / /LinearLayout Button android:idid/ButtonSendCOMA android:layout_widthwrap_content android:layout_heightwrap_content android:text發(fā)送 / /LinearLayout綜合以上就可以實現(xiàn)串口間的通訊程序考進去以后有問題可直接留言給我我會為大家解答作者陳志寶 | 志尊寶整個Demo下載地址http://download.csdn.net/download/chen_xiaobao/9929474