Android 使用FTDI D2xx库读取数据时出现问题
我正在尝试使用FTDI usb与串行驱动程序/库d2xx进行MODBUS RTU通信。我可以在我的电脑上看到android应用程序发送的消息,我的台式电脑会将消息发送回我。我正在成功获取所需的字节数,但我正在从FT_Device.read()方法接收所有“0” 任何帮助都将不胜感激 我已经写了android代码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
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的新手。我不知道这个事实。