『壹』 android串口消息
android串口消息連接的方法為:
1.模擬器可以使用PC的串口。
啟動模擬器並載入PC串口 命令如下。
運行 emulator @模擬器名稱 -qmu -serial COM1。
2.查看串口是否被載入。
啟動後使用 adb shell 命令打開命令行
cd dev 查看會發現ttyS0 ttyS1 ttyS2,其他ttyS2 就是我們載入上來的串口COM1
3.修改許可權
chmod 777 ttyS2
現在我們可以開發串口程序了。
4.串口程序實例
下載libserial_port.so ,放入libs/armeabi 目錄,可以自己創建此目錄
libserial_port.so 下載地址:
http://code.google.com/p/android-serialport-api/
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.util.Log;
public class SerialPort {
private static final String TAG = "SerialPort";
private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;
public SerialPort(File device, int baudrate) throws SecurityException, IOException {
if (!device.canRead() || !device.canWrite()) {
try {
Process su;
su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "chmod 666 " + device.getAbsolutePath() + "n"
+ "exitn";
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);
if (mFd == null) {
Log.e(TAG, "native open returns null");
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}
public InputStream getInputStream() {
return mFileInputStream;
}
public OutputStream getOutputStream() {
return mFileOutputStream;
}
//JNI
private native static FileDescriptor open(String path, int baudrate);
public native void close();
static {
System.loadLibrary("serial_port");
}
}
####################################
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class PrintClass {
//輸入流
private static InputStream in;
//輸出流
private static OutputStream out;
private static final String PORT = "/dev/ttyS2";//串口
private SerialPort serialPort;
private void Connect()
{
try {
serialPort = new SerialPort(new File(PORT), 38400);
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void CloseSerialPort()
{
try {
out.close();
in.close();
serialPort.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
『貳』 android上怎麼通過wifi接收串口數據
可以先測試wifi模塊的是否調試好, 使用串口大師,進行測試。 首先:確信串口Wifi模塊匹配好?尤其是地址和埠。 使用遠嘉科技的串口Wifi模塊TLN13UA06配置軟體與單片機連接,成功時在軟體界面提示埠配置成功。 其次:串口Wifi模塊傳輸數據量是多少?有沒有超過串口口的門限?硬體流控有沒有打開?沒有硬體流控的情況下,軟體流控有沒有做好? 自動組幀觸發長度:是指要達到門限長度,才會發送,否則,要等到觸發時間。如果傳輸字元串夠長,達到組幀觸發長度了;否則沒有的話,需要等到了觸發時間。 工作在自動模式下,模塊支持用戶可設置的自動組幀觸發長度和觸發的時間。同時此模式下,模塊串口傳輸支持硬體流控方式,提供標準的RTS/CTS 信號,手冊說明用戶在進行大數據量傳輸時啟用硬體流控功能,這樣可以充分保證數據的可靠傳輸,對於不需要流控功能的應用場合,用戶只需把RTS/CTS 引腳懸空即可。 最後:嘗試著用AirPeek抓一下包。看看數據發送是否成功。
『叄』 如何使用android studio實現串口通信
找兩根帶驅動程序的U裝RS485的線,分別接在兩電腦上並安裝好驅動程序。(在計算機硬體管理器中查看是COM幾口) 兩根U裝RS485的線A、B對接起來,形成迴路即可通訊 可從網上下載一個串口調試工具,在一端發數據,在另一台電腦的串口一端接收到其發過來的數據。
『肆』 Android手機端通過socket接收藍牙模塊串口發來的字元串,出現字元串被截斷現象,求解決辦法,萬分感謝!
在while循環外部的上方申明:
String sda="";
將while循環裡面的 String sda = new String(byte_data);
改為:sda+=new String(byte);
最後將while循環裡面的 System.out.println("收到的數據sda為:"+sda);
移到while循環外部的下方。
『伍』 Android串口通訊
1.打開串口。
2.串口處於監聽狀態
3.想串口寫入數據,串口接收到數據返回數據
SerialPort類所在的包一定要和上圖包名一直,因為串口通訊需要使用jni中的函數。
package android_serialport_api;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.fx.serialporttest.L;
public class 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;
/**
* 構造方法
* @param device 串口地址
* @param baurate 波特率
* @param flags
* @throws IOException
* @throws InterruptedException
*/
public SerialPort(File device,int baudrate,int flags) {
/*
* 檢測是否有訪問許可權
*/
if(!device.canRead()||!device.canWrite()){
//如果沒有讀寫許可權,嘗試chmod命令這個文件
L.tag("沒有讀寫許可權");
Process su;
try {
su = Runtime.getRuntime().exec("/system/bin/su");//獲取root讀寫許可權
String cmd = "chmod 777"+device.getAbsolutePath()+"\n"+"exit\n";
su.getOutputStream().write(cmd.getBytes()); //向此路徑文件寫入命令
if((su.waitFor()!=0||!device.canRead()||!device.canWrite())){
throw new SecurityException();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mFd = open(device.getAbsolutePath(),baudrate,flags);
if(mFd==null){
mFd = open(device.getAbsolutePath(),baudrate,flags);
L.tag("native open return null");
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}
public FileInputStream getmFileInputStream() {
return mFileInputStream;
}
public void setmFileInputStream(FileInputStream mFileInputStream) {
this.mFileInputStream = mFileInputStream;
}
public FileOutputStream getmFileOutputStream() {
return mFileOutputStream;
}
public void setmFileOutputStream(FileOutputStream mFileOutputStream) {
this.mFileOutputStream = mFileOutputStream;
}
//JNI
private native static FileDescriptor open(String path,int baudrate,int flags);
public native void close();
static {
System.loadLibrary("serial_port");
}
}
package android_serialport_api;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.fx.serialporttest.L;
public class SerialPortFinger {
private static ReadThread readThread;
private static FileInputStream mFileInputStream;
private static FileOutputStream mFileOutputStream;
static String path = "/dev/ttyS0";//設備主板的串口地址,地址有所不同
public void startListener(){
SerialPort serialPort = new SerialPort(new File(path), 9600, 0);//9600是波特率,這個也是有所不同,具體要看設備
mFileInputStream = serialPort.getmFileInputStream();
mFileOutputStream = serialPort.getmFileOutputStream();//獲取串口寫入流
readThread = new ReadThread();
readThread.start();//開啟監聽
}
/**
* 發送指令到串口
*
* @param cmd
* @return
*/
public boolean sendCmds(String cmd) {
boolean result = true;
byte[] mBuffer = (cmd+"\r\n").getBytes();
try {
if (mFileOutputStream != null) {
mFileOutputStream.write(mBuffer);
} else {
result = false;
}
} catch (IOException e) {
e.printStackTrace();
result = false;
}
return result;
}
static class ReadThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int len;
StringBuffer sb = new StringBuffer("");
while(true){ //循環監聽串口,讀取返回的數據
byte[] buffer = new byte[1024];
if(mFileInputStream==null){
return;
}
try {
len = mFileInputStream.read(buffer);
if(len>0){
sb.append(new String(buffer, 0, len));
}
if(!sb.toString().equals(""))
{
L.tag(sb.toString());//收到串口的返回數據,在日誌中列印出來
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
L.tag("接受完成");
}
}
}
}
『陸』 Android讀串口數據阻塞怎麼辦
我這邊也在做Android和硬體設備的串口通信。
我的通信方式很簡單,我這邊發送數據,接收數據(接收數據的內容中有標識位讓我判斷這次接收到的數據的相應處理動作)
讀數據的時候我做的是一個清空的辦法,每一次讀取數據,如果讀到的數據准確則進行處理,如果有誤就清空了在讀。
如果說接收的數據要對應上發送的數據,你可以在Android這邊發送數據後不在發送數據只讀取,並開啟一個計時器,當這段時間內么有接收到返回值就繼續你的發送和讀取功能