Android 使用FTDI D2xx库读取数据时出现问题

Android 使用FTDI D2xx库读取数据时出现问题,android,ftdi,d2xx,Android,Ftdi,D2xx,我正在尝试使用FTDI usb与串行驱动程序/库d2xx进行MODBUS RTU通信。我可以在我的电脑上看到android应用程序发送的消息,我的台式电脑会将消息发送回我。我正在成功获取所需的字节数,但我正在从FT_Device.read()方法接收所有“0” 任何帮助都将不胜感激 我已经写了android代码 package com.example.ftdilib; import android.content.Context; import android.os.Handler; impo

我正在尝试使用FTDI usb与串行驱动程序/库d2xx进行MODBUS RTU通信。我可以在我的电脑上看到android应用程序发送的消息,我的台式电脑会将消息发送回我。我正在成功获取所需的字节数,但我正在从FT_Device.read()方法接收所有“0”

任何帮助都将不胜感激

我已经写了android代码

package com.example.ftdilib;

import android.content.Context;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.ftdi.j2xx.D2xxManager;
import com.ftdi.j2xx.FT_Device;

import java.sql.Driver;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private TextView tv;

    private Context mMe;
    private D2xxManager mManager;
    private FT_Device mDevice;
    private D2xxManager.DriverParameters mDriverParameters;

    private Handler mHandler = new Handler();
    private Runnable mRunner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);
        tv = findViewById(R.id.tv);

        mMe = getApplicationContext();

        try {
            mManager = D2xxManager.getInstance(mMe);
        } catch (D2xxManager.D2xxException e) {
            Toast.makeText(mMe, e.getMessage(), Toast.LENGTH_LONG);
        }

        initButton();
    }

    private void initButton() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                if(mManager != null)
                {
                    int devCount = mManager.createDeviceInfoList(mMe);
                    if(devCount > 0)
                    {
                        mDriverParameters = new D2xxManager.DriverParameters();
                        mDriverParameters.setBufferNumber(2);
                        mDriverParameters.setMaxTransferSize(1024);
                        mDriverParameters.setReadTimeout(250);

                        mDevice = mManager.openByIndex(mMe, 0, mDriverParameters);

                        if(mDevice != null)
                        {
                            if(mDevice.isOpen())
                            {
                                mDevice.setBaudRate(9600);
                                mDevice.setDataCharacteristics(D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, D2xxManager.FT_PARITY_NONE);
                                mDevice.restartInTask();

                                mRunner = new Runnable() {
                                    @Override
                                    public void run() {
                                        getData();
                                        mHandler.postDelayed(mRunner, 50);
                                    }
                                };

                                mHandler.post(mRunner);
                            }
                        }
                    }
                    else
                    {
                        Toast.makeText(mMe, "NO DEVICE FOUND.", Toast.LENGTH_LONG);
                    }
                }
            }
        });
    }

    private void getData()
    {
        byte[] _req =  getHoldingRegisters((byte)1,(int)0, (int)4);
    }

    private byte[] getHoldingRegisters(byte slaveid, int startingaddress, int quantity)
    {
        byte[] _msg = new byte[8];
        _msg[0] = slaveid;
        _msg[1] = 3;
        _msg[2] = (byte) (startingaddress >> 8);
        _msg[3] = (byte) (startingaddress & 0xFF);
        _msg[4] = (byte) (quantity >> 8);
        _msg[5] = (byte) (quantity & 0xFF);
        int crc = getCRC(_msg);

        _msg[6] = (byte) (crc & 0xFF);
        _msg[7] = (byte) (crc >> 8);

        mDevice.write(_msg, _msg.length);

        byte[] _req = new byte[5 + (quantity*2)];

        int available = mDevice.getQueueStatus();

        setText(tv, String.valueOf(available));

        mDevice.read(_req, _req.length, 250);

        return null;
    }

    private int getCRC(byte[] input) {
        int iPos = 0; // loop position in input buffer
        int crc = 0xFFFF;
        while (iPos < input.length - 2) {
            crc ^= (input[iPos] & 0xFF);
            iPos++;
            for (int j = 0; j < 8; j++) {
                boolean bitOne = ((crc & 0x1) == 0x1);
                crc >>>= 1;
                if (bitOne) {
                    crc ^= 0x0000A001;
                }
            }
        }

        return crc;
    }

    private void setText(final TextView textView, final String value)
    {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.setText(value);
            }
        });
    }
}
package com.example.ftdilib;
导入android.content.Context;
导入android.os.Handler;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.ftdi.j2xx.dxxmanager;
导入com.ftdi.j2xx.FT_设备;
导入java.sql.Driver;
公共类MainActivity扩展了AppCompatActivity{
专用按钮btn;
私家图文电视;
私有上下文mMe;
私人经理;
专用FT_设备设备;
私有D2xxManager.DriverParameters mDriverParameters;
私有处理程序mHandler=新处理程序();
私人可运行的mRunner;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.btn);
tv=findViewById(R.id.tv);
mMe=getApplicationContext();
试一试{
mManager=dxxmanager.getInstance(mMe);
}捕获(dxxmanager.dxxe异常){
Toast.makeText(mMe,e.getMessage(),Toast.LENGTH_LONG);
}
initButton();
}
私有void initButton(){
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图)
{
if(mManager!=null)
{
int devCount=mManager.createDeviceInfo列表(mMe);
如果(devCount>0)
{
mDriverParameters=新的D2xxManager.DriverParameters();
mDriverParameters.setBufferNumber(2);
mDriverParameters.setMaxTransferSize(1024);
mDriverParameters.setReadTimeout(250);
mDevice=mManager.openByIndex(mMe,0,mDriverParameters);
如果(mDevice!=null)
{
if(mDevice.isOpen())
{
设备挫折率(9600);
mDevice.setDataCharacteristics(dxxmanager.FT\u数据位\u 8、dxxmanager.FT\u停止位\u 1、dxxmanager.FT\u奇偶校验位\u无);
mDevice.restartinask();
mRunner=newrunnable(){
@凌驾
公开募捐{
getData();
mHandler.postDelayed(mRunner,50岁);
}
};
mHandler.post(mRunner);
}
}
}
其他的
{
Toast.makeText(mMe,“未找到设备”),Toast.LENGTH\u LONG;
}
}
}
});
}
私有void getData()
{
字节[]_req=getHoldingRegisters((字节)1,(int)0,(int)4);
}
专用字节[]getHoldingRegisters(字节slaveid、int起始地址、int数量)
{
字节[]_msg=新字节[8];
_msg[0]=slaveid;
_msg[1]=3;
_msg[2]=(字节)(起始地址>>8);
_msg[3]=(字节)(起始地址和0xFF);
_msg[4]=(字节)(数量>>8);
_消息[5]=(字节)(数量和0xFF);
int crc=getCRC(_msg);
_msg[6]=(字节)(crc和0xFF);
_msg[7]=(字节)(crc>>8);
mDevice.write(_msg,_msg.length);
字节[]_req=新字节[5+(数量*2)];
int available=mDevice.getQueueStatus();
setText(tv,String.valueOf(可用));
mDevice.read(_-req,_-req.length,250);
返回null;
}
私有int getCRC(字节[]输入){
int iPos=0;//输入缓冲区中的循环位置
int crc=0xFFFF;
而(iPos>=1;
如果(比特通){
crc^=0x0000A001;
}
}
}
返回crc;
}
私有void setText(最终文本视图,最终字符串值)
{
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
textView.setText(值);
}
});
}
}

事实上,我正在使用Android SDK 28(即Android 9)编译项目,我的手机和桌面上安装了Android 6。后来我在我朋友的手机上安装了Android 9,效果很好。

如果您需要帮助,请将代码减少到绝对最小的可复制示例。这增加了发现问题并获得帮助的机会。是的。。。我是android studio和android的新手。我不知道这个事实。