java实现串口通信报错,求大神帮忙 40C

我准备实现从串口接收数据(要求接收的数据长时间持续传输,且传输较快),将得到的数据实时的显示在多个已经定义好的JFreechart中,现已定义一个JFreechart的数组,目前设计的是接收一组5个字节的数据,每接收五个字节,就把这五个数字显示在一个chart中,从chart1到chart7,一直循环,代码如下

 package com.control;

import gnu.io.*;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import com.view.dataplay;
import com.view.JFSwingDynamicChart;

import javax.swing.*;

public class ContinueRead extends Thread implements SerialPortEventListener { // SerialPortEventListener
    // 监听器,我的理解是独立开辟一个线程监听串口数据
    static CommPortIdentifier portId; // 串口通信管理类
    static Enumeration<?> portList; // 有效连接上的端口的枚举
    InputStream inputStream; // 从串口来的输入流
    static OutputStream outputStream;// 向串口输出的流
    JFSwingDynamicChart Jchart[];
    byte[] readBuffer;
    JFrame frame;
    int numBytes = -1;
    double b[]; //
    static SerialPort serialPort; // 串口的引用
    // 堵塞队列用来存放读到的数据
    private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<String>();
    int time  = 0;  //做测试 设置time为0-7 之中 随机输出数字

    @Override
    /**
     * SerialPort EventListene 的方法,持续监听端口上是否有数据流
     */
    public void serialEvent(SerialPortEvent event) {//

        switch (event.getEventType()) {
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据
                 readBuffer = new byte[20];
                try {
                    numBytes = -1;
                    b =new double[20];
                    while (inputStream.available() > 0) {
                        numBytes = inputStream.read(readBuffer);
                       if(numBytes>0)
                       {
                           //输出得到的数据
                           //System.out.println(numBytes);
                           for(int i=0;i<numBytes;i++)
                           {
                             b[i]  = (double)(readBuffer[i] -= 48);
                               System.out.println((double) (readBuffer[i])); //转换成double
                           }
                           /*
                           * ceshi
                           * */
                           //传到JSchart中
                           (new Thread(this)).start();
                          /* frame.addWindowListener(new WindowAdapter() {
                               @Override
                               public void windowClosing(WindowEvent windowevent) {
                                   System.exit(0);
                               }
                           });*/
                           time++;
                           time=time%8;
                           /*
                           *
                           * */
                           readBuffer = new byte[20];
                       }
                       /* if (numBytes > 0) {
                            msgQueue.add(new Date() + "真实收到的数据为:-----"
                                    + new String(readBuffer));
                            readBuffer = new byte[20];// 重新构造缓冲对象,否则有可能会影响接下来接收的数据
                        } else {
                            msgQueue.add("额------没有读到数据");
                        }*/
                    }
                } catch (IOException e) {
                }
                break;
        }
    }

