串口数据上传下发

  1 import gnu.io.CommPortIdentifier;
  2 import gnu.io.NoSuchPortException;
  3 import gnu.io.PortInUseException;
  4 import gnu.io.SerialPort;
  5 import gnu.io.SerialPortEvent;
  6 import gnu.io.SerialPortEventListener;
  7 import gnu.io.UnsupportedCommOperationException;
  8
  9 import java.io.IOException;
 10 import java.io.InputStream;
 11 import java.io.OutputStream;
 12 import java.util.ArrayList;
 13 import java.util.List;
 14 import java.util.TooManyListenersException;
 15
 16 import org.springframework.stereotype.Controller;
 17 import org.springframework.web.bind.annotation.RequestMapping;
 18
 19 import com.aotoso.control.Log.Log;
 20 import com.aotoso.control.base.BaseController;
 21 import com.aotoso.entity.FirstInformationManage.CarManageBean;
 22 import com.aotoso.server.FirstInformationManage.CarManageService;
 23 import com.aotoso.util.PageData;
 24
 25 /**
 26 * 处理下发、串口上传的数据
 27 */
 28 @Controller
 29 @RequestMapping("/com")
 30 public class PortCommunication extends BaseController implements SerialPortEventListener {
 31   // 获取串口
 32   public static SerialPort serialPort;
 33   // 创建输入流,用于获取串口传入的数据
 34   private InputStream inputStream;
 35
 36   /**
 37   * 打开串口
 38   * @return
 39   */
 40   @RequestMapping(value = "/openCOM")
 41   public SerialPort OpenCOM(){
 42     System.out.println("打开串口");
 43     try {
 44       //找到串口名称为COM3的串口
 45       CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM3");
 46       //设置串口通信名称(名称是随意命名的),阻塞时的毫秒数
 47       serialPort = (SerialPort)portIdentifier.open("TMR饲喂监控系统串口通信", 2000);
 48       //获取串口输入流
 49       inputStream = serialPort.getInputStream();
 50       //在打开串口的同时开启监听串口事件
 51       serialPort.addEventListener(this);
 52       //设置串口有数据的事件,当为true时有效
 53       serialPort.notifyOnDataAvailable(true);
 54       //设置串口通信参数,波特率9600、数据位8、停止位1、校验方式0表示无
 55       serialPort.setSerialPortParams(9600, 8, 1, 0);
 56       //设置流量控制为不受控制
 57       serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
 58       return serialPort;
 59     } catch (NoSuchPortException e) {
 60       System.out.println("端口不存在");
 61     } catch (PortInUseException e) {
 62       System.out.println("端口已经被占用");
 63     } catch (UnsupportedCommOperationException e) {
 64       System.out.println("端口操作命令不支持");
 65     } catch (TooManyListenersException e) {
 66       System.out.println("端口中数据读取异常");
 67     } catch (IOException e) {
 68       System.out.println("输入或输出异常");
 69     }
 70     return null;
 71   }
 72
 73   /**
 74   * 关闭串口
 75   */
 76   @RequestMapping(value = "/CloseCom")
 77   public void CloseCom(){
 78     System.out.println("关闭串口");
 79     serialPort.close();
 80   }
 81
 82   /**
 83   * 发送数据
 84   * @param by
 85   */
 86   public void outputInformationToTMR(byte[] by) {
 87     try{
 88       //准备一个输出流
 89       OutputStream outputStream = serialPort.getOutputStream();
 90       //向串口传送数据
 91       outputStream.write(by);
 92       //刷新此输出流并强制写出所有缓冲的输出字节
 93       outputStream.flush();
 94       //关闭输出流并释放所有和此流有关的系统资源
 95       outputStream.close();
 96     } catch (IOException e) {
 97       System.out.println("端口打开异常");
 98     }
 99   }
100
101   /**
102   * 监听串口(此方法继承自SerialPortEventListener)
103   */
104   @Override
105   public void serialEvent(SerialPortEvent event) {
106     switch (event.getEventType()) {
107     case SerialPortEvent.BI: //通信中断
108     case SerialPortEvent.OE: //溢位错误
109     case SerialPortEvent.FE: //帧错误
110     case SerialPortEvent.PE: //奇偶错误
111     case SerialPortEvent.CD: //载波错误
112     case SerialPortEvent.CTS: //清除发送
113     case SerialPortEvent.DSR: //数据设备准备好
114     case SerialPortEvent.RI: //振铃错误
115     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: //输出缓冲区已清空
116       break;
117     case SerialPortEvent.DATA_AVAILABLE: //有数据到达
118       readCom();
119       Log.LogForTXT("");
120       break;
121     }
122   }
123
124   /**
125   * 接收串口中的数据
126   */
127   public void readCom(){
128     try {
129       //等待1毫秒,以便让数据读取完整
130       Thread.sleep(100);
131     } catch (InterruptedException e1) {
132       e1.printStackTrace();
133     }
134     // buffer中的实际数据字节数
135     int numBytes = 0;
136     // 4k的buffer空间,缓存串口读入的数据
137     byte[] readBuffer = new byte[4096];
138     try {
139       // 多次读取,将所有数据读入
140       while (inputStream.available() > 0) {
141         numBytes = inputStream.read(readBuffer);
142       }
143     } catch (Exception e) {
144       e.printStackTrace();
145     }
146     System.out.println(bytesToHexString(readBuffer));
147   }
148
149   /**
150   * 将Hex格式的数据转换为16进制的字符串
151   * @param by
152   * @return string
153   */
154   public String bytesToHexString(byte[] by){
155     StringBuilder stringBuilder = new StringBuilder("");
156     for (int i = 0; i < by.length; i++) {
157       int in = by[i] & 0xFF;
158       String str = Integer.toHexString(in);
159       if (str.length() < 2) {
160         stringBuilder.append(0);
161       }
162       stringBuilder.append(str);
163     }
164     return stringBuilder.toString();
165   }
166 }
时间: 2024-10-14 03:39:12

