通过Java中的串行端口提高数据接收效率

时间:2013-02-07 05:08:56

标签: java serial-port javax.comm

以下是代码段

我在这里发起一个动作监听器

    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");
        }

我没有正确收到数据,即

如果我发送一些数据为“你好今天你好吗” 收到“Hello h”“ow”“你是”“doin”“g今天”

,即串行事件方法被多次调用,即在读取完整数据之前退出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");
        }

如上图所示,它工作正常。请帮助我如何消除延迟,因为它会降低效率!

2 个答案:

答案 0 :(得分:0)

这是解决方案。

由于我的项目与嵌入式微控制器有关,为程序员提供了一些信息。

任何串行通信协议都无法一次性传输所有数据。它取决于调用传输函数的周期。

即。它取决于您调用函数的ms任务是否正在使用RTOS。

因此,如果数据很大,比如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 
                      }
            }

希望这是有帮助的,

干杯!

答案 1 :(得分:-1)

仅根据input_data.available()

的计数读取可用字节数
int bytesAvailable = 0;
while ((bytesAvailable=input_data.available()) > 0) {


                input_data.read(rec_ack,0,bytesAvailable);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }