java rxtx_Java使用开源Rxtx实现串口通讯(串口开发) | 学步园

importgnu.io.*;

importjava.io.*;

importjava.util.*;

importcom.call.dao.*;

publicclassSerialReaderextendsObservableimplementsRunnable,SerialPortEventListener

{

staticCommPortIdentifier portId;

intdelayRead =100;

intnumBytes;// buffer中的实际数据字节数

privatestaticbyte[] readBuffer =newbyte[1024];// 4k的buffer空间,缓存串口读入的数据

staticEnumeration portList;

InputStream inputStream;

OutputStream outputStream;

staticSerialPort serialPort;

HashMap serialParams;

Thread readThread;//本来是static类型的

//端口是否打开了

booleanisOpen =false;

// 端口读入数据事件触发后,等待n毫秒后再读取,以便让数据一次性读完

publicstaticfinalString PARAMS_DELAY ="delay read";// 延时等待端口数据准备的时间

publicstaticfinalString PARAMS_TIMEOUT ="timeout";// 超时时间

publicstaticfinalString PARAMS_PORT ="port name";// 端口名称

publicstaticfinalString PARAMS_DATABITS ="data bits";// 数据位

publicstaticfinalString PARAMS_STOPBITS ="stop bits";// 停止位

publicstaticfinalString PARAMS_PARITY ="parity";// 奇偶校验

publicstaticfinalString PARAMS_RATE ="rate";// 波特率

publicbooleanisOpen(){

returnisOpen;

}

/**

* 初始化端口操作的参数.

* @throws SerialPortException

*

* @see

*/

publicSerialReader()

{

isOpen = false;

}

publicvoidopen(HashMap params)

{

serialParams = params;

if(isOpen){

close();

}

try

{

// 参数初始化

inttimeout = Integer.parseInt( serialParams.get( PARAMS_TIMEOUT )

.toString() );

intrate = Integer.parseInt( serialParams.get( PARAMS_RATE )

.toString() );

intdataBits = Integer.parseInt( serialParams.get( PARAMS_DATABITS )

.toString() );

intstopBits = Integer.parseInt( serialParams.get( PARAMS_STOPBITS )

.toString() );

intparity = Integer.parseInt( serialParams.get( PARAMS_PARITY )

.toString() );

delayRead = Integer.parseInt( serialParams.get( PARAMS_DELAY )

.toString() );

String port = serialParams.get( PARAMS_PORT ).toString();

// 打开端口

portId = CommPortIdentifier.getPortIdentifier( port );

serialPort = ( SerialPort ) portId.open( "SerialReader", timeout );

inputStream = serialPort.getInputStream();

serialPort.addEventListener( this);

serialPort.notifyOnDataAvailable( true);

serialPort.setSerialPortParams( rate, dataBits, stopBits, parity );

isOpen = true;

}

catch( PortInUseException e )

{

// 端口"+serialParams.get( PARAMS_PORT ).toString()+"已经被占用";

}

catch( TooManyListenersException e )

{

//"端口"+serialParams.get( PARAMS_PORT ).toString()+"监听者过多";

}

catch( UnsupportedCommOperationException e )

{

//"端口操作命令不支持";

}

catch( NoSuchPortException e )

{

//"端口"+serialParams.get( PARAMS_PORT ).toString()+"不存在";

}

catch( IOException e )

{

//"打开端口"+serialParams.get( PARAMS_PORT ).toString()+"失败";

}

serialParams.clear();

Thread readThread = newThread(this);

readThread.start();

}

publicvoidrun()

{

try

{

Thread.sleep(50);

}

catch( InterruptedException e )

{

}

}

publicvoidstart(){

try{

outputStream = serialPort.getOutputStream();

}

catch(IOException e) {}

try{

readThread = newThread(this);

readThread.start();

}

catch(Exception e) {  }

}  //start() end

publicvoidrun(String message) {

try{

Thread.sleep(4);

}

catch(InterruptedException e) {  }

try{

if(message!=null&&message.length()!=0)

{

System.out.println("run message:"+message);

outputStream.write(message.getBytes());

}

} catch(IOException e) {}

}

publicvoidclose()

{

if(isOpen)

{

try

{

serialPort.notifyOnDataAvailable(false);

serialPort.removeEventListener();

inputStream.close();

serialPort.close();

isOpen = false;

} catch(IOException ex)

{

//"关闭串口失败";

}

}

}

publicvoidserialEvent( SerialPortEvent event )

{

try

{

Thread.sleep( delayRead );

}

catch( InterruptedException e )

{

e.printStackTrace();

}

switch( event.getEventType() )

{

caseSerialPortEvent.BI:// 10

caseSerialPortEvent.OE:// 7

caseSerialPortEvent.FE:// 9

caseSerialPortEvent.PE:// 8

caseSerialPortEvent.CD:// 6

caseSerialPortEvent.CTS:// 3

caseSerialPortEvent.DSR:// 4

caseSerialPortEvent.RI:// 5

caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:// 2

break;

caseSerialPortEvent.DATA_AVAILABLE:// 1

try

{

// 多次读取,将所有数据读入

while(inputStream.available() >0) {

numBytes = inputStream.read(readBuffer);

}

//打印接收到的字节数据的ASCII码

for(inti=0;i

// System.out.println("msg[" + numBytes + "]: [" +readBuffer[i] + "]:"+(char)readBuffer[i]);

}

//                    numBytes = inputStream.read( readBuffer );

changeMessage( readBuffer, numBytes );

}

catch( IOException e )

{

e.printStackTrace();

}

break;

}

}

// 通过observer pattern将收到的数据发送给observer

// 将buffer中的空字节删除后再发送更新消息,通知观察者

publicvoidchangeMessage(byte[] message,intlength )

{

setChanged();

byte[] temp =newbyte[length];

System.arraycopy( message, 0, temp,0, length );

notifyObservers( temp );

}

staticvoidlistPorts()

{

Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

while( portEnum.hasMoreElements() )

{

CommPortIdentifier portIdentifier = ( CommPortIdentifier ) portEnum

.nextElement();

}

}

publicvoidopenSerialPort(String message)

{

HashMap params = newHashMap();

otherDAO odao=newotherDAO();

String port=odao.selectNumberById(15);

String rate = "9600";

String dataBit = ""+SerialPort.DATABITS_8;

String stopBit = ""+SerialPort.STOPBITS_1;

String parity = ""+SerialPort.PARITY_NONE;

intparityInt = SerialPort.PARITY_NONE;

params.put( SerialReader.PARAMS_PORT, port ); // 端口名称

params.put( SerialReader.PARAMS_RATE, rate ); // 波特率

params.put( SerialReader.PARAMS_DATABITS,dataBit  ); // 数据位

params.put( SerialReader.PARAMS_STOPBITS, stopBit ); // 停止位

params.put( SerialReader.PARAMS_PARITY, parityInt ); // 无奇偶校验

params.put( SerialReader.PARAMS_TIMEOUT, 100);// 设备超时时间 1秒

params.put( SerialReader.PARAMS_DELAY, 100);// 端口数据准备时间 1秒

try{

open(params);//打开串口

LoginFrame cf=newLoginFrame();

addObserver(cf);

if(message!=null&&message.length()!=0)

{

String str="";

for(inti=0;i<10;i++)

{

str+=message;

}

start();

run(str);

}

} catch(Exception e) {

}

}

staticString getPortTypeName(intportType )

{

switch( portType )

{

caseCommPortIdentifier.PORT_I2C:

return"I2C";

caseCommPortIdentifier.PORT_PARALLEL:

return"Parallel";

caseCommPortIdentifier.PORT_RAW:

return"Raw";

caseCommPortIdentifier.PORT_RS485:

return"RS485";

caseCommPortIdentifier.PORT_SERIAL:

return"Serial";

default:

return"unknown type";

}

}

publicHashSet getAvailableSerialPorts()//本来static

{

HashSet h = newHashSet();

Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();

while( thePorts.hasMoreElements() )

{

CommPortIdentifier com = ( CommPortIdentifier ) thePorts

.nextElement();

switch( com.getPortType() )

{

caseCommPortIdentifier.PORT_SERIAL:

try

{

CommPort thePort = com.open( "CommUtil",50);

thePort.close();

h.add( com );

}

catch( PortInUseException e )

{

System.out.println( "Port, "+ com.getName()

+ ", is in use.");

}

catch( Exception e )

{

System.out.println( "Failed to open port "

+ com.getName() + e );

}

}

}

returnh;

}

}

