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