Android USB转ttl串口(1)

文章讲述了在Android应用中,如何通过操作字节数组实现串口数据的发送(WriteData),配置串口波特率(SetConfig),以及读取串口数据的readThread类。开发者关注串口通信和设备控制的相关API使用。
摘要由CSDN通过智能技术生成

};

}

class WriteButton implements View.OnClickListener{

@Override

public void onClick(View v) {

byte[] to_send = toByteArray(writeText.getText().toString());

int retval = MyApp.driver.WriteData(to_send, to_send.length);

//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度

if (retval < 0){

Toast.makeText(MainActivity.this, “写失败”,

Toast.LENGTH_SHORT).show();

}else {

writeBtn.setOnClickListener(new WriteBtn());

writeBtn.post(new Runnable() {

@Override

public void run() {

writeBtn.performClick();

}

});

}

}

}

class WriteBtn implements View.OnClickListener{

@Override

public void onClick(View v) {

byte[] to_send = toByteArray(write.getText().toString());

int retval = MyApp.driver.WriteData(to_send, to_send.length);

//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度

if (retval < 0) {

Toast.makeText(MainActivity.this, “写失败”,

Toast.LENGTH_SHORT).show();

}

}

}

class setButton implements View.OnClickListener{

@Override

public void onClick(View v) {

if (MyApp.driver.SetConfig((byte)9600, (byte)8, (byte)1, (byte)0,

(byte)0)) {//配置串口波特率,函数说明可参照编程手册

Toast.makeText(MainActivity.this, “串口设置成功”,

Toast.LENGTH_SHORT).show();

//01 05 00 00 FF 00 8c 3a

//01 06 00 00 00 64 88 21

/*byte[] send = toByteArray(write.getText().toString());

MyApp.driver.WriteData(send, send.length);*/

writeButton.setOnClickListener(new WriteButton());

writeButton.post(new Runnable() {

@Override

public void run() {

writeButton.performClick();

}

});

} else {

Toast.makeText(MainActivity.this, “串口设置失败”,

Toast.LENGTH_SHORT).show();

}

}

}

class openButton implements View.OnClickListener{

@Override

public void onClick(View v) {

if (!isOpen) {

retval = MyApp.driver.ResumeUsbList();

if (retval == -1) {// ResumeUsbList方法用于枚举CH34X设备以及打开相关设备

Toast.makeText(MainActivity.this, “打开设备失败”,

Toast.LENGTH_SHORT).show();

MyApp.driver.CloseDevice();

} else if (retval == 0){

if (!MyApp.driver.UartInit()) {//对串口设备进行初始化操作

Toast.makeText(MainActivity.this, “设备初始化失败”,

Toast.LENGTH_SHORT).show();

Toast.makeText(MainActivity.this, “打开” +

“设备失败”,

Toast.LENGTH_SHORT).show();

return;

}

Toast.makeText(MainActivity.this, “打开设备成功”,

Toast.LENGTH_SHORT).show();

isOpen = true;

openButton.setText(“关闭”);

configButton.setEnabled(true);

writeButton.setEnabled(true);

new readThread().start();//开启读线程读取串口接收的数据

configButton.setOnClickListener(new setButton());

configButton.post(new Runnable() {

@Override

public void run() {

configButton.performClick();

}

});

} else {

AlertDialog.Builder builder = new AlertDialog.Builder(activity);

builder.setIcon(R.drawable.icon);

builder.setTitle(“未授权限”);

builder.setMessage(“确认退出吗?”);

builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

System.exit(0);

}

});

builder.setNegativeButton(“返回”, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

});

builder.show();

}

} else {

MyApp.driver.CloseDevice();

openButton.setText(“打开”);

configButton.setEnabled(false);

writeButton.setEnabled(false);

isOpen = false;

}

}

}

/*

  • 读取设备数据

  • */

private class readThread extends Thread {

public void run() {

byte[] buffer = new byte[4096];

while (true) {

Message msg = Message.obtain();

if (!isOpen) {

break;

}

int length = MyApp.driver.ReadData(buffer, 4096);

if (length > 0) {

String recv = toHexString(buffer, length);

msg.obj = recv;

handler.sendMessage(msg);

}

}

}

}

/**

  • 将byte[]数组转化为String类型

  • @param arg

  •        需要转换的byte[]数组
    
  • @param length

  •        需要转换的数组长度
    
  • @return 转换后的String队形

*/

private String toHexString(byte[] arg, int length) {

String result = new String();

if (arg != null) {

for (int i = 0; i < length; i++) {

result = result

  • (Integer.toHexString(

arg[i] < 0 ? arg[i] + 256 : arg[i]).length() == 1 ? “0”

  • Integer.toHexString(arg[i] < 0 ? arg[i] + 256
: arg[i])

Integer.toHexString(arg[i] < 0 ? arg[i] + 256

arg[i])) + " ";

}

return result;

}

return “”;

}

/**

  • 将String转化为byte[]数组

  • @param arg

  •        需要转换的String对象
    
  • @return 转换后的byte[]数组

*/

