gpt4 book ai didi

java - RXTX和LRC传输过程

转载 作者:行者123 更新时间:2023-11-30 04:42:31 24 4
gpt4 key购买 nike

所以,我有一个通过RS-232 DB9串行端口连接的卡锁定系统设备。这是我第一次使用它来处理外部设备。所以我读了手册其表示传输过程文本格式定义如下:

-文本在 STX 和 ETC 之间最多包含 500 个字符

-LRC计算区域范围从STX到ETX的第一个字符

还有一个控制字符(STX、ETX、ACK、NAK)及其十六进制代码的列表。

我对此一无所知。请赐教。哦,还有,我可以检测设备是否连接到特定端口吗?

我已成功使用下面的代码连接到通信端口:

public class TwoWaySerialComm
{
protected InputStream inputStream;
protected OutputStream outputStream;

public TwoWaySerialComm()
{
super();
}

void connect ( String portName ) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_7,SerialPort.STOPBITS_1,SerialPort.PARITY_ODD);

inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();

(new Thread(new SerialReader(inputStream))).start();
(new Thread(new SerialWriter(outputStream))).start();

}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}

public InputStream getInputStream() {
return inputStream;
}

public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}

public OutputStream getOutputStream() {
return outputStream;
}

public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}

/** */
public static class SerialReader implements Runnable
{
InputStream in;

public SerialReader ( InputStream in )
{
this.in = in;
}

public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = this.in.read(buffer)) > -1 )
{
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

/** */
public static class SerialWriter implements Runnable
{
OutputStream out;

public SerialWriter ( OutputStream out )
{
this.out = out;
}

public void run ()
{
try
{
int c = 0;
while ( ( c = System.in.read()) > -1 )
{
this.out.write(c);
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

public static void main ( String[] args )
{
try
{
TwoWaySerialComm comm = new TwoWaySerialComm();
comm.connect("COM3");
}
catch ( Exception e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

这是我找到的用于从字节数组中获取 LRC 的代码:

    public byte calculateLRC(byte[] data)
{
byte checksum = 0;
for (int i = 0; i <= data.length - 1; i++) {
checksum = (byte) ((checksum + data[i]) & 0xFF);
}

checksum = (byte) (((checksum ^ 0xFF) + 1) & 0xFF);
return checksum;
}

现在假设我必须将文本“CES01”正确发送到设备,我该怎么做?

最佳答案

如果您完全没有串行通信的经验,我会首先研究一些现有的、已知的工作实现。约翰·埃林伍德 (John Ellinwood) 对 this SO question 的回答包含 XModem 协议(protocol)的 Java 源代码,XModem 协议(protocol)是一种古老的、简单的调制解调器文件传输协议(protocol)。这将向您展示如何处理通信本身(您始终必须为超时和其他错误情况做好准备)和控制字符。

您不能忘记 Java 的一个特点是 Java 中没有无符号类型,如果您唯一可以使用的变量类型是有符号的,那么这些低级协议(protocol)几乎总是会变得更复杂。但正如 XModem 代码所示,这是完全可行的。

关于java - RXTX和LRC传输过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com