能用java rs232写rs吗,又要学很

学JAVA WEB 都学哪些内容?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
学JAVA WEB 都学哪些内容?
Spring,,还有三个框架:Strurs?还有好多标签,怎么学。有时还要配置什么web.XML,这又从哪学?感觉学的很多我借了本书看了下,hibernate,里面有什么XML,javabean,这三个框架是不是都要学
我有更好的答案
学起来很快的,我java0基础自学了2个月、建议去百度马士兵的视频看看.xml其实你懂点java的话其实不难。struts2无非配置个web.xml,struts
css,dwr框架,ajax,jQuery,xml,Spring,Strurts,Hibernate等,css,jsp,javascript,jdbc:java语法,html。在mvc里面又要学servlet,jsp,javabean等,框架最主流的当然是SSH了,即Spring,Strurts,Hibernate。总之大体用到的知识有,javascript.数据处理要学数据库(MySql,SQL Server,Orcal).然后要学些软件开发模式,MVC模式,SSH开发等,首先针对界面处理要学:htmlweb开发其实不像你想想中那么难,servlet
三大框架都要学,因为使用普通方法会产生大量数据的冗余,先从基础的servlet,jsp,jdbc开始。
为您推荐:
其他类似问题
您可能关注的内容
java的相关知识
换一换
回答问题,赢新手礼包前端Java学习前端Java学习用技术成就梦想!由于严重违反,该专栏已被禁止更新。Java 程序员{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&什么是后端开发?&,&author&:&wen-wen-de-xing-fu-6-93&,&content&:&\u003Cp\u003E 英文原文:\u003Ca href=\&https:\\u002Farticles\u002Fwhat-is-back-end-development\& data-editable=\&true\& data-title=\&What Is Back-End Development?\&\u003EWhat Is Back-End Development?\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E软件应用程序就像冰山一样。用户看到的只是应用程序的一部分——在大多数情况下——应用程序的最大部分是看不到的。这就是令人难以捉摸又神秘的“后端”。\u003C\u002Fp\u003E\u003Cp\u003E  在Web开发的篇章中,我们主要讨论Web开发,因为它涉及与最终用户的直接互动——我们可以称之为“前端Web开发”。\u003C\u002Fp\u003E\u003Cp\u003E  在大多数应用中,非用户接口代码比用户接口代码多得多。复杂系统是在后台发生的各种使其工作的逻辑。\u003C\u002Fp\u003E\u003Cp\u003E  我们需要存储和检索数据,需要遵循业务逻辑和规则,并且需要对结果进行预测。所有这一切都发生在幕后。\u003C\u002Fp\u003E\u003Cp\u003E  后端开发人员是这样的开发人员。\u003C\u002Fp\u003E\u003Ch2\u003E 后端开发究竟是什么?\u003C\u002Fh2\u003E\u003Cp\u003E  这篇文章的目的在于,我将会考虑后端开发是一种不涉及创建生成用户界面的开发。这可能包括后端Web开发,可能也涉及编写API,创建库或和没有用户界面或甚至科学编程系统的系统组件一起工作。\u003C\u002Fp\u003E\u003Cimg src=\&v2-236c37dfdd7aa.png\& data-rawwidth=\&1024\& data-rawheight=\&576\&\u003E\u003Cbr\u003E\u003Cp\u003E  在现实中,即使前端开发获得了大部分的荣耀,但是世界上存在的大多数代码(可以说是最有用的代码)是最终用户从来不会看到的后端代码。\u003C\u002Fp\u003E\u003Cp\u003E  简单来说,后端开发就是开发人员编写的不能直接看到的代码。\u003C\u002Fp\u003E\u003Ch2\u003E 后端开发人员做什么?\u003C\u002Fh2\u003E\u003Cp\u003E  根据正在处理的应用程序的大小和范围,后端开发人员要做的事情有很大的不同。在我是一个后端开发人员时,我做了很多工作,工作于应用程序中的业务逻辑,以及从前端提取和检索数据。\u003C\u002Fp\u003E\u003Cp\u003E  在Web开发世界中,大多数后端开发人员从事于构建他们正在工作的应用程序背后的实际逻辑。\u003C\u002Fp\u003E\u003Cp\u003E  通常,前端开发人员构建用户界面,而后端开发人员编写代码,使其工作。\u003C\u002Fp\u003E\u003Cp\u003E  例如,前端开发人员在应用程序中创建一个界面,上面有一个按钮,按下按钮来获取客户的数据。\u003C\u002Fp\u003E\u003Cp\u003E  后端开发人员写可使得按钮工作的代码,通过指出从数据库中提取哪些数据并将其传回到前端(并最终显示在那里)。\u003C\u002Fp\u003E\u003Cp\u003E  后端开发人员也可能会大量参与系统架构,决定如何组织系统的逻辑,以便能够正常维护和运行。\u003C\u002Fp\u003E\u003Cp\u003E  他可能会参与构建框架或系统架构,以便于更容易编写程序。后端开发人员比前端开发人员花费更多的时间在实现算法和解决问题上。\u003C\u002Fp\u003E\u003Cp\u003E  我一直都很喜欢后端开发工作,因为它更像一个挑战。\u003C\u002Fp\u003E\u003Cp\u003E  这并不是说前端开发人员不解决难题,但通常前端开发工作更多的是关于创建用户界面和与之相关的内容,而不是实现实际的业务逻辑,使应用程序工作。\u003C\u002Fp\u003E\u003Ch2\u003E 后端开发的主要技术和技能\u003C\u002Fh2\u003E\u003Cp\u003E  前端开发人员需要知道一系列用于创建用户界面的工具,而后端开发人员通常使用的是一套完全不同的工具和技能,以便于高效地完成他们的工作。\u003C\u002Fp\u003E\u003Cp\u003E  后端开发人员所需的一个重要技能与SQL和数据库有关。大多数后端系统需要连接到存储应用程序数据的数据库。\u003C\u002Fp\u003E\u003Cimg src=\&v2-76dee7f631bd7c0b404ea64b28e5588b.png\& data-rawwidth=\&1024\& data-rawheight=\&576\&\u003E\u003Cbr\u003E\u003Cp\u003E  后端开发人员通常的工作是从数据库或其他数据源写入、读取和处理数据,因此拥有SQL等技能会非常重要。后端开发人员——至少对于Web开发——也需要擅长他们正在使用的技术栈的服务器端语言。\u003C\u002Fp\u003E\u003Cp\u003E  例如,虽然前端Web开发人员更多地专注于HTML,CSS和JavaScript,而后端开发人员需要更多地了解PHP Web框架,Ruby on Rails,ASP.NET MVC或任何正用于构建应用程序的服务器端Web开发框架。\u003C\u002Fp\u003E\u003Cp\u003E  最后,我想说,后端开发人员需要更多地了解应用程序架构,因为大多数情况下,后端开发人员需要去构建应用程序的体系结构和内部设计。\u003C\u002Fp\u003E\u003Cp\u003E  一个好的后端开发人员得知道如何使用各种框架和库,如何将它们集成到应用程序中,以及如何构建代码和业务逻辑,用一种使系统更易于维护的方式。\u003C\u002Fp\u003E\u003Cp\u003E  如果你喜欢设计应用程序的基础设施,实现算法和逻辑,以及工作于数据,那么你可能会喜欢成为一名后端开发人员。\u003C\u002Fp\u003E\u003Ch2\u003E 关于全栈开发人员?\u003C\u002Fh2\u003E\u003Cp\u003E  我曾想为全栈开发人员另起一篇文章,但后来想到,既然已经涵盖了Web开发和后端开发,那么延伸开去谈论全栈开发更为理所当然,因为全栈开发刚好涉及了前端和后端开发。\u003C\u002Fp\u003E\u003Cimg src=\&v2-4be41ccffbac.jpg\& data-rawwidth=\&500\& data-rawheight=\&500\&\u003E\u003Cbr\u003E\u003Cp\u003E  实际上,全栈开发包括处理系统或软件开发堆栈的所有组件和层。它甚至可能涉及了解服务器硬件和架构,或者被认为是DevOps。\u003C\u002Fp\u003E\u003Cp\u003E  今天,越来越多的软件开发职位在寻找能够进行全栈开发的开发人员,因为对于软件开发人员来说能够工作于涉及的整个技术栈是很有价值的,而不是将前端开发与后端开发兵分两路。\u003C\u002Fp\u003E\u003Cp\u003E  一部分原因是现在越来越多的应用程序模糊了前端和后端开发之间的界限。\u003C\u002Fp\u003E\u003Cp\u003E  许多流行的JavaScript框架,如Angular,允许你在系统的用户界面部分中创建可以被视为业务逻辑的大部分内容。\u003C\u002Fp\u003E\u003Cp\u003E  此外,随着越来越多的团队采用敏捷方法,个体程序员被要求不仅仅能工作于他们的专业领域,因为任务被分配给团队远超过个人。\u003C\u002Fp\u003E\u003Cp\u003E  我认为成为一个全栈开发人员是有用的——并且你应该充分了解软件的每个层次发生了什么——但我不认为“专业化”全栈开发人员是顶好的主意,因为这不是一个专业领域。\u003C\u002Fp\u003E\u003Cp\u003E  基本上,你应该专注于获取你可能会用到的最常见的技术栈的广泛知识,但你应该选择一个或两个主要的专业,然后朝着选择的方向真正地去深入钻研。\u003C\u002Fp\u003E\u003Cp\u003E  所有软件开发人员都应该知道如何创建用户界面,所使用的框架的基础,如何从应用程序中存储和检索数据库中的数据,甚至了解基础设施如何支持软件,他们不需要成为所有所有这些领域的专家,因为这些领域不但相当大而且在不断扩大。\u003C\u002Fp\u003E\u003Cp\u003E  具备技术堆栈中通用和有效的所有知识或一些领域中的专业化知识或许要好得多。\u003C\u002Fp\u003E\u003Cp\u003E  然后,你仍然可以称自己为“全栈”,但实际上,对于团队而言,你这样的人才更加有用得多。\u003C\u002Fp\u003E\u003Cp\u003E学习交流群:\u003Ca href=\&https:\u002F\\u002F?_wv=1027&k=49VeOsb\& data-editable=\&true\& data-title=\&点击链接加入群【java网络编程】\& class=\&\&\u003E点击链接加入群【java网络编程】\u003C\u002Fa\u003E后端的小伙伴,加入里面一起交流学习!\u003C\u002Fp\u003E&,&updated&:new Date(&T10:48:21.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:1,&likeCount&:21,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T18:48:21+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-460eabadf706a7a9bf6efb17d2a195c1_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:1,&likesCount&:21}},&User&:{&wen-wen-de-xing-fu-6-93&:{&isFollowed&:false,&name&:&稳稳的幸福&,&headline&:&&,&avatarUrl&:&https:\u002F\\u002F9f0eafda6d44bb0d845b_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&wen-wen-de-xing-fu-6-93&,&bio&:&工程师&,&hash&:&f918c6b425a30f1e65c046&,&uid&:285900,&isOrg&:false,&description&:&&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fwen-wen-de-xing-fu-6-93&,&avatar&:{&id&:&9f0eafda6d44bb0d845b&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&searchSectionStyle&:&loosen&,&androidPassThroughPush&:&leancloud&,&newMore&:&new&,&nwebQAGrowth&:&experiment&,&nwebFeedAd&:&experiment&,&newSign&:&newVersion&,&androidDbFeedHashTagStyle&:&button&,&liveReviewBuyBar&:&live_review_buy_bar_2&,&qawebRelatedReadingsContentControl&:&open&,&liveStore&:&ls_a2_b2_c1_f2&,&qawebThumbnailAbtest&:&new&,&nwebSearch&:&nweb_search_heifetz&,&searchHybridTabs&:&without-tabs&,&enableVoteDownReasonMenu&:&enable&,&iOSEnableFeedModuleWWANAritclePreRender&:&iOS_FeedModule_WWAN_PreRender_Enable&,&isOffice&:&false&,&enableTtsPlay&:&false&,&liveDetailWechatBanner&:&Live_detail_wechat_banner_1&,&wechatShareModal&:&wechat_share_modal_show&,&newLiveFeedMediacard&:&old&,&homeUi2&:&default&,&showVideoUploadAttention&:&true&,&recommendationAbtest&:&new&,&qrcodeLogin&:&qrcode&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&androidDbCommentWithRepinRecord&:&open&,&androidDbRecommendAction&:&open&,&zcmLighting&:&zcm&,&favAct&:&default&,&appStoreRateDialog&:&close&,&mobileQaPageProxyHeifetz&:&m_qa_page_nweb&,&newAppViewRelatedAd&:&yes&,&default&:&None&,&isNewNotiPanel&:&yes&,&androidDbRepinSelection&:&open&,&nwebRelatedAdvert&:&default&,&qaStickySidebar&:&sticky_sidebar&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&experiment&}},&columns&:{&next&:{},&MKedu&:{&followersCount&:308,&creator&:{&bio&:&前端&,&isFollowing&:false,&hash&:&cefe5b201a51c196aa8c871cecc6ca76&,&uid&:951400,&isOrg&:false,&slug&:&cecil-macadam&,&isFollowed&:false,&description&:&前端小小白一枚,可以加微信一起交流啊 &,&name&:&Cecil Macadam&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fcecil-macadam&,&avatar&:{&id&:&v2-0e335dfad4ca3e0313cc25&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&HTML&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&编程&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&IT 行业&}],&activateState&:&ban&,&href&:&\u002Fapi\u002Fcolumns\u002FMKedu&,&acceptSubmission&:true,&firstTime&:false,&postTopics&:[{&postsCount&:9,&id&:99,&name&:&互联网&},{&postsCount&:9,&id&:12452,&name&:&IT 行业&},{&postsCount&:7,&id&:1354,&name&:&编程&},{&postsCount&:5,&id&:707,&name&:&程序员&},{&postsCount&:4,&id&:225,&name&:&前端开发&},{&postsCount&:4,&id&:367,&name&:&HTML&},{&postsCount&:3,&id&:769,&name&:&JavaScript&},{&postsCount&:1,&id&:1100,&name&:&英语&},{&postsCount&:1,&id&:3646,&name&:&Java&},{&postsCount&:1,&id&:5573,&name&:&Div+CSS&},{&postsCount&:1,&id&:10819,&name&:&Java 编程&},{&postsCount&:1,&id&:26439,&name&:&Java 程序员&},{&postsCount&:1,&id&:39377,&name&:&Sublime Text&}],&pendingName&:&&,&avatar&:{&id&:&v2-6a3e7ecfe3ad438a65fb8aa293c2fdff&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&canManage&:false,&description&:&相互学习,交流,欢迎大家来采访!&,&pendingTopics&:[],&nameCanEditUntil&:0,&reason&:&&,&banUntil&:0,&slug&:&MKedu&,&name&:&前端Java学习&,&url&:&\u002FMKedu&,&intro&:&用技术成就梦想!&,&topicsCanEditUntil&:0,&activateAuthorRequested&:&none&,&commentPermission&:&anyone&,&following&:false,&postsCount&:16,&canPost&:false,&FULLINFO&:true,&pins&:[]}},&columnPosts&:{&MKedu&:{&entity&:[&&],&topic&:&Java 程序员&}},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&switches&:{&couldSetPoster&:false},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{&baidu&:false,&yidianzixun&:false,&qqnews&:false},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false,&userAgent&:{&ua&:&Mozilla\u002F5.0 (compatible, MSIE 11, Windows NT 6.3; Trident\u002F7.0; rv:11.0) like Gecko&,&browser&:{&name&:&IE&,&version&:&11&,&major&:&11&},&engine&:{&version&:&7.0&,&name&:&Trident&},&os&:{&name&:&Windows&,&version&:&8.1&},&device&:{},&cpu&:{}}},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}0基础可以学习JAVA吗? - 机器人论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
0基础可以学习JAVA吗?
发表于 6&小时前  
  Java诞生于1995年,至今已有20多年的发展史,相比于其他编程语言,Java是一门更具生命力的语言,就目前整个互联网行业对Java工程师的需求来说,Java编程前途光明。
  2017年,我国Java人才缺口可达42.5万,并且以每年20%的速度增长,根据IDC的统计数据,在所有软件开发类人才的需求中,对Java工程师的需求量达到全部需求量的60%~70%,因此,对于想转行从事IT行业的人员来说,从事Java编程工作仍然是一个不错的选择!
  什么人适合学习Java?
  1. 可以是0基础,但数理能力较好,想通过从事软件开发来获得高薪的人员;
  2. 对Java感兴趣,想学习编程入门语言的人员;
  3. 想后期转做大数据分析和人工智能的人员;
  4. 期望有个稳定职业发展的人员。
  新手如何学习java?
  1. 心态很重要,java学习是一个枯燥乏味的过程,一旦下定决心去学习,就要坚持不懈!
  2. 选好学习方式,如果你觉得自己学习能力足够强,自学完全能够学精通,则可以选择自学;如果你觉得自学无法入门,需要高人指点,可以报班学习!
  3. 勤思考、多练习,任何语言的学习都离不开想与做,学而不思则罔,思而不学则殆,对于Java的学习要拥有举一反三的能力,并且要勤敲代码,熟能生巧。
  4. 要学会做总结,把自己学到的和遇到的问题及时总结,一方面可以加深记忆,另一方面
  老男孩教育java学习路线图
  Java培训就选老男孩教育的优势
  1. 课程贴合现在企业技术需求;
  2. 业内独有Spring Boot+Vue的全栈课程;
  3. 专家级教师亲自带领实战教学;
  4. 定期举行行业内大牛邀请课;
  5. 以高薪就业为导向的实战教学;
  6. 重视动手更重视Java开发思想;
  7. 课程体系连贯可解决学员十年职业发展;
  8. 五个多月学习相当于两年工作经验。
