java串口读取源代码
java串口编程,java串口通信,监听者模式解析
java调用coms端口串口通信的方法。
首先需要下到串口驱动。
javacomm20-win32.zip去sun的主页应该有下的。
在这个驱动中有comm.jar,m.properties,win32com.dll这么3个重要的文件。
1、首先配置驱动,把m.properties,win32com.dll拷贝到你的jdk 中具体位置为C:\Program Files\Java\jdk1.6.0_06\bin然后配置windows系统环境变量,在path中加入C:\ProgramFiles\Java\jdk1.6.0_06\bin;打开你的java工程,配置user library,并导入comm.jar包。
2、现在就可以开始写代码了。
串口读写代码如下CommPortIdentifier portID =CommPortIdentifier.getPortIdentifier(com);//1,先拿到Identifier//其中com是String类型的,传入的是串口名com="COM1";SerialPort port = (SerialPort)portID.open("MyComm", 100000000);//2,打开串口//"MyComm"是串口名,100000000是串口过期时间(ms)。
port.setSerialPortParams(rate, databits,stopbit, parity);//3,设置串口属性//rate 波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验)port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);//4(可选)设置数据流控制模式,默认为无port.close();//关闭串口3、串口读入写出流。
java源码阅读技巧
java源码阅读技巧
阅读Java源码是每个Java程序员都应该具备的重要技能,以
下是一些阅读Java源码的技巧:
1. 理清目的,在阅读Java源码之前,首先要明确自己的阅读
目的是什么,是为了理解某个特定功能的实现,还是为了学习优秀
的编程实践和设计模式。
2. 选择合适的版本,Java的版本更新很快,不同版本的源码
可能会有一些差异,因此要根据自己的需要选择合适的版本进行阅读。
3. 从入口开始,通常情况下,阅读Java源码应该从入口开始,比如某个类或者某个方法,然后根据需要逐步深入。
4. 注重关键类和方法,Java源码非常庞大,不可能一下子全
部理解,因此要有选择地关注一些关键的类和方法,比如常用的集
合类、IO类等。
5. 结合文档,阅读Java源码时,要结合官方文档,了解每个
类和方法的作用和用法,这样能更好地理解源码的含义。
6. 调试和实践,阅读Java源码不仅仅是 passively reading,更重要的是要结合自己的实际项目进行调试和实践,这样能更深入
地理解源码的运行逻辑和细节。
7. 查阅其他资料,有时候Java源码本身并不能完全解答你的
疑惑,这时候可以查阅一些权威的书籍或者网络资料,加深自己的
理解。
总的来说,阅读Java源码需要耐心和细心,要有一颗渴望探索
的心态,同时要善于总结和归纳,不断地积累经验和知识。
希望以
上技巧对你有所帮助。
经典的串口调试工具源代码(一)
经典的串口调试助手源代码(一)Dim OutputAscii As BooleanDim InputString As StringDim OutputString As String'=====================================================================================' 变量定义'=====================================================================================Option Explicit ' 强制显式声明Dim ComSwitch As Boolean ' 串口开关状态判断Dim FileData As String ' 要发送的文件暂存Dim SendCount As Long ' 发送数据字节计数器Dim ReceiveCount As Long ' 接收数据字节计数器Dim InputSignal As String ' 接收缓冲暂存Dim OutputSignal As String ' 发送数据暂存Dim DisplaySwitch As Boolean ' 显示开关Dim ModeSend As Boolean ' 发送方式判断Dim Savetime As Single ' 时间数据暂存延时用Dim SaveTextPath As String ' 保存文本路径' 网页超链接申明Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory AsString, ByVal nShowCmd As Long) As LongPrivate Sub CloseCom() '关闭串口On Error GoTo ErrIf MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示mnuconnect.Caption = "断开串口"cmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchoff.Visible = TrueImgSwitchon.Visible = FalseErr:End SubPrivate Sub UpdateStatus()If MSComm.PortOpen ThenStatusBar1.Panels(1).Text = "Connected"mnuautosend.Caption = "自动发送"mnuconnect.Caption = "断开串口"ElseStatusBar1.Panels(1).Text = "断开串口"mnuautosend.Caption = "disautosend"mnuconnect.Caption = "打开串口"End IfStatusBar1.Panels(2).Text = "COM" & mPortStatusBar1.Panels(3).Text = MSComm.SettingsIf (OutputAscii) ThenStatusBar1.Panels(4) = "ASCII"ElseStatusBar1.Panels(4) = "HEX"End If'On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送If MSComm.PortOpen = True Then ' 串口状态判断mnuautosend.Caption = "Dis&autosend"TmrAutoSend.Interval = Val(TxtAutoSendTime) ' 设置自动发送时间TmrAutoSend.Enabled = True ' 打开自动发送定时器Elsemnuautosend.Caption = "autosend"ChkAutoSend.Value = 0 ' 串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ' 如果无效,不发送mnuautosend.Caption = "autosend"TmrAutoSend.Enabled = False ' 关闭自动发送定时器End IfErr:End SubPrivate Sub CmdSendFile_Click() '发送文件On Error GoTo ErrIf MSComm.PortOpen = True Then ' 如果串口打开了,则可以发送数据If FileData = "" Then ' 判断发送数据是否为空MsgBox "发送的文件为空", 16, "串口调试助手" ' 发送数据为空则提示ElseIf ChkHexReceive.Value = 1 Then ' 如果按十六进制接收时,按二进制发送,否则按文本发送MSComm.InputMode = comInputModeBinary ' 二进制发送ElseMSComm.InputMode = comInputModeText ' 文本发送End IfMSComm.Output = Trim(FileData) ' 发送数据ModeSend = True ' 设置文本发送方式End IfElseMsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfErr:End SubPrivate Sub Comm_initial(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer,StopBit As Integer)On Error GoTo ErrorTrap ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭mPort = Port ' 设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.InBufferSize = 1024 ' 设置接收缓冲区为1024字节MSComm.OutBufferSize = 4096 ' 设置发送缓冲区为4096字节MSComm.InBufferCount = 0 ' 清空输入缓冲区MSComm.OutBufferCount = 0 ' 清空输出缓冲区MSComm.SThreshold = 1 ' 发送缓冲区空触发发送事件MSComm.RThreshold = 1 ' 每X个字符到接收缓冲区引起触发接收事件MSComm.OutBufferCount = 0 ' 清空发送缓冲区MSComm.InBufferCount = 0 ' 滑空接收缓冲MSComm.PortOpen = True ' 打开串口If MSComm.PortOpen = True Thentxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," & Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsetxtstatus.Text = "STATUS:COM Port Cloced" ' 串口没打开时,提示串口关闭状态End IfExit SubErrorTrap: ' 错误处理Select Case Err.NumberCase comPortAlreadyOpen ' 如果串口已经打开,则提示MsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComCase ElseMsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComEnd SelectErr.ClearEnd SubPrivate Sub Comm_reSet(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer,StopBit As Integer)On Error GoTo ErrorHint ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭mPort = Port ' 设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.PortOpen = True ' 打开串口If MSComm.PortOpen = True Thencmdswitch.Caption = "关闭串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\kai.jpg") ' 显示串口已经打开的图标ImgSwitchoff.Visible = Falsemnuconnect.Caption = "disconnect"ImgSwitchon.Visible = Truetxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," & Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsecmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchon.Visible = FalseImgSwitchoff.Visible = Truetxtstatus.Text = "STATUS:COM Port Cloced"End IfExit SubErrorHint: ' 错误处理Select Case Err.NumberCase comPortAlreadyOpen ' 如果串口已经打开,则提示MsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ' 调用关闭串口函数Case ElseMsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ' 调用关闭串口函数End SelectErr.Clear ' 清除Err 对象的属性End SubPrivate Sub Command1_Click()End SubPrivate Sub cbobaudrate_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1),cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbocom_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbodatabit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cboparitybit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbostopbit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub chkautosend_Click()On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ' 如果有效则,自动发送If MSComm.PortOpen = True Then ' 串口状态判断mnuautosend.Caption = "取消自动发送"TmrAutoSend.Interval = Val(TxtAutoSendTime) ' 设置自动发送时间TmrAutoSend.Enabled = True ' 打开自动发送定时器ElseChkAutoSend.Value = 0 ' 串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ' 如果无效,不发送mnuautosend.Caption = "自动发送数据"TmrAutoSend.Enabled = False ' 关闭自动发送定时器End IfErr:End SubPrivate Sub cmdamend_Click()Dim spShell As Object ' 定义存放引用对象的变量Dim spFolder As Object ' 定义存放引用对象的变量Dim spFolderItem As Object ' 定义存放引用对象的变量Dim spPath As String ' 定义存放的变量On Error GoTo Err ' 错误处理,防止取消打开文件夹时报错Const WINDOW_HANDLE = 0Const NO_OPTIONS = 0Set spShell = CreateObject("Shell.Application")Set spFolder = spShell.BrowseForFolder(WINDOW_HANDLE, "选择目录:", NO_OPTIONS,"C:\Scripts")Set spFolderItem = spFolder.SelfspPath = spFolderItem.PathspPath = Replace(spPath, "\", "\") ' Replace函数的返回值是一个字符串txtsavepath.Text = spPath ' 把文件夹路径显示在标签上SaveTextPath = txtsavepath.Text ' 路径暂存Err:End SubPrivate Sub CmdClearCounter_Click()On Error GoTo ErrSendCount = 0 ' 发送计数器清零ReceiveCount = 0 ' 接收计数器清零txtRXcount.Text = "RX:" & 0 ' 接收计数txtTXcount.Text = "TX:" & 0 ' 发送计数Err:End SubPrivate Sub cmdclearrecieve_Click()TxtReceive.Text = ""End SubPrivate Sub cmdclearsend_Click()txtsend.Text = ""End SubPrivate Sub CmdHelp_Click()FrmHelp.ShowEnd SubPrivate Sub CmdQuit_Click()If MSComm.PortOpen = True Then MSComm.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭Unload Me ' 卸载窗体,并退出程序EndEnd SubPrivate Sub cmdsavedisp_Click()On Error GoTo Err ' 错误处理SaveTextPath = txtsavepath ' 路径暂存Open txtsavepath & "\1.txt" For Output As #1 ' 打开文件' 不存在的话会创建文件,如已存在会覆盖' output 改为append 为追加' 改为input 则只读Print #1, Year(Date) & "年" & Month(Date) & "月" & Day(Date) & _"日" & Hour(Time) & "时" & Minute(Time) & "分" & Second(Time) & _"秒" & vbCrLf & TxtReceive.Text + vbCrLf ' 把接收区的文本保存文本前加上保存时间(0000年00月00日00时00分00秒)' vbcrlf 为回车换行Close #1 ' 关闭文件txtsavepath = "OK,1.txt Save" ' 提示保存成功cmdsavedisp.Enabled = FalseSavetime = Timer ' 记下开始的时间While Timer < Savetime + 5 ' 循环等待5 - 要延时的时间DoEvents ' 转让控制权,以便让操作系统处理其它的事件。
一个Java读取串口值的类
一个Java读取串口值的类这是一个通过JAVA的扩展包(m)从串口读取值的类,本类库(m)主要包括:SerialBean.java (与其他应用程序的接口),SerialBuffer.java (用来保存从串口所接收数据的缓冲区),ReadSerial.java (从串口读取数据的程序)。
整个类的设计思路大概就是:实现一个线程一直在监听串口中是否有数据传送过来,如果有的话开始拍照,并取得照片后,直接打印出来。
因为涉及到商业秘密,所以拍照函数和取得照片函数采用的是空函数,请见谅!若要运行此函数必须下载该扩展包,并加载到你的CLASSPATH下。
当然,你若要测试并运行此类的话。
可能要花费不少的精力。
如果你只有一台机器,你可以利用一条RS-232电缆将COM1和COM2连接起来,在COM1上运行SerialExample,在COM2上运行Windows提供的超级终端程序。
如果你有两台机器的话,你可以利用一条RS-232电缆将两台机器的COM1(或者是COM2)连接起来,在一端运行例程,另外一端运行Windows提供的超级终端程序。
该类有相当详细的注释。
我想应该不难理解吧!import java.io.*;import java.awt.*;import java.awt.print.*;import javax.print.*;import m.*; //这是一个Java扩展类库,并不包括在标准的Java SDK当中。
//如果你尚未安装这个扩展类那么你需要到sun公司的Java站点下载这个类库class SuanKou implements Runnable{private java.io.FileOutputStream fos=null;private Thread th=null;private long shiJian=500;//设置间隔的时间//private int duanKou=1;//设置端口号private String Msg = null;private SerialBean SB=null;private int isSucces=-1;//构造函数public SuanKou(long sj,int dk) {System.out.println("构造函数");try{fos=new java.io.FileOutputStream("c:\\log.txt");this.shiJian=sj;//设定监听端口的时间//this.duanKou=dk;//端口号SB = new SerialBean(dk);//创建一个接口对象,参数为端口号isSucces = SB.Initialize();//初使化所指定的串口并返回初始化结果。
java pipedinputstream 读取方法
java pipedinputstream 读取方法Java中的PipedInputStream类是用于从管道中读取数据的输入流。
它通常与PipedOutputStream一起使用,以实现线程之间的通信。
以下是使用PipedInputStream进行读取的示例代码:javaimport java.io.*;public class PipedInputStreamExample {public static void main(String[] args) throws IOException {// 创建管道输出流PipedOutputStream outputStream = new PipedOutputStream();// 创建管道输入流,并将其连接到管道输出流PipedInputStream inputStream = new PipedInputStream(outputStream);// 启动一个线程来写入数据到管道输出流new Thread(() -> {try {outputStream.write("Hello,world!".getBytes());outputStream.close();} catch (IOException e) {e.printStackTrace();}}).start();// 在主线程中从管道输入流读取数据byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {String data = new String(buffer, 0, bytesRead);System.out.println("Received: " + data);}// 关闭管道输入流inputStream.close();}}在上面的示例中,我们首先创建了一个管道输出流(PipedOutputStream),然后创建了一个管道输入流(PipedInputStream),并将其连接到管道输出流。
java 串口通信案例
java 串口通信案例Java串口通信是指使用Java编程语言实现与串口设备之间的数据通信。
串口通信在很多应用场景中都有广泛的应用,比如物联网、工业自动化、智能家居等领域。
本文将列举十个以Java串口通信为题的案例,介绍其实现方法和应用场景。
1. 串口读取数据通过Java编程语言实现串口读取数据的功能,可以使用Java的串口通信库,如RXTX、JavaComm等。
首先需要打开串口,并设置串口参数,然后通过监听串口数据的方式实时读取串口传入的数据。
这个案例适用于需要实时监控串口设备数据的应用场景,比如环境监测。
2. 串口发送数据通过Java编程语言实现串口发送数据的功能,可以使用Java的串口通信库。
首先需要打开串口,并设置串口参数,然后通过写入数据的方式将数据发送到串口设备。
这个案例适用于需要向串口设备发送指令或数据的应用场景,比如控制外部设备。
3. 串口数据解析通过Java编程语言实现串口数据解析的功能,可以将从串口读取的原始数据进行解析,提取出有用的信息。
可以根据数据格式进行解析,比如按照特定的协议解析数据。
这个案例适用于需要对串口设备传输的数据进行处理和分析的应用场景。
4. 串口数据存储通过Java编程语言实现串口数据存储的功能,可以将从串口读取的数据保存到本地文件或数据库中。
可以根据需求选择适当的存储方式,比如文本文件、二进制文件或数据库。
这个案例适用于需要对串口设备传输的数据进行长期存储和分析的应用场景。
5. 串口数据转发通过Java编程语言实现串口数据转发的功能,可以将从一个串口读取的数据转发到另一个串口。
可以实现串口设备之间的数据交互,比如串口设备之间的数据通信或设备之间的数据同步。
这个案例适用于需要多个串口设备之间进行数据交互的应用场景。
6. 串口数据监控通过Java编程语言实现串口数据监控的功能,可以监控串口设备的状态和传输数据。
可以实时显示串口设备的连接状态、波特率、数据位、停止位等信息,并实时显示串口传输的数据。
Java中进行串口通信时的环境配置和基本操作代码
java读写串口要用到的是javax扩展类库javacomm,它是一系列的标准,该类库在sun的官网上只提供linux版本。
由于我所应用的平台是win32,所以找了个win32的实现。
在此过程中遇到了一系列的问题,后来终于解决问题并完成了通过读写串口进行通信的功能。
在此对其java读写串口的情况做个简要说明:首先下载javacomm包,然后将其解压,解压后需要做的就是配置串口通信相关东西,下面是自己使用的时候的配置:1.把m.properties文件拷贝到Java运行时环境的lib目录中,即:C:\Program Files\Java\jdk1.5.0_12\lib\m.propertiesC:\Program Files\Java\jdk1.5.0_12\jre\lib\m.properties2.把win32com.dll拷贝到C:\windows\system32\ 和 C:\ProgramFiles\Java\jdk1.5.0_12\jre\bin\下3.把comm.jar放到Java运行时环境的lib目录中,即C:\ProgramFiles\Java\jdk1.5.0_12\lib\comm.jar4.在"环境变量"的CLASSPATH中添加comm.jar,如:%JAVA_HOME%\lib\comm.jar;然后通过COM的API来实现串口的读写,其实API相当简单,如下代码:Java代码CommPortIdentifier serialPortId =CommPortIdentifier.getPortIdentifier(“COM2”);SerialPort port = (SerialPort) serialPortI d.open(“Read”, 30);//打开COM2串口,其中30参数是用来设置打开串口的超时时间。
port.setSerialPortParams(1200, 8, 1, 0);//设置COM2的波特率,数据位,停止位,校验方式等//从串口中得到输入输出流了OutputStream out = port.getOutputStream();out .write(buffer);out .flush();InputStream in = port.getInputStream();in.read(data);//data是一个byte[]CommPortIdentifier serialPortId =CommPortIdentifier.getPortIdentifier(“COM2”); SerialPort port = (SerialPort) serialPortId.open(“Read”, 30);//打开COM2串口,其中30参数是用来设置打开串口的超时时间。
java读取硬件串口——数据断行问题
java读取硬件串口——数据断行问题如题,因为项目上的需要,让我使用Java读取硬件外设的串口数据并进行处理。
之前也有C语言的基础,使用过串口读写程序,觉得挺简单的,,没放在心上。
毕竟串口这也算是各种语言里面最基础的应用了吧,大的使用步骤都差不多。
结果,出现的各种问题真是让我欲仙欲死啊。
现在把问题的解决方法写一下。
先说一下项目上的要求吧。
我们这个项目需要高精度的GPS(全球定位系统)的定位数据和时间,需要最少5HZ的数据发送频率。
也就是说串口最少每200ms发送一次数据,数据的格式请参阅GPS模块编程之NMEA0183协议。
首先,在解决问题的过程中,参考了一些前辈的经验,感谢前辈们的贡献!本文主要讲解遇到的串口读取数据异常的问题,关于串口的一般讲解和一般方法请参考下面几位前辈的博客:1.Java串口编程:串口数据的发送与监听读取2.Java串口通信详解3.java基于RXTXcomm.jar的串口通信一、Java读取串口的方式目前比较常见的针对Java的串口包有3个来源:一是1998年SUN发布的串口通信API:comm2.0.jar(Windows环境下)和comm3.0.jar(Linux/Solaris环境下);二是IBM的串口通信API;三是一些开源的API。
SUN公司发布的官方串口包已经停止更新,而且目前只支持32位操作系统。
所以只能使用rxtx开发包。
我的开发环境是:•windows7-64bit•java version '1.8.0_151';•mfz-rxtx-2.2-20081207-win-x64.zip注意:1.Windows_64bit可以使用32bit的JDK,但是32位系统不能使用64位JDK。
最好就是操作系统、JDK、JAR包的位数全都保持一致。
2.rxtx下载注意所下载的jar包的位数,不同位数的jar包不能使用。
3.环境配置请参考几位前辈的博客。
java读串口数据
{
c = in.read();
ComBuffer.PutChar(c);
}
} catch (IOException e) {}
ComBuffer.PutChar(c);
}
try
{
FileReader in = new FileReader(ComPort);
try
{
FileReader in = new FileReader(ComPort);
while (true)
{
c = in.read();
}
}
/*
*
* SerialBuffer.java 1.0
* Class that implements the serial buffer
*
* Created: March 27, 2001
*
* Author : Qingye Jiang (John)
* American GNC Corporation
{
try
{
wait();
} catch (InterruptedException e) { }
}
SepMark = Content.indexOf('*');
ReadSerial r1 = new ReadSerial(SB, ComPort);
ReadBuffer r2 = new ReadBuffer(SB);
WriteSerial r3 = new WriteSerial(ComPort);
r1.start();
* qjiang@
java读取串口信息
java读取串口信息(一)最近在写一个串口程序,业务用要求要用java web从串口中读取数据,并显示在文本框中。
具体串口中的信息是从一个能扫描条形码(Barcode)的手持设备上获取的,手持设备怎么扫描,怎么将信息写入串口我不用关心,我要做的就是从串口中讲信息读取出来。
经过这几天研究,以及参考各种资料,有些小小的收获,分享给大家。
第一个问题:我笔记本的串口在哪里?说到串口,也许很多人都要怀疑,这都什么年代了,USB设备已经如此普及了,谁还能想起这个老掉牙的通信端口呀?其实,在现实生活中,串口正因为它老,才会在实际使用中经常用到它。
举个简单的例子:工业制造及其设备与计算机之间的通讯、还有在各种电子工厂测试设备的过程中,都无一例外使用的串口。
因为它可以不用像USB设备一样必须有软件驱动的支持才可以进行工作。
现如今,台式电脑基本都还保留着一个串口甚至是两个串口,但是笔记本电脑上的串口,被越来越多的制造商所抛弃。
有很多从事工控、测试等行业的工作人员,选购笔记本的时候,串口成了他们心中的永远的痛。
看似一个简单的接口,对于他们来说是很重要的。
关于什么是串口,串口的分类,以及串口长的什么样子,大家可以去网上搜一下,上一段的主要信息就是要说明:我们现在的笔记本上没有串口 - -!。
第二个问题:没有串口,那我们怎么测试编写串口程序?如今的市面上提供一种usb转串口的工具,具体可以在百度搜索usb转串口,我是去向隔壁部门借的,据说十几块钱一个,当然得需要两个,我们一般测试使用这种九针的就可以了,有了这个东西,那就开始动手吧!如图:我的和这个不一样,我的还带一根延长线。
1、插上u转串设备,安装u转串口的驱动,这时右击我的电脑,选择设备管理器,如果安装成功,就会出现“端口”选项,我的是win7,xp的没做测试。
如图:2、问题又来了,两个串口笔记本是能识别了,但是这两个串口怎么连接起来呢?对此可以去电脑耗材店买一种叫做“串口交叉线”的线,这种线能将两个usb 转换出来的两个串口连接起来(两个usb转成的串口都是带针的口,也就是所谓的公口),这种“串口交叉线”的两头都是母口,所以正好能连接起来。
串口读取数据的方法
串口读取数据的方法1.打开串口:首先需要打开串口,通过设备文件或串口号来指定要打开的串口。
```c++#include <stdio.h>#include <fcntl.h>#include <termios.h>int openSerialPort(const char* portName)int fd = open(portName, O_RDWR , O_NOCTTY);if (fd < 0)printf("Failed to open serial port\n");return -1;}//配置串口参数struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, B9600);cfsetospeed(&options, B9600);options.c_cflag ,= (CLOCAL , CREAD);tcsetattr(fd, TCSANOW, &options);return fd;}```2.读取串口数据:打开串口之后,可以通过读取文件描述符来读取串口数据。
```c++int readSerialData(int fd, unsigned char* buffer, int bufferSize)int bytesRead = read(fd, buffer, bufferSize);if (bytesRead < 0)printf("Failed to read serial data\n");}return bytesRead;}```3.解析串口数据:读取到的数据可能是原始的字节流,需要根据具体的协议和数据格式进行解析。
```c++void parseData(unsigned char* buffer, int bufferSize)//解析数据的逻辑}```4.循环读取数据:可以使用循环来不断读取串口数据,并进行解析和处理。
java jssc串口例子
java jssc串口例子Java JSSC(Java Simple Serial Connector)是一个用于串口通信的Java 库。
下面是一个简单的Java JSSC串口通信示例:```javaimport ;import ;import ;import ;public class SerialPortExample implements SerialPortEventListener { private SerialPort serialPort;public SerialPortExample(String portName) {serialPort = new SerialPort(portName);try {();(_9600, _8, _1, _NONE);(this);} catch (SerialPortException e) {();}}public void serialEvent(SerialPortEvent event) { if (()) {try {int available = ();if (available > 0) {byte[] bytes = new byte[available];(bytes, );("Received data: " + new String(bytes)); }} catch (SerialPortException e) {();}}}public static void main(String[] args) {String portName = "COM1"; // 串口名称,根据实际情况修改new SerialPortExample(portName);}}```该示例程序使用JSSC库打开一个串口,并设置串口参数(波特率、数据位、停止位和校验位)。
然后,它添加了一个`SerialPortEventListener`,以便在接收到数据时执行相应的操作。
使用com0com0模拟串口通信,以及java的串口读写操作
使⽤com0com0模拟串⼝通信,以及java的串⼝读写操作⾸先放⼀下我这次使⽤的⼯具com0com0是windows内核模式下的虚拟串⼝驱动程序。
可以创建虚拟串⼝对来连接两个COM端⼝在这⾥简单的介绍⼀下com0com0的使⽤⽅法⾸先,下载com0com-3.0.0.0-i386-and-x64-unsigned,解压缩并安装接下来我们就可以使⽤setup command prompt来进⾏模拟串⼝对了在这⾥⾸先介绍两个命令install PortName=串⼝名1 PortName=串⼝名2新建两个虚拟串⼝,并连接为串⼝对list列出⽬前所有的虚拟串⼝如果跳出更新驱动的提⽰可以暂时⽆视,不影响后续的操作。
另⼀个⼯具setup具有图形化界⾯,可以查看⽬前的串⼝对接下来介绍java编程的时候需要⽤到的两个jar包RXTXcomm.jarserialPortIO.jar同时,在使⽤这两个jar包进⾏java编程之前,我们要将mfz-rxtx-2.2-20081207-win-x64压缩包下的两个dll⽂件放到C:\Windows\System32下然后,这⾥是⼀个简单的串⼝读写的例⼦import gnu.io.SerialPort;import serialPort.SerialTool;public class Read {public static void main(String[] args) throws Exception{// TODO Auto-generated method stub//以波特率115200打开串⼝COM12SerialPort serialPort = SerialTool.openPort("COM12", 115200);SerialTool.addListener(serialPort, new SerialListener(serialPort));}}import java.util.Scanner;import gnu.io.SerialPort;import serialPort.SerialTool;public class Write {public static void main(String[] args) throws Exception {Scanner scan = new Scanner(System.in);String temp;//以波特率115200打开串⼝COM11SerialPort serialPort = SerialTool.openPort("COM11", 115200);while(scan.hasNext()){temp=scan.nextLine();SerialTool.sendToPort(serialPort, temp.getBytes());}}}import javax.swing.JOptionPane;import gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import serialPort.SerialTool;public class SerialListener implements SerialPortEventListener {public SerialPort serialPort;public SerialListener(SerialPort serialPort){this.serialPort=serialPort;}public void serialEvent(SerialPortEvent serialPortEvent) {switch (serialPortEvent.getEventType()) {case SerialPortEvent.BI: // 10 通讯中断System.out.println("与串⼝设备通讯中断");break;case SerialPortEvent.OE: // 7 溢位(溢出)错误case SerialPortEvent.FE: // 9 帧错误case SerialPortEvent.PE: // 8 奇偶校验错误case SerialPortEvent.CD: // 6 载波检测case SerialPortEvent.CTS: // 3 清除待发送数据case SerialPortEvent.DSR: // 4 待发送数据准备好了case SerialPortEvent.RI: // 5 振铃指⽰case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空break;case SerialPortEvent.DATA_AVAILABLE: // 1 串⼝存在可⽤数据//System.out.println("found data");byte[] data = null;try {if (serialPort == null) {System.out.println("串⼝对象为空!监听失败");}else {data = SerialTool.readFromPort(serialPort); //读取数据,存⼊字节数组//System.out.println(new String(data));JOptionPane.showInputDialog(new String(data));//String dataOriginal = new String(data); //将字节数组数据转换位为保存了原始数据的字符串 }} catch (Exception e) {System.exit(0);}break;}}}。
java获取系统默认编码的方法
java获取系统默认编码的方法Java提供了多种方法来获取系统的默认编码。
以下是几种常用的方法:1. 使用System类的getProperty()方法:```String defaultEncoding = System.getProperty("file.encoding");```这种方法适用于获取系统默认编码。
它将返回一个字符串,表示当前系统的默认编码。
2. 使用Charset类的defaultCharset()方法:```Charset defaultEncoding = Charset.defaultCharset();```这种方法将返回一个Charset对象,表示当前系统的默认编码。
3. 使用ResourceBundle类:```ResourceBundle bundle =ResourceBundle.getBundle("com.sun.swing.internal.plaf.metal.resources.metal");String defaultEncoding = bundle.getString("charset.default");```这种方法适用于获取系统默认编码的特定值。
在这个例子中,我们使用了一个内部资源包来获取默认编码。
4. 使用java.nio.charset包:```String defaultEncoding = Charset.defaultCharset().name();```这种方法将返回一个字符串,表示当前系统的默认编码。
无论使用哪种方法,获取到的默认编码都可以用于处理文件读写、字符编码转换等操作。
记得在编写Java程序时,根据具体需求选择适合的编码方式,以确保数据的正确性和一致性。
详细解读Java的串口编程
详细解读Java的串⼝编程常见问题JavaComm 和 RxTX 安装时有⼀些与众不同的地⽅。
强烈建议按照安装说明⼀点点的安装。
如果安装说明要求⼀个jar⽂件或⼀个共享库必须在某⼀特定的⽂件夹下,那这就意味着需要严肃对待。
如果说明要求⼀个特定的⽂件或设备需要拥有⼀个特定的所有权或访问权,这也意味着需要严肃处理。
很多安装问题都只是因为没有按照安装说明要求的去做⽽引起的。
特别要注意的是⼀些版本的JavaComm会带有两个安装说明。
⼀个⽤于java 1.2及以后的版本,⼀个⽤于java 1.1版本。
使⽤错误的安装说明会导致不能⼯作的安装结果。
另⼀⽅⾯,TxTx的⼀些版本/构件/包会包含不完全的说明。
在这种情况下需要获得相关的RxTx发布的源码,它包含了完整的安装说明。
另外要注意Windows的Jdk安装程序会包含三个java虚拟机,因此会有三个扩展⽂件夹。
1. ⼀个作为JDK的组成部分。
2. ⼀个作为与运⾏JDK⼯具的JDK⼀起的私有JRE的⼀部分。
3. ⼀个作为与运⾏应⽤程序的JDK⼀起的公共JRE的⼀部分。
更有甚者甚⾄会有第4个jre,它存在于\Windows的⽬录结构中。
JavaComm应该作为扩展被安装到JDK和所有公共JRE中。
WebstartJavaComm关于JavaComm和RxTx的⼀个常见问题是它们不⽀持通过Java WebStart进⾏安装:JavaComm的臭名昭著是因为需要将⼀个称为m.properties的⽂件放到JDK lib⽬录下,⽽这是不能通过Java WebStart完成的。
很令⼈沮丧的是,对于该⽂件的需要是JavaComm中⼀些不必要的设计/决定所导致的恶果,⽽JavaComm的设计者们可以很容易地避免这种事情。
Sun固执地拒绝修正这个错误,他们强调这个机制是必不可少的。
他们是在睁着眼说瞎话,特别是当提及JavaComm时,因为Java在很长⼀段时间内拥有⼀个专门⽤于此类意图的服务提供者架构。
使用Java实现简单串口通信
使⽤Java实现简单串⼝通信没想到挺多⼈需要这个的,很⾼兴这篇⽂章能对⼤家有帮助,主要的⼯具类博⽂⾥已经有了,当然,要⼩⼯具源码的留⾔邮箱即可。
2019.09.05最近接触到了串⼝及其读写,在此记录java进⾏串⼝读写的过程。
1.导⼊⽀持java串⼝通信的jar包:在maven项⽬的pom.xml中添加RXTXcomm的依赖或者下载RXTXcomm.jar并导⼊到项⽬中。
⽀持Java串⼝通信操作的jar包,m⽐较⽼,⽽且不⽀持64位系统,推荐使⽤Rxtx这个jar包(32位/64位均⽀持)。
下载地址:注意:运⾏过程中抛出ng.UnsatisfiedLinkError错误或gnu.io下的类找不到时,将rxtx解压包中的rxtxParallel.dll,rxtxSerial.dll 这两个⽂件复制到C:\Windows\System32 ⽬录下可解决该错误。
2.编写代码操作串⼝:串⼝必要参数类:包含连接串⼝所必须的参数,⽅便在调⽤串⼝时设置和传递串⼝参数/*** 串⼝必要参数接收类* @author: LinWenLi* @date: 2018年7⽉21⽇下午4:30:40*/public class ParamConfig {private String serialNumber;// 串⼝号private int baudRate; // 波特率private int checkoutBit; // 校验位private int dataBit; // 数据位private int stopBit; // 停⽌位public ParamConfig() {}/*** 构造⽅法* @param serialNumber 串⼝号* @param baudRate 波特率* @param checkoutBit 校验位* @param dataBit 数据位* @param stopBit 停⽌位*/public ParamConfig(String serialNumber, int baudRate, int checkoutBit, int dataBit, int stopBit) {this.serialNumber = serialNumber;this.baudRate = baudRate;this.checkoutBit = checkoutBit;this.dataBit = dataBit;this.stopBit = stopBit;}getter()...setter()...}串⼝操作类:(其中包含的CustomException是⾃定义异常类,仅⽤于抛出异常原因。
java数据爬取项目源代码 -回复
java数据爬取项目源代码-回复JAVA数据爬取项目源代码是一种常用的技术手段,可以帮助我们从互联网上获取所需的数据。
在本文中,我们将深入探讨JAVA数据爬取项目源代码的实现细节,并逐步回答与该技术相关的问题。
1. 什么是数据爬取技术?数据爬取技术是一种通过自动化程序从互联网上获取所需的数据的技术手段。
通过模拟人工访问网页,分析网页结构,提取有用信息并将其保存至本地,我们可以实现数据的自动收集和处理。
2. 为什么要使用JAVA进行数据爬取?JAVA作为一种常用的编程语言,拥有强大的网络编程和数据处理能力。
它提供了丰富的类库和框架,能够方便地实现数据爬取功能。
此外,JAVA 的多线程和并发能力也可以提高数据爬取的效率。
3. 数据爬取的基本原理是什么?数据爬取的基本原理可以概括为以下几个步骤:- 发起HTTP请求:使用JAVA的网络编程库,我们可以模拟浏览器发送HTTP请求,获取网页内容。
- 解析HTML:获取到网页内容后,我们需要解析HTML,提取出我们所需的字段和数据。
JAVA提供了多种HTML解析库,如Jsoup和HtmlUnit 等。
- 数据处理:解析完HTML后,我们可以对获取到的数据进行处理,如清洗、过滤、格式化等。
- 数据存储:将处理后的数据保存至本地或数据库,供后续使用。
4. 如何实现数据爬取?下面是一段基本的JAVA数据爬取代码,用于获取一个网页的内容并输出到控制台:javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .URL;import .URLConnection;public class WebCrawler {public static void main(String[] args) {String urlStr = "try {URL url = new URL(urlStr);URLConnection conn = url.openConnection();BufferedReader reader = new BufferedReader(newInputStreamReader(conn.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();} catch (IOException e) {e.printStackTrace();}}}在上述代码中,我们首先指定一个网页的URL,然后通过URL类和URLConnection类建立与该URL的连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
portId=(CommPortIdentifier)portList.nextElement(); //获取系统中所有的通信端口
if(portId.getPortType()==CommPortIdentifier.PORT_PARALLEL) //用循环找出所需的端口
TextArea in_message=new TextArea();
TextField out_message=new TextField("上面的文本框显示接收到得数据");
R_Frame() //设置窗口和布局
{ super("串口接收数据");
{
R_Frame R_win =new R_Frame();
R_win.addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{System.exit(0);}
}
class R_Frame extends Frame implements Runnable,ActionListener,SerialPortEventListener
{ static CommPortIdentifier portId;//检测系统中可用的通信端口
static Enumeration portList;//Enumeration为枚举型类,在java。util中
catch (UnsupportedCommOperationException e){}
byte[] readBuffer=new byte[20];
try
{
inputStream=serialPort.getInputStream();
}
catch(IOE段文字,下面是代码内容。
packaget.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import m.*;
}
}
readThread=new Thread(this);
readThread.start(); //线程负责接收数据
}
public void run()
{
try{
Thread.sleep(2000);//接收数据后休眠20秒钟
{
if(portId.getName().equals("COM4"))
{
try
{
serialPort=(SerialPort)portId.open("ReadComm", 2000);
out_message.setText("已经打开串口,正在接收数据。。。。。");
setSize(200,200);
setVisible(true);
btnOpen.addActionListener(this);
add(out_message,"South");
add(in_message,"Center");
add(btnOpen,"North");
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}//串口通信参数设置 波特率‘数据位。停止位。奇偶检验
);
R_win.pack();
}
}
InputStream inputStream;
SerialPort serialPort; //声明RS——232串口的成员变量
Thread readThread;
String str="";
Button btnOpen=new Button("打开串口");
}
//打开串口并监听串口
public void actionPerformed(ActionEvent event)
{
portList=CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements())
try{
while(inputStream.available()>0)
{
int numBytes=inputStream.read(readBuffer); //从串口上读取数据上的流
}
str=new String(readBuffer);
}
catch (InterruptedException e){}
}
//串口监听器触发事件,设置串口通信参数 读取数据并写到文本区中
public void serialEvent(SerialPortEvent event )
{
try
{
in_message.append(str+"\n");
//接收到得数据放在文本区
}
catch(IOException e){}
}
}
public class commm {
public static void main (String args[])
}
catch(PortInUseException e){
}
try{serialPort.addEventListener(this); //设置串口监听器
}
catch(TooManyListenersException e){}
serialPort.notifyOnDataAvailable(true);//检测到串口 触发事件
}