//ASCII表

//-------------------------------------------------------------

//                 ASCII Characters

//

//Dec   Hex       Char    Code   Dec   Hex  Char

//

//0     0         NUL            64    40    @

//1     1         SOH            65    41    A

//2     2         STX            66    42    B

//3     3         ETX            67    43    C

//4     4         EOT            68    44    D

//5     5         ENQ            69    45    E

//6     6         ACK            70    46    F

//7     7         BEL            71    47    G

//8     8         BS             72    48    H

//9     9         HT             73    49    I

//10    0A        LF             74    4A    J

//11    0B        VT             75    4B    K

//12    0C        FF             76    4C    L

//13    0D        CR             77    4D    M

//14    0E        SO             78    4E    N

//15    0F        SI             79    4F    O

//16    10        SLE            80    50    P

//17    11        CS1            81    51    Q

//18    12        DC2            82    52    R

//19    13        DC3            83    53    S

//20    14        DC4            84    54    T

//21    15        NAK            85    55    U

//22    16        SYN            86    56    V

//23    17        ETB            87    57    W

//24    18        CAN            88    58    X

//25    19        EM             89    59    Y

//26    1A        SIB            90    5A    Z

//27    1B        ESC            91    5B    [

//                               92    5C     \

//28    1C        FS             93    5D    ]

//29    1D        GS             94    5E    ^

//30    1E        RS             95    5F    _

//31    1F        US             96    60    `

//32    20    (space)            97    61    a

//33    21        !              98    62    b

//34    22        "

//                               99    63    c

//35    23        #              100    64    d

//36    24        $

//37    25        %              101    65    e

//38    26        &              102    66    f

//39    27        '              103    67    g

//40    28        (              104    68    h

//41    29        )              105    69    i

//42    2A        *              106    6A    j

//43    2B        +              107    6B    k

//44    2C        ,              108    6C    l

//45    2D        -              109    6D    m

//46    2E        .              110    6E    n

//47    2F        /              111    6F    o

//48    30        0              112    70    p

//49    31        1              113    72    q

//50    32        2              114    72    r

//51    33        3              115    73    s

//52    34        4              116    74    t

//53    35        5              117    75    u

//54    36        6              118    76    v

//55    37        7              119    77    w

//56    38        8              120    78    x

//57    39        9              121    79    y

//58    3A        :              122    7A    z

//59    3B        ;              123    7B    {

//60    3C        

//61    3D        =              125    7D    }

//62    3E        >              126    7E    ~

//63    3F        ?              127    7F

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值