只有小组成员才能发言,
192个成员聚集在这个小组
创建小组步骤
创建小组创建自己的地盘
个性设置精心打造小组空间
邀请好友邀请好友加入我的小组
小组升级小组积分升级赢得社区推荐
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司相关文章推荐
1、常量的定义
常量是指在程序运行的过程中,其值不能被改变的量。
2、常量的分类
A:字面值常量
B:自定义常量(面向对象)
数据库安装好之后,接下来就是怎么去使用服务器,怎么像连接关系型数据库一样去连接和操作数据。以下介绍java连接redis数据库并实现操作
在连接redis数据库之前需要对redis,做如下设置:...
Java实现对组件事件(如单击、输入等)的监听和JavaScript类似,都是先添加Listener,再写触发函数,不同的是,Java实现监听前必须使用implements将各个接口添加到类内。
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客分类:
一直以来都是在学习J2EE方面的应用系统开发,从未想过用JAVA来编写硬件交互程序,不过自己就是喜欢尝试一些未曾接触的新东西。在网上搜索了些资源,了解到JAVA写串口通讯的还是蛮多的,那么便着手准备开发调试环境。软件程序开发环境搭建不成问题,可这硬件环境就有点犯难啦。更何况自己用的是笔记本哪来的串口呀,再说要是真拿这串口硬件来自己也不会弄,随即想到了虚拟机,觉得这东西应该也有虚拟的吧,果真跟自己的猜测一样还真有这东西,顺便也下载了个串口小助手做为调试之用。下面就先看看软件环境的搭建:
1.下载comm.jar、win32com.dll和m.properties。 (附件提供下载)
介绍:comm.jar提供了通讯用的java API,win32com.dll提供了供comm.jar调用的本地驱动接口,m.properties是这个驱动的类配置文件
2.拷贝javacomm.jar到X:\jre\lib\ext目录下面;
3.拷贝m.properties到X:\jre\lib目录下面;
4.拷贝win32com.dll到X:\jre\bin目录下面;
5.更新下IDE里面的JDK环境,如下图:
接着是硬件虚拟环境安装虚拟串口,这里我用的是VSPD6.0(附件提供下载),安装好后启动VSPD添加我们所需要的端口,注意这里是按组的方式添加的,例如COM1和COM2是一组同时添加,以此类推。如下图所示:
所有环境都准备好后,先来简单认识下comm.jar的内容。单从comm API的javadoc来看,SUM提供给我们的只有区区以下13个类或接口,具体如下:
</m.CommDriver
</m.CommPort
m.ParallelPort
</m.SerialPort
m.CommPortIdentifier
</m.CommPortOwnershipListener
</m.ParallelPortEvent
m.SerialPortEvent
</m.ParallelPortEventListener (extends java.util.EventListener)
</m.SerialPortEventListener (extends java.util.EventListener)
</m.NoSuchPortException
m.PortInUseException
</m.UnsupportedCommOperationException
这些类和接口命名一看便知其意,就不做一一介绍啦,可以到官网或网上找到更详细的信息。下面先测试下所搭建的环境是否可用,主要代码如下:
Enumeration&?& en = CommPortIdentifier.getPortIdentifiers();
CommPortIdentifier portId;
while (en.hasMoreElements()) {
portId = (CommPortIdentifier) en.nextElement();
// 如果端口类型是串口,则打印出其端口信息
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
System.out.println(portId.getName());
运行代码后,控制台有输出正确的端口(如下图),说明所有环境正常可进行下步工作,否则请检查。
最后要解决的就是与串口数据交互的问题。在这个问题上,最主要的难点就是数据读取,因为我们不知道端口什么时候会有数据到来,也不知数据长度如何。通常,串口通信应用程序有两种模式,一种是实现SerialPortEventListener接口,监听各种串口事件并作相应处理;另一种就是建立一个独立的接收线程专门负责数据的接收。参考众多老前辈的代码后,下面就采用第一种方式写了个简单的助手程序,具体的实现请看详细代码,如下:
package com.elkan1788.
import java.awt.BorderL
import java.awt.B
import java.awt.C
import java.awt.F
import java.awt.GridL
import java.awt.I
import java.awt.TextA
import java.awt.TextF
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.util.ArrayL
import java.util.E
import java.util.L
import java.util.TooManyListenersE
m.CommPortI
m.NoSuchPortE
m.PortInUseE
m.SerialPortE
m.SerialPortEventL
m.UnsupportedCommOperationE
import javax.imageio.ImageIO;
import javax.swing.JComboB
import javax.swing.JF
import javax.swing.JL
import javax.swing.JOptionP
import javax.swing.JP
import javax.swing.SwingC
import javax.swing.border.EmptyB
public class JavaRs232 extends JFrame implements ActionListener, SerialPortEventListener {
* JDK Serial Version UID
private static final long serialVersionUID = -0790103L;
protected int WIN_WIDTH = 380;
protected int WIN_HEIGHT = 300;
private JComboBox&?& portCombox, rateCombox, dataCombox, stopCombox, parityC
private Button openPortBtn, closePortBtn, sendMsgB
private TextField sendTf;
private TextArea readTa;
private JLabel statusLb;
private String portname, rate, data, stop,
protected CommPortIdentifier portId;
protected Enumeration&?&
protected List&String& portL
protected SerialPort serialP
protected OutputStream outputStream =
protected InputStream inputStream =
protected S
protected int sendCount, reciveC
* 默认构造函数
public JavaRs232() {
super("Java RS-232串口通信测试程序
凡梦星尘");
setSize(WIN_WIDTH, WIN_HEIGHT);
setLocationRelativeTo(null);
Image icon =
icon = ImageIO.read(JavaRs232.class.getResourceAsStream("/res/rs232.png"));
} catch (IOException e) {
showErrMesgbox(e.getMessage());
setIconImage(icon);
setResizable(false);
scanPorts();
initComponents();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
* 初始化各UI组件
下午11:56:39
public void initComponents() {
// 共用常量
Font lbFont = new Font("微软雅黑", Font.TRUETYPE_FONT, 14);
// 创建左边面板
JPanel northPane = new JPanel();
northPane.setLayout(new GridLayout(1, 1));
// 设置左边面板各组件
JPanel leftPane = new JPanel();
leftPane.setOpaque(false);
leftPane.setLayout(new GridLayout(3,2));
JLabel portnameLb = new JLabel("串口号:");
portnameLb.setFont(lbFont);
portnameLb.setHorizontalAlignment(SwingConstants.RIGHT);
portCombox = new JComboBox&String&((String [])portList.toArray(new String[0]));
portCombox.addActionListener(this);
JLabel databitsLb = new JLabel("数据位:");
databitsLb.setFont(lbFont);
databitsLb.setHorizontalAlignment(SwingConstants.RIGHT);
dataCombox = new JComboBox&Integer&(new Integer[]{5, 6, 7, 8});
dataCombox.setSelectedIndex(3);
dataCombox.addActionListener(this);
JLabel parityLb = new JLabel("校验位:");
parityLb.setFont(lbFont);
parityLb.setHorizontalAlignment(SwingConstants.RIGHT);
parityCombox = new JComboBox&String&(new String[]{"NONE","ODD","EVEN","MARK","SPACE"});
parityCombox.addActionListener(this);
// 添加组件至面板
leftPane.add(portnameLb);
leftPane.add(portCombox);
leftPane.add(databitsLb);
leftPane.add(dataCombox);
leftPane.add(parityLb);
leftPane.add(parityCombox);
//创建右边面板
JPanel rightPane = new JPanel();
rightPane.setLayout(new GridLayout(3,2));
// 设置右边面板各组件
JLabel baudrateLb = new JLabel("波特率:");
baudrateLb.setFont(lbFont);
baudrateLb.setHorizontalAlignment(SwingConstants.RIGHT);
rateCombox = new JComboBox&Integer&(new Integer[]{00,,});
rateCombox.setSelectedIndex(2);
rateCombox.addActionListener(this);
JLabel stopbitsLb = new JLabel("停止位:");
stopbitsLb.setFont(lbFont);
stopbitsLb.setHorizontalAlignment(SwingConstants.RIGHT);
stopCombox = new JComboBox&String&(new String[]{"1","2","1.5"});
stopCombox.addActionListener(this);
openPortBtn = new Button("打开端口");
openPortBtn.addActionListener(this);
closePortBtn = new Button("关闭端口");
closePortBtn.addActionListener(this);
// 添加组件至面板
rightPane.add(baudrateLb);
rightPane.add(rateCombox);
rightPane.add(stopbitsLb);
rightPane.add(stopCombox);
rightPane.add(openPortBtn);
rightPane.add(closePortBtn);
// 将左右面板组合添加到北边的面板
northPane.add(leftPane);
northPane.add(rightPane);
// 创建中间面板
JPanel centerPane = new JPanel();
// 设置中间面板各组件
sendTf = new TextField(42);
readTa = new TextArea(8,50);
readTa.setEditable(false);
readTa.setBackground(new Color(225,242,250));
centerPane.add(sendTf);
sendMsgBtn = new Button(" 发送 ");
sendMsgBtn.addActionListener(this);
// 添加组件至面板
centerPane.add(sendTf);
centerPane.add(sendMsgBtn);
centerPane.add(readTa);
// 设置南边组件
statusLb = new JLabel();
statusLb.setText(initStatus());
statusLb.setOpaque(true);
// 获取主窗体的容器,并将以上三面板以北、中、南的布局整合
JPanel contentPane = (JPanel)getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.setBorder(new EmptyBorder(0, 0, 0, 0));
contentPane.setOpaque(false);
contentPane.add(northPane, BorderLayout.NORTH);
contentPane.add(centerPane, BorderLayout.CENTER);
contentPane.add(statusLb, BorderLayout.SOUTH);
* 初始化状态标签显示文本
* @return String
上午12:01:53
public String initStatus() {
portname = portCombox.getSelectedItem().toString();
rate = rateCombox.getSelectedItem().toString();
data = dataCombox.getSelectedItem().toString();
stop = stopCombox.getSelectedItem().toString();
parity = parityCombox.getSelectedItem().toString();
StringBuffer str = new StringBuffer("当前串口号:");
str.append(portname).append(" 波特率:");
str.append(rate).append(" 数据位:");
str.append(data).append(" 停止位:");
str.append(stop).append(" 校验位:");
str.append(parity);
return str.toString();
* 扫描本机的所有COM端口
上午12:02:42
public void scanPorts() {
portList = new ArrayList&String&();
Enumeration&?& en = CommPortIdentifier.getPortIdentifiers();
CommPortIdentifier portId;
while(en.hasMoreElements()){
portId = (CommPortIdentifier) en.nextElement();
if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){
String name = portId.getName();
if(!portList.contains(name)) {
portList.add(name);
if(null == portList
|| portList.isEmpty()) {
showErrMesgbox("未找到可用的串行端口号,程序无法启动!");
System.exit(0);
* 打开串行端口
上午12:03:07
public void openSerialPort() {
// 获取要打开的端口
portId = CommPortIdentifier.getPortIdentifier(portname);
} catch (NoSuchPortException e) {
showErrMesgbox("抱歉,没有找到"+portname+"串行端口号!");
setComponentsEnabled(true);
// 打开端口
serialPort = (SerialPort) portId.open("JavaRs232", 2000);
statusLb.setText(portname+"串口已经打开!");
} catch (PortInUseException e) {
showErrMesgbox(portname+"端口已被占用,请检查!");
setComponentsEnabled(true);
// 设置端口参数
int rate = Integer.parseInt(this.rate);
int data = Integer.parseInt(this.data);
int stop = stopCombox.getSelectedIndex()+1;
int parity = parityCombox.getSelectedIndex();
serialPort.setSerialPortParams(rate,data,stop,parity);
} catch (UnsupportedCommOperationException e) {
showErrMesgbox(e.getMessage());
// 打开端口的IO流管道
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
} catch (IOException e) {
showErrMesgbox(e.getMessage());
// 给端口添加监听器
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
showErrMesgbox(e.getMessage());
serialPort.notifyOnDataAvailable(true);
* 给串行端口发送数据
上午12:05:00
public void sendDataToSeriaPort() {
sendCount++;
outputStream.write(mesg.getBytes());
outputStream.flush();
} catch (IOException e) {
showErrMesgbox(e.getMessage());
statusLb.setText("
发送: "+sendCount+"
接收: "+reciveCount);
* 关闭串行端口
上午12:05:28
public void closeSerialPort() {
if(outputStream != null)
outputStream.close();
if(serialPort != null)
serialPort.close();
serialPort =
statusLb.setText(portname+"串口已经关闭!");
sendCount = 0;
reciveCount = 0;
sendTf.setText("");
readTa.setText("");
} catch (Exception e) {
showErrMesgbox(e.getMessage());
* 显示错误或警告信息
* @param msg 信息
上午12:05:47
public void showErrMesgbox(String msg) {
JOptionPane.showMessageDialog(this, msg);
* 各组件行为事件监听
public void actionPerformed(ActionEvent e) {
if(e.getSource() == portCombox
|| e.getSource() == rateCombox
|| e.getSource() == dataCombox
|| e.getSource() == stopCombox
|| e.getSource() == parityCombox){
statusLb.setText(initStatus());
if(e.getSource() == openPortBtn){
setComponentsEnabled(false);
openSerialPort();
if(e.getSource() == closePortBtn){
if(serialPort != null){
closeSerialPort();
setComponentsEnabled(true);
if(e.getSource() == sendMsgBtn){
if(serialPort == null){
showErrMesgbox("请先打开串行端口!");
mesg = sendTf.getText();
if(null == mesg || mesg.isEmpty()){
showErrMesgbox("请输入你要发送的内容!");
sendDataToSeriaPort();
* 端口事件监听
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:
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[50];
while (inputStream.available() & 0) {
inputStream.read(readBuffer);
StringBuilder receivedMsg = new StringBuilder("/-- ");
receivedMsg.append(new String(readBuffer).trim()).append(" --/\n");
readTa.append(receivedMsg.toString());
reciveCount++;
statusLb.setText("
发送: "+sendCount+"
接收: "+reciveCount);
} catch (IOException e) {
showErrMesgbox(e.getMessage());
* 设置各组件的开关状态
* @param enabled 状态
上午12:06:24
public void setComponentsEnabled(boolean enabled) {
openPortBtn.setEnabled(enabled);
openPortBtn.setEnabled(enabled);
portCombox.setEnabled(enabled);
rateCombox.setEnabled(enabled);
dataCombox.setEnabled(enabled);
stopCombox.setEnabled(enabled);
parityCombox.setEnabled(enabled);
* 运行主函数
* @param args
上午12:06:45
public static void main(String[] args) {
new JavaRs232();
代码编写完成,按下F11键进入调试状态,一切运行正常良好,请看图:
1.启动界面
2.端口检测
3. 通讯测试
最后再抽空来美化程序下,效果更漂亮,谁还会说JAVA程序的界面丑陋呢,呵呵...
第一次发文虽没有什么技术含量但也实属不易哪,欢迎大家拍砖,嘻嘻....
下载次数: 1312
浏览 25660
浏览: 28174 次
来自: 兴宁
64位系统无法使用Error loading win32com ...
为啥用eclipse编译楼主的代码有如下错误,如何处理??// ...
getResourceAsStream
win10 64 位 jdk1.8 可以吗?
未找到急求可用的串行端口号,程序无法启动!
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 java rs 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信