private byte[] toByteArray(String arg) {

if (arg != null) {

char[] NewArray = new char[1000];

char[] array = arg.toCharArray();

int length = 0;

for (int i = 0; i < array.length; i++) {

if (array[i] != ’ ') {

NewArray[length] = array[i];

length++;

}

}

int EvenLength = (length % 2 == 0) ? length : length + 1;

if (EvenLength != 0) {

int[] data = new int[EvenLength];

data[EvenLength - 1] = 0;

for (int i = 0; i < length; i++) {

if (NewArray[i] >= ‘0’ && NewArray[i] <= ‘9’) {

data[i] = NewArray[i] - ‘0’;

} else if (NewArray[i] >= ‘a’ && NewArray[i] <= ‘f’) {

data[i] = NewArray[i] - ‘a’ + 10;

} else if (NewArray[i] >= ‘A’ && NewArray[i] <= ‘F’) {

data[i] = NewArray[i] - ‘A’ + 10;

}

}

byte[] byteArray = new byte[EvenLength / 2];

for (int i = 0; i < EvenLength / 2; i++) {

byteArray[i] = (byte) (data[i * 2] * 16 + data[i * 2 + 1]);

}

return byteArray;

}

}

return new byte[] {};

}

/**

  • 将String转化为byte[]数组

  • @param arg

  •        需要转换的String对象
    
  • @return 转换后的byte[]数组

*/

private byte[] toByteArray2(String arg) {

if (arg != null) {

char[] NewArray = new char[1000];

char[] array = arg.toCharArray();

int length = 0;

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

char[1000];

char[] array = arg.toCharArray();

int length = 0;

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

[外链图片转存中…(img-YDhBHChB-1714297452943)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: USBTTL-485串口是一个用于将USB接口换为TTL-485串口的设备。它可以在计算机和其他设备之间建立串行通信连接。这种驱动器通常需要在计算机上安装相应的驱动程序才能正常工作。 当我们将USBTTL-485串口连接到计算机上时,计算机会自动检测到新的设备并尝试寻找与之相对应的驱动程序。如果在计算机上已经安装了适当的驱动程序,系统会自动加载该驱动程序以支持设备的使用。 如果计算机上尚未安装适当的驱动程序,则需要手动安装。首先,我们可以联系设备的制造商或者在其官方网站上查找驱动程序的下载链接。然后,我们可以下载相应的驱动程序并按照安装说明进行安装。 安装驱动程序后,我们可以将USBTTL-485串口连接到计算机上,并确保两者之间的物理连接良好。接下来,我们可以在计算机上打开串口调试工具或者其他支持串口通信的软件。在软件中,我们需要选择正确的串口号和波特率,然后进行串口通信测试。 如果一切正常,我们就可以通过USBTTL-485串口与其他串口设备进行通信了。例如,我们可以连接到一台PLC或者其他的嵌入式系统,并通过串口进行数据传输和控制操作。 总的来说,USBTTL-485串口驱动是用于支持USBTTL-485串口设备在计算机上正常工作的软件。通过正确安装驱动程序并进行相应的配置,我们可以实现串口通信并与其他串口设备进行数据传输和控制。 ### 回答2: USBTTL485串口驱动是一种用于将USB接口换为TTL485串口的驱动器。USBTTL485串口驱动器通常用于将USB接口连接到具有TTL485串口的设备,以实现两者之间的通信。 使用USBTTL485串口驱动器时,首先需要安装驱动程序。驱动程序通常由驱动器制造商提供,用户可以根据设备的型号和操作系统版本选择适合的驱动程序进行安装。 安装完成后,将USBTTL485串口驱动器通过USB接口连接到计算机或其他设备上。然后,将TTL485串口连接到需要通信的设备上。TTL485串口通常包括三个线缆:数据线、地线和控制线。数据线用于传输数据,地线用于提供电流的回路,控制线用于控制通信的进行。 连接完成后,可以通过编程或其他软件来控制USBTTL485串口驱动器进行数据传输。用户可以使用相应的API或指令来发送和接收数据。用户还可以设置波特率和其他参数以满足特定的通信需求。 USBTTL485串口驱动器的使用广泛,适用于物联网、工业自动化、仪器仪表等领域。它提供了一种方便可靠的方式来实现设备间的数据传输和通信。 ### 回答3: USBTTL485串口驱动是一种将USB端口换为TTL485串口的设备。TTL485串口是一种通信接口,常用于电子设备之间的数据传输。USBTTL485串口驱动经常用于连接计算机与嵌入式系统或其他串口设备进行数据通信。 使用USBTTL485串口驱动时,首先需要安装驱动程序。驱动程序可以在设备官方网站上下载到,通常有针对不同版本的操作系统的驱动程序。下载完成后,将驱动程序安装到计算机上。 接下来,将USBTTL485串口驱动插入计算机的USB接口。此时,计算机将自动识别并安装驱动。在设备管理器中可以检查到新添加的串口设备。 接下来,需要使用串口通信软件来配置和使用串口。比如,如果使用Windows操作系统,可以使用HyperTerminal或者PuTTY等软件。打开软件后,选择配置串口的参数。包括串口号、波特率、数据位、停止位、校验位等。这些参数需要根据具体需求和设备来设置。 设置完成后,可以在软件中进行数据的发送和接收。通过USBTTL485串口驱动,计算机与其他设备之间可以进行双向的数据通信。可以发送数据给外设设备,也可以从外设读取数据。 总结来说,USBTTL485串口驱动提供了一种方便快捷的方式,将计算机的USB端口换成TTL485串口,实现计算机与其他串口设备的通信。通过安装驱动、配置串口参数和使用串口通信软件,可以实现数据在计算机和其他设备之间的传输。这样的驱动设备在嵌入式系统的开发和调试过程中起到了很大的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值