Java中通过串行端口接收数据的效率更高
下面是代码片段 在这里,我启动了一个动作监听器Java中通过串行端口接收数据的效率更高,java,serial-port,javax.comm,Java,Serial Port,Javax.comm,下面是代码片段 在这里,我启动了一个动作监听器 try { port_seleted.addEventListener(this); } catch (TooManyListenersException e) { System.out.println("too many Listeners!"); } port_seleted.notifyOnDataAvailable(true); 在这里,当我收到数据时调用下面的方法 p
try {
port_seleted.addEventListener(this);
} catch (TooManyListenersException e) {
System.out.println("too many Listeners!");
}
port_seleted.notifyOnDataAvailable(true);
在这里,当我收到数据时调用下面的方法
public void serialEvent(SerialPortEvent Ack_Rec) {
boolean first_flash = false;
if (Ack_Rec.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
while (input_data.available() > 0) {
input_data.read(rec_ack);
}
} catch (IOException e) {
System.out.println("IO Exception in SerialEvent");
}
我没有正确接收数据,即
如果我发送一些数据为“你好,你今天过得怎么样”
它被接收为“你好,你今天在做什么?”
i、 串行事件方法被多次调用,即在读取完整数据之前退出while循环
如果我插入延迟
try {
while (input_data.available() > 0) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
input_data.read(rec_ack);
}
} catch (IOException e) {
System.out.println("IO Exception in SerialEvent");
}
如上所示,它工作正常。请帮助我如何消除延迟,因为它会降低效率 仅根据
input\u data.available()的计数读取可用字节数
仅根据输入数据的计数读取可用字节数。available()
解决办法来了
由于我的项目与嵌入式微控制器有关,请为程序员提供一些信息
任何串行通信协议都不能一次性传输所有数据。这取决于调用传输函数的周期
i、 e.当您使用RTOS时,这取决于调用您的函数的ms任务
因此,如果数据很大,比如1024字节,则不可能一次发送所有数据,即在函数的一次调用中发送所有数据,并且可能需要多个周期来完成作业
由于PC端的速度比控制器端快得多,PC必须等到所有数据都接收到后才开始处理数据
好,现在来解决上述问题
我知道每个事务中预期的字节数,比如说1000字节
//代码片段
public void serialEvent(SerialPortEvent Ack_Rec) {
if (Ack_Rec.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
while (in.available() > 0) {
int totalbytesreceivedinSession = in.read(sessionRead);
for (int bytesreceieved = 0; bytesreceieved < totalbytesreceivedinSession; bytesreceieved++) {
temporaryPacket[recDataCount++] = sessionRead[bytesreceieved];
}
if(recDataCount == 1000){
//Process the data
}
}
public void serialEvent(SerialPortEvent Ack_Rec){
if(Ack_Rec.getEventType()==SerialPortEvent.DATA_可用){
试一试{
while(in.available()>0){
int totalbytesreceivedinSession=in.read(sessionRead);
for(int BytesReceived=0;BytesReceived
希望这是有益的
干杯!解决方案来了
由于我的项目与嵌入式微控制器有关,请为程序员提供一些信息
任何串行通信协议都不能一次性传输所有数据。这取决于调用传输函数的周期
i、 e.当您使用RTOS时,这取决于调用您的函数的ms任务
因此,如果数据很大,比如1024字节,则不可能一次发送所有数据,即在函数的一次调用中发送所有数据,并且可能需要多个周期来完成作业
由于PC端的速度比控制器端快得多,PC必须等到所有数据都接收到后才开始处理数据
好,现在来解决上述问题
我知道每个事务中预期的字节数,比如说1000字节
//代码片段
public void serialEvent(SerialPortEvent Ack_Rec) {
if (Ack_Rec.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
while (in.available() > 0) {
int totalbytesreceivedinSession = in.read(sessionRead);
for (int bytesreceieved = 0; bytesreceieved < totalbytesreceivedinSession; bytesreceieved++) {
temporaryPacket[recDataCount++] = sessionRead[bytesreceieved];
}
if(recDataCount == 1000){
//Process the data
}
}
public void serialEvent(SerialPortEvent Ack_Rec){
if(Ack_Rec.getEventType()==SerialPortEvent.DATA_可用){
试一试{
while(in.available()>0){
int totalbytesreceivedinSession=in.read(sessionRead);
for(int BytesReceived=0;BytesReceived
希望这是有益的
干杯!但是没有,我试过了,问题仍然存在,是否有其他方法解决问题。我是说bufferedinputstream或其他类??没有人有解决问题的方法???好的,伙计们,我找到了解决问题的方法。如果你想接收132字节,请将上述逻辑更改为public void serialEvent(SerialPortEvent Ack_Rec){if(Ack_Rec.getEventType()==SerialPortEvent.DATA_AVAILABLE){try{while(in.AVAILABLE()>0){int x=in.read(sessionRead)(sessionRead);for(int t=0;t0){int x=in.read(sessionRead);for(int t=0;t