java串口怎么发送数据_Java串口写/发送ASCII数据

本文介绍如何在Java中通过串口控制移动机器人E-puck,发送ASCII命令如'D,100,100'设置速度。通过建立串口连接,将ASCII字符串转换为字节数组并写入串口,实现与Matlab和Putty类似的功能。代码示例展示了如何构造和发送正确的数据格式。" 133820199,7337247,深度学习基础与模型解析,"['人工智能', '深度学习', '神经网络', '算法原理', '模型结构']
摘要由CSDN通过智能技术生成

我的问题是我需要通过蓝牙在Java中控制移动机器人E-puck,通过发送命令如“D,100,100”来设置速度,“E”来获得速度等等.我有一些代码:

String command = "D,100,100";

OutputStream mOutputToPort = serialPort.getOutputStream();

mOutputToPort.write(command.getBytes());

所以用这种方法写我只能发送byte []数据,但我的机器人不会理解.

例如,以前我一直在Matlab上使用这样的命令:

s = serial('COM45');

fopen(s);

fprintf(s,'D,100,100','async');

或仅限程序Putty类型:

D,100,100 `enter`

附加信息:

我也想通了,Matlab有另一个解决方案.

s = serial('COM45');

fopen(s);

data=[typecast(int8('-D'),'int8') typecast(int16(500),'int8') typecast(int16(500),'int8')];

在这种情况下:

data = [ -68 -12 1 -12 1];

fwrite(s,data,'int8','async');

在Java中不一样吗:

byte data[] = new byte[5];

data[0] = -'D';

data[1] = (byte)(500 & 0xFF);

data[2] = (byte)(500 >> 8);

data[3] = (byte)(500 & 0xFF);

data[4] = (byte)(500>> 8);

然后:

OutputStream mOutputToPort = serialPort.getOutputStream();

mOutputToPort.write(data);

mOutputToPort.flush();

解决方法:

代码注释中的主要细节.现在,您可以通过在命令窗口D,1000,-500中键入并按Enter键来更改车轮速度.

public class serialRobot {

public static void main(String[] s) {

SerialPort serialPort = null;

try {

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM71");

if (portIdentifier.isCurrentlyOwned()) {

System.out.println("Port in use!");

} else {

System.out.println(portIdentifier.getName());

serialPort = (SerialPort) portIdentifier.open(

"ListPortClass", 300);

int b = serialPort.getBaudRate();

System.out.println(Integer.toString(b));

serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8,

SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

serialPort.setInputBufferSize(65536);

serialPort.setOutputBufferSize(4096);

System.out.println("Opened " + portIdentifier.getName());

OutputStream mOutputToPort = serialPort.getOutputStream();

InputStream mInputFromPort = serialPort.getInputStream();

PerpetualThread t = readAndPrint(mInputFromPort);

inputAndSend(mOutputToPort);

t.stopRunning();

mOutputToPort.close();

mInputFromPort.close();

}

} catch (IOException ex) {

System.out.println("IOException : " + ex.getMessage());

} catch (UnsupportedCommOperationException ex) {

System.out.println("UnsupportedCommOperationException : " + ex.getMessage());

} catch (NoSuchPortException ex) {

System.out.println("NoSuchPortException : " + ex.getMessage());

} catch (PortInUseException ex) {

System.out.println("PortInUseException : " + ex.getMessage());

} finally {

if(serialPort != null) {

serialPort.close();

}

}

}

private static PerpetualThread readAndPrint(InputStream in) {

final BufferedInputStream b = new BufferedInputStream(in);

PerpetualThread thread = new PerpetualThread() {

@Override

public void run() {

byte[] data = new byte[16];

int len = 0;

for(;isRunning();) {

try {

len = b.read(data);

} catch (IOException e) {

e.printStackTrace();

}

if(len > 0) {

System.out.print(new String(data, 0, len));

}

}

}

};

thread.start();

return thread;

}

private static void inputAndSend(OutputStream out) {

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

int k = 0;

for(;;) {

String komanda;

try {

komanda = in.readLine();

} catch (IOException e) {

e.printStackTrace();

return;

}

komanda = komanda.trim();

if(komanda.equalsIgnoreCase("end")) return;

byte komandaSiust[] = proces(komanda); //Command we send after first

//connection, it's byte array where 0 member is the letter that describes type of command, next two members

// is about left wheel speed, and the last two - right wheel speed.

try {

if(k == 0){

String siunc = "P,0,0\n"; // This command must be sent first time, when robot is connected, otherwise other commands won't work

ByteBuffer bb = ByteBuffer.wrap(siunc.getBytes("UTF-8"));

bb.order(ByteOrder.LITTLE_ENDIAN);

out.write(bb.array());

out.flush();

}else{

ByteBuffer bb = ByteBuffer.wrap(komandaSiust);

bb.order(ByteOrder.LITTLE_ENDIAN);

out.write(bb.array());

out.flush();

}

k++;

} catch (IOException e) {

e.printStackTrace();

return;

}

}

}

private static byte[] proces(String tekstas){

tekstas = tekstas.trim();

char[] charArray = tekstas.toCharArray();

byte kodas1[];

int fComa = tekstas.indexOf(',', 1);

int sComa = tekstas.indexOf(',', 2);

int matavimas = charArray.length;

int skir1 = sComa - fComa - 1;

int skir2 = matavimas - sComa -1;

char leftSpeed[] = new char[skir1];

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

leftSpeed[i] = charArray[fComa + i + 1];

}

char rightSpeed[] = new char[skir2];

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

rightSpeed[i] = charArray[sComa + i + 1];

}

String right = String.valueOf(rightSpeed);

String left = String.valueOf(leftSpeed);

int val1 = Integer.parseInt(left);

int val2 = Integer.parseInt(right);

kodas1 = new byte[5];

kodas1[0] = (byte)-charArray[0];

kodas1[1] = (byte)(val1 & 0xFF);

kodas1[2] = (byte)(val1 >> 8);

kodas1[3] = (byte)(val2 & 0xFF);

kodas1[4] = (byte)(val2 >> 8);

return kodas1;

}

private static class PerpetualThread extends Thread {

private boolean isRunning = true;

public boolean isRunning() { return isRunning; }

public void stopRunning() {

isRunning = false;

this.interrupt();

}

}

}

标签:robot,java,matlab,serial-port

来源: https://codeday.me/bug/20190825/1718332.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值