    /**
     *
     * 通过程序打开COM4串口,设置监听器以及相关的参数
     *
     * @return 返回1 表示端口打开成功,返回 0表示端口打开失败
     */
    public int startComPort() {
        // 通过串口通信管理类获得当前连接上的串口列表
        portList = CommPortIdentifier.getPortIdentifiers();

        while (portList.hasMoreElements()) {

            // 获取相应串口对象
            portId = (CommPortIdentifier) portList.nextElement();

            System.out.println("设备类型:--->" + portId.getPortType());
            System.out.println("设备名称:---->" + portId.getName());
          //  System.out.println("12");
            // 判断端口类型是否为串口
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                // 判断如果COM4串口存在,就打开该串口
                if (portId.getName().equals("COM4")) {
                    try {
                        // 打开串口名字为COM_4(名字任意),延迟为2毫秒
                        serialPort = (SerialPort) portId.open("COM_4", 2000);

                    } catch (PortInUseException e) {
                        e.printStackTrace();
                        return 0;
                    }
                    // 设置当前串口的输入输出流
                    try {
                        inputStream = serialPort.getInputStream();
                        outputStream = serialPort.getOutputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return 0;
                    }
                    // 给当前串口添加一个监听器
                    try {
                        serialPort.addEventListener(this);
                    } catch (TooManyListenersException e) {
                        e.printStackTrace();
                        return 0;
                    }
                    // 设置监听器生效,即:当有数据时通知
                    serialPort.notifyOnDataAvailable(true);

                    // 设置串口的一些读写参数
                    try {
                        // 比特率、数据位、停止位、奇偶校验位
                        serialPort.setSerialPortParams(9600,
                                SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                                SerialPort.PARITY_NONE);
                    } catch (UnsupportedCommOperationException e) {
                        e.printStackTrace();
                        return 0;
                    }

                    return 1;
                }
            }
        }
        return 0;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        /*try {
            System.out.println("--------------任务处理线程运行了--------------");
            while (true) {
                // 如果堵塞队列中存在数据就将其输出
                if (msgQueue.size() > 0) {
                    System.out.println(msgQueue.take());
                }
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        for(int i=0;i<numBytes;i++)
        try {
            Jchart[time].setNumber(b[i]);
            Thread.sleep(1);
        } catch (InterruptedException e) {
        }
    }
    /*
    * 串口配置初始化
    * */
    public void init(){
        startComPort();

    }
 /*   public static void main(String[] args) {
        ContinueRead cRead = new ContinueRead();
        int i = cRead.startComPort();
        if (i == 1) {
            // 启动线程来处理收到的数据
            cRead.start();
            try {
                String st = "哈哈----你好";
                System.out.println("发出字节数:" + st.getBytes("gbk").length);
                outputStream.write(st.getBytes("gbk"), 0,
                        st.getBytes("gbk").length);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            return;
        }
    }*/

 public void setJchart(JFSwingDynamicChart[] j){
     Jchart = j;
 }
 public void setFrame(JFrame f){
     frame = f;
 }

}

运行的时候出现报错
Exception in thread "Thread-22" java.lang.NullPointerException
at java.util.Collections.indexedBinarySearch(Collections.java:226)
at java.util.Collections.binarySearch(Collections.java:213)
at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:916)
at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:887)
at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:871)
at com.view.JFSwingDynamicChart.setNumber(JFSwingDynamicChart.java:135)
at com.control.ContinueRead.run(ContinueRead.java:184)
at java.lang.Thread.run(Thread.java:745)
求大神解答!

3个回答

空指针……报错的倒数第二行找到错误位置,,,然后打断点看看哪个变量为null

whb3299065
whb3299065 回复qq_28930013: 用到的变量打印一下
一年多之前 回复
whb3299065
whb3299065 回复qq_28930013: 那你慢慢找吧
一年多之前 回复
qq_28930013
qq_28930013 而且这段程序一般在创建到第50多个线程才会出现刚才的错误
一年多之前 回复
qq_28930013
qq_28930013 我没找到我定义的变量哪个是空的.......
一年多之前 回复

电脑重启一下一个就差不多了