串口数据上传下发的相关文章

【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究

笔者接触高通物联网框架AllJoyn不太久,但确是被深深地吸引了.在我看来,促进我深入学习的原因有三点:一.AllJoyn开源,对开源的软硬件总会有种莫名的喜爱,尽管也许不会都深入下去:二.顺应潮流,物联网虽远未普及,但已是大势所趋,高通公司在领域布局,致力于打造舒适高效的智能家居场景,推出AllJoyn软件框架,适应了发展趋势:三.文档丰富,开源软件的使用,特别是框架,若没有文档相助,相信没有多少开发者愿意尝试,AllJoyn在这方面做得不错,日后还需做得更好.当然啦,也有些额外原因,包括高通

C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)

目       录 工业物联网和集成系统解决方案的技术路线... 1 前言... 1 第一章           系统架构... 3 1.1           硬件构架图... 3 1.2           组件构架图... 4 第二章           技术选型与介绍... 5 2.1           开发环境... 5 2.2           数据源... 5 2.3           数据采集... 5 2.4           数据上传服务... 6 2.5      

Chromium硬件加速渲染的GPU数据上传机制分析

在Chromium中,WebGL端.Render端和Browser端通过命令缓冲区将GPU命令发送给GPU进程执行.GPU命令携带的简单参数也通过命令缓冲区发送给GPU进程,但是复杂参数,例如纹理数据,有可能太大以致命令缓冲区无法容纳,因此需要通过其它机制传递给GPU进程.本文接下来就主要以纹理数据上传为例,分析WebGL端.Render端和Browser端将GPU命令数据传递给GPU进程的机制. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! WebGL

一个简单实际的Windows服务:实现本地数据上传到服务器

功能:实现本地数据上传到远程服务器 操作实现: 1.发送本地ID到远程服务器进行身份验证,验证成功则可Get到本地需要发送的数据的ID,例如: 本地发送身份ID:key123,验证成功,则远程服务器匹配到该ID所包含的数据条目,例如传回7个ExdID. 2.收到7个ExdID后,本地需要传输数据库中许多数据中的这7个ExdID所对应的数据到远程服务器,远程服务器将收到的数据保存.更新到远程数据库中. 注意问题: 1.为保证带宽负载轻松,不能频繁往远程服务器传输数据. 2.考虑到断网情况,断网之间

C#数据上传方法

/// <summary> /// 连接成功后开始调用数据上传程序 /// </summary> public void CallDataUpload() { //指定上传日期后,只上传指定日期的数据 //取指定的上传日期 string defineScrq = GetDefineScrq(); if (defineScrq != "") { scrq = Convert.ToDateTime(defineScrq); CreateUploadFile(); r

ios开发 将json格式数据上传服务器

看了一些大小牛的资料其实就3步 1.使用post 请求 ,因为get是不能上传的 2.设置请求类型 , 讲你的json数据上传 3.向服务器发送数据按照下面示例代码,就差不多了 1 // 1.创建请求 2 NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/MJServer/order"]; 3 NSMutableURLRequest *request = [NSMutableURLRequest requestW

重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件

原文:重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件 [源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之通信的新特性 下载数据(显示下载进度,将下载数据保存到本地) 上传数据(显示上传进度) 上传文件 示例HTTP 服务端WebServer/HttpDemo.aspx.cs /* * 用于响应 http 请求 */ using System; using System.IO;

7-28 数据上传上线bug

由于是之前的项目,在看到无效的序列的时候,第一反应是之前没有碰到无效的 序列,思路停留在客户端的代码上,按照经理给的思路 我逐渐把问题排除到服务端出现了问题,在今天早上,测了一遍没有出现什么无效的序列,但小问题还是有,各种奇葩问题.昨天真的把我给搞死了,死活想不到什么问题.还有就是client_log_id在上线的项目上没有 加上的是客户端的id而是一个序列值.还需要升级版本的时候,给测试新的修改完毕的项目. 7-28 数据上传上线bug

云上树莓派(2):将传感器数据上传到 AWS IoT 并利用Kibana进行展示

云上树莓派(1):环境准备 云上树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 1. 传感器安装及配置 1.1 DHT22 安装 DHT22 是一款温度与湿度传感器,它有3个针脚,左边的第一个引脚(#1)为3-5V电源,第二个引脚(#2)连接到数据输入引脚,最右边的引脚(#4)接地. 而树莓派3B 一共有40个针脚(GPIO,General Purpose I/O Ports,通用输入/输出端口),只需要将传感器的3个引脚接入板子上的合适引脚即可.我的连接是 1 -