Jchart 这个变量 没有初始化 ,就是没有定义数组的长度, 下面 jchart[time] 出现空指针 , 初始化 JFSwingDynamicChart Jchart[]=new JFSxxx[100]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求大神帮忙,在Java串口通信中设置DTR_CONTROL_DISABLE如何实现?
-
单片机串口通信问题 求大神帮忙
-
紧急求助,java访问串口出现项目崩溃问题,求大神指导
-
VB串口通信数据丢包问题,求大神帮忙!急急急!
-
小白单片机选片 求大神帮忙
-
Java串口通信时不能检测到串口
-
linux串口通信!求大神!急
-
android 串口通信读取数据,处理问题?求大神帮忙
-
求大神,linux串口通信方面!!!7445CPU串口和CC2530通信验证
-
java 实现串口通信 循环打开串口 内存一直在增加 最后溢出
-
无线路由器串口下报错,在线求大神解决!!
-
为什么STM32和zigbee不能串口通信?
-
MFC中串口操作的问题,求各位大神帮忙看看
-
android在实现串口通信出现无法打开串口
-
海康威视SDK向串口发命令,求大神!!!!
-
vue进行串口通信引入serialport包报错
-
java在linux上串口通讯 非标准波特率问题(RXTX)
-
java串口通信及处理大量数据
-
程序员实用工具网站
目录 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站 9、项目开源 10、在线工具宝典大全 程序员开发需要具备良好的信息检索能力,为了备忘(收藏夹真是满了),将开发过程中常用的网站进行整理。 1、搜索引擎 1.1、秘迹搜索 一款无敌有良心、无敌安全的搜索引擎,不会收集私人信息,保...
史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
网上很多整合SSM博客文章并不能让初探ssm的同学思路完全的清晰,可以试着关掉整合教程,摇两下头骨,哈一大口气,就在万事具备的时候,开整,这个时候你可能思路全无 ~中招了咩~ ,还有一些同学依旧在使用eclipse或者Myeclipse开发,我想对这些朋友说IDEA 的编译速度很快,人生苦短,来不及解释了,直接上手idea吧。这篇文章每一步搭建过程都测试过了,应该不会有什么差错。本文章还有个比较优秀的特点,就是idea的使用,基本上关于idea的操作都算是比较详细的,所以不用太担心不会撸idea!最后,本文
从入门到精通,Java学习路线导航
引言 最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧。 Java学习路线 当然,这里我只是说Java学习路线,因为自己就是学Java的,对Java理当很熟悉,对于其它方面,我也不是很了解。 基础阶段 首先是基础阶段,在基础阶段,我们必须掌握Java基础,Mysql数据库,Ora...
鸿蒙 OS 的到来,能为我们改变什么?
作者 | 屠敏 出品 | CSDN(ID:CSDNnews) 「鸿蒙初辟原无姓,打破顽空需悟空」,在国产自研操作系统短缺的窘境之下,天惊一声雷,「鸿蒙」踏风来。 回首上个月的技术圈,最值得业界浮称流说的无疑是 8 月 9 日华为开发者大会 2019(简称 HDC 2019)上公开的「鸿蒙 OS」。作为一款基于微内核的全场景分布式 OS,「鸿蒙 OS」肩负打破传统 IoT 操作系统的责任,同时也成...
100 个网络基础知识普及,看完成半个网络高手
1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。 3)什么是骨干网? 骨干网络是集中的基础设施,旨在将不同的路由和数据分发到各种网络。它还处理带宽管理和各种通道。 4)什么是 LAN? LAN 是局域网的缩...
C语言实现推箱子游戏
很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~ 一、介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:ZackSock 也不说太多多余的话了,先看一下效果图: 游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。 二、代...
面试官,不要再问我三次握手和四次挥手
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官:请介绍下三次握手 求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就...
德国 IT 薪酬大揭秘!
作者 |德国IT那些事责编 | 伍杏玲“所有脱离工龄、级别、职位、经验、城市以及裙带关系来谈论工资,都是耍流氓!”——佛洛依德一般来说IT行业公司,资历是按等级划分的...
500行代码,教你用python写个微信飞机大战
这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右手有节奏有韵律的朝着同一个方向来回移动起来! 这是史诗级的发明,是浓墨重彩的一笔,是…… 在一阵抽搐后,我结束了游戏,瞬时觉得一切都索然无味,正在我进入贤者模式时,突然想到,如果我可以让更多人已不同的方式体会到这种美轮美奂的感觉岂不美哉? 所以我打开电脑,创建了一个 `plan_game.py`……
别在学习框架了,那些让你起飞的计算机基础知识。
我之前里的文章,写的大部分都是与计算机基础知识相关的,这些基础知识,就像我们的内功,如果在未来想要走的更远,这些内功是必须要修炼的。框架千变万化,而这些通用的底层知识,却是几乎不变的,了解了这些知识,可以帮助我们更快着学习一门知识,更加懂得计算机的运行机制。当然,在面试中也经常会被问到,特别是对于应届生,对于春秋招,也可以看看我前阵子写过的文章历经两个月,我的秋招之路结束了!。也有读者经常问的计算...
不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,统计数量操作更是经常被用到。 关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT。 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
如何优化MySQL千万级大表,我写了6000字的解读
这是学习笔记的第2138篇文章 千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议。 从一开始脑海里开始也是火光四现,到不断的自我批评,后来也参考了一些团队的经验,我整理了下面的大纲内容。 既然要吃透这个问题,我们势必要回到本源,我把这个...
面试最后一问:你有什么问题想问我吗?
尽管,我们之前分享了这么多关于面试的主题: 高薪必备的一些Spring Boot高级面试题 面试必问:设计模式遵循的面向对象设计原则! 面试必问:怎么保证缓存与数据库的双写一致性? 27道高频Spring面试题,你能答对几个? 唠唠面试常问的:面向对象六大原则 一文高效图解二叉树面试题 Java面试中最高频的那20%知识点是什么? 百度面试题:求数组最大值 ... 然而,最后这个90%可见...
python 程序员进阶之路:从新手到高手的100个模块
在知乎和CSDN的圈子里,经常看到、听到一些 python 初学者说,学完基础语法后,不知道该学什么,学了也不知道怎么用,一脸的茫然。近日,CSDN的公众号推送了一篇博客,题目叫做《迷思:Python 学到什么程度可以面试工作?》,真实反映了 python 程序员在成长过程中的一些困惑。
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
程序员成长的四个简单技巧,你 get 了吗?
最近拜读了“阿里工程师的自我修养”手册,12 位技术专家分享生涯感悟来帮助我们这些菜鸡更好的成长,度过中年危机,我收获颇多,其中有不少的方法技巧和我正在使用的,这让我觉得我做的这些事情是对的,我走在了一条正确的道路上。我们程序员这个行业不像医生、律师等其他行业,那些行业可谓是越老越吃香,但是我们不一样,我们不能享受越老越吃香的待遇,因为互联网发展太快,技术不断的更新,就我工作的这短短几年时间就有不...
Java 8:一文掌握 Lambda 表达式
本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总结。
Python中几个非常有趣的模块
最近学习Python,发现了许多有趣的模块。感觉开启了新世界的大门,因为我也不是对所有模块都熟悉,所以今天不是讲代码。 1、ItChat 这是一个微信自动回复的模块,因为我微信一直无法登陆,所以也没有测试这个模块的功能。这里只是简单介绍一下。 使用流程大致就是: 登陆微信 注册监听 响应监听 结束 而我就卡在了登陆微信上面,注册监听的话代码也是非常简单的。它可以监听多种数据,文字、图片、视频等...
2020年秋招后端面经
主要包含华为,网易互娱,广联达,科大讯飞,浦发,中兴,上海农商行这些已经拿offer的,还有京东(不小心把二面时间换了一下,等通知等三个月了),虾皮(一面挂),顺丰(sp专场一面之后没消息,秋招第一个面试),携程的一些面经 文章目录1.自我介绍2.项目介绍3.接口和抽象类的区别相同点:不同点:4.多态5.重载和覆盖6.spring1.动态代理基于接口基于继承2.AOP2.1AOP3.IOC5.SS...
MySQL常用命令/用户管理/数据库备份与恢复
MySQL密码设置与更改: 设置root用户密码: [root@linux ~]# mysqladmin -uroot password "123456" 更改root用户密码: [root@linux ~]# mysqladmin -uroot -p'123456' password '654321' 登录数据库更改密码: MariaDB [(none)]&gt; use mysql; Ma...
小白成长以及学习轨迹:我的四年大学,写给正在读大学的你
前阵子有些读者问我大学期间的学习路线,说他自己现在有点迷茫。说实话,对于学习路线这种文章,一抓一大堆,我也不大喜欢去建议别人究竟该怎么学习,学习顺序之类的。不过对于大学,很多人进入大学的时候,可能都是同一个起点,大学四年过后,却是完全不同的人生轨迹。正好我也想记录下自己从高中进入大学这几年的学习与变化,我的大学经历,可以说是非常普通,没有参加任何竞赛,也没拿过奖学金(当然,国家助学金得拿,哈哈)。...
相关热词 c# mysql插入 c# sha256 加密 c#窗体上的叉添加事件 c#打印图片文件 c#後台調前台js c#控制台美化 c# 标记 浮点型 c#获取当前的农历日期 c# 构造函数重载 c# 页面功能注释