以前经常用C语言操作串口,实现一些发送接收之类的小功能,最近项目中也用到了串口通信,不过语言变成了Java,这个搞起来略蛋疼。

Java说起来就是各种库各种引用,所以得到某些需求先google搜一把~~比如之前搞半天的读取网页内容,自己边琢磨边写,又是charset,又是proxy,又是什么browsertype的,晕头转向,最后拿Jsoup一会儿就搞定了……不过使用之前要充分考虑可扩展性和API的丰富程度,不然后面程序体积变大集成起来很蛋疼。好了废话不说,讲讲串口的问题……

总述

Java常用的(我用到的)串口工具有俩:javacomm和RXTX,前者只支持win32,后者32和64位和其他版本都有。使用方法类似,所以就放到一起说:

下载到压缩包会看到readme之类的提示,然后把对应的dll文件和jar文件分别拷贝到/bin和/lib目录下,然后在出问题的时候继续查看readme。接着跑一下附带的例程。

具体使用过程就是:配置端口波特率、校验位等信息;打开串口;写数据;读输出;关闭。这一系列步骤在写程序的时候一定不要弄颠倒了。

串口配置

需要配置的有4项:

波特率(baudrate)— 一般9600、115200即可

(数据位)dataBits— 一般8 bits

DATABITS_5:5 bits

DATABITS_6:6 bits

DATABITS_7:7 bits

DATABITS_8:8 bits

(停止位)stopBits — 一般1 stop bit

STOPBITS_1:1 stop bit

STOPBITS_2:2 stop bits

STOPBITS_1_5:1.5 stop bits

(校验位)parity — 不需校验位的话,选择SerialPort.PARITY_NONE

PARITY_NONE:no parity

PARITY_ODD:odd parity

PARITY_EVEN:even parity

PARITY_MARK:mark parity

PARITY_SPACE:space parity

流量控制模式(FlowControlMode) — 一般FLOWCONTROL_NONE

FLOWCONTROL_NONE: no flow control

FLOWCONTROL_RTSCTS_IN: RTS/CTS (hardware) flow control for input

FLOWCONTROL_RTSCTS_OUT:RTS/CTS (hardware) flow control for output

FLOWCONTROL_XONXOFF_IN:XON/XOFF (software) flow control for input

FLOWCONTROL_XONXOFF_OUT:XON/XOFF (software) flow control for output

事件监听

addEventListener(SerialPortEventListener lsnr)

用于监听串口事件(SerialEvents),可监听的事件有:

BI(Break interrupt)

CD(Carrier detect)

CTS(Clear to send)

DATA_AVAILABLE(Data available at the serial port)

DSR(Data set ready)

eventType(Deprecated. Replaced by getEventType method)

FE(Framing error)

OE(Overrun error)

OUTPUT_BUFFER_EMPTY(Output buffer is empty)

PE(Parity error)

RI(Ring indicator)

读数据

通过SerialPortEventListener来,读取到DATA_AVAILABLE,保存并处理串口内容。

写数据

使用getOutputStream来向串口发送数据,是发送数据的唯一方法。使用时,向OutPutStream中写入byte串即可,之后用SerialPortEventListener获取回馈结果。

RXTX例程(来自 这里 ):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

publicclassUSBCommimplementsSerialPortEventListener{

publicstaticfinalStringMESSAGE="MESSAGE TO BE SEND";

/**

* Stream for the storage of incoming data

*/

privateInputStreaminputStream;

/**

* Stream for the dispatching of data

*/

privateOutputStreamoutputStream;

/**

* Timeout of the USB port

*/

privatefinalintPORT_TIMEOUT=2000;

/**

* Representation of the serial port used for the communication

*/

publicSerialPortserialPort;

/**

* Buffer that stores the received bytes from the media

*/

protectedLinkedBlockingQueuereceivedBytes;

/**

* Builds a new manager for the communication via USB port.

* @exception IOException if an error occurred during the opening of the USB port

*/

publicUSBComm(Stringcomm)throwsIOException{

receivedBytes=newLinkedBlockingQueue(100000);

Stringport=comm;//place the right COM port here, OS dependent

//Check that the USB port exists and is recognized:

Enumeration>portList=CommPortIdentifier.getPortIdentifiers();

booleanportFound=false;

CommPortIdentifierportId=null;

while(portList.hasMoreElements()){

portId=(CommPortIdentifier)portList.nextElement();

if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL){

if(portId.getName().equals(port)){

Log.logAndDisplay(LogLevel.INFO,"SerialConnection","Found port: "+port);

portFound=true;

break;

}

}

}

if(!portFound)

thrownewIOException("port "+port+" not found.");

try{

Log.logAndDisplay(LogLevel.INFO,"SerialConnection","USB port "+port+" opening...");

serialPort=(SerialPort)portId.open("USBCommunicator",PORT_TIMEOUT);

inputStream=serialPort.getInputStream();

outputStream=serialPort.getOutputStream();

serialPort.addEventListener(this);

serialPort.notifyOnDataAvailable(true);

Thread.sleep(1000);

serialPort.setSerialPortParams(serialPort.getBaudRate(),

serialPort.getDataBits(),

serialPort.getStopBits(),

serialPort.getParity());

serialPort.setFlowControlMode(serialPort.getFlowControlMode());

}catch(Exceptione){

System.err.println(e.getMessage());

thrownewIOException(e.getMessage());

}

}

publicvoidcloseUSB(){

//close the streams for serial port:

try{

inputStream.close();

outputStream.close();

}catch(IOExceptione){

System.err.println("Cannot close streams:"+e.getMessage());

}

}

/**

* Listener for USB events

*

* @param event new event occurred on the USB port

*/

publicvoidserialEvent(SerialPortEventevent){

switch(event.getEventType()){

caseSerialPortEvent.BI:

caseSerialPortEvent.OE:

caseSerialPortEvent.FE:

caseSerialPortEvent.PE:

caseSerialPortEvent.CD:

caseSerialPortEvent.CTS:

caseSerialPortEvent.DSR:

caseSerialPortEvent.RI:

caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:

//nothing to do...

break;

caseSerialPortEvent.DATA_AVAILABLE:

bytereceived=-1;

do{

try{

received=(byte)inputStream.read();

}catch(IOExceptione){

System.err.println("Error reading USB:"+e.getMessage());

}

synchronized(receivedBytes){

try{

receivedBytes.add(received);

}catch(IllegalStateExceptionew){

System.err.println(ew.getMessage());

receivedBytes.poll();

receivedBytes.add(received);

}

}

}while(received!=-1);

break;

}

}

publicvoidwrite(byte[]buffer){

try{

outputStream.write(buffer);

//outputStream.flush();

}catch(IOExceptione){

System.err.println("Cannot write:"+e.getMessage());

}

}

publicstaticvoidmain(String[]args){

USBCommusb;

try{

usb=newUSBComm("COM73");// change to your port

byte[]b=MESSAGE.getBytes();

usb.write(b);

usb.serialPort.close();

usb.closeUSB();

}catch(IOExceptione){

System.err.println("IOException:"+e.getMessage());

}

}

}

后记嗯……好像也啥都没写的样子(我会告诉你这篇其实是测试帖代码效果的吗)……总之去看javacomm附带有例程 / RXTX的例程就可以了……

java 串口波特率_JAVA串口通信的方法相关推荐

  1. c 语言 如何设置串口波特率,STC89C52RC串口波特率程序

    一.完整代码如下:C #include#define uchar unsigned char #define uint unsigned int void send(uchar state) { SB ...

  2. java tostring 库_java重寫toString()方法

    toString()方法是Object類的方法,調用toString()會返回對象的描述信息. 1)為什么重寫toString()方法呢? 如果不重寫,直接調用Object類的toString()方法 ...

  3. java 二分查找_Java数组之Arrays方法

    Java数组之Arrays方法,拉勾IT课小编为大家分析,JAVA数组的一些方法,提升开发水平,增强技术开发水平,不断提升个人的技术能力,在对于java开发领域,很多人都从基础做起. 1. 数组的工具 ...

  4. java集合示例_Java集合的addAll()方法和示例

    集合类addAll()方法addAll()方法在java.lang包中可用. addAll()方法用于将所有给定元素(ele)放入给定集合(co). addAll()方法是一个静态方法,可以使用类名进 ...

  5. java parsefloat 误差_Java Float类parseFloat()方法与示例

    Float类parseFloat()方法parseFloat()方法在java.lang包中可用. parseFloat()方法用于返回与给定String表示形式相对应的float值,换句话说,我们可 ...

  6. java getmethod类_Java Class类 getMethod()方法及示例

    Class类getMethod()方法getMethod()方法在java.lang包中可用. getMethod()方法用于返回Method对象,这些对象指示该类的给定公共方法或由此Class对象表 ...

  7. java newinstance 包_Java Class类 newInstance()方法及示例

    Class类newInstance()方法newInstance()方法在java.lang包中可用. newInstance()方法用于创建此Class对象表示的类的新实例. newInstance ...

  8. imx6 配置串口波特率_RS232串口多机通信

    一.基本原理 1.主从多机通信拓扑图 2.主从多机通信的具体过程 1)使所有的从机的SM2位置1,以便接收主机发来的地址: 2)主机发出一帧地址信息,其中包括8位需要与之通信的从机地址,第9位为1: ...

  9. java socket 端口_Java Socket通信如何摆平自身端口问题

    Java Socket通信在使用的时候有不少的问题,在端口编程上来说是一个十分重要的.下面我们就看看Java Socket通信如何才能更好的使用相关的代码.希望大家有所帮助. 事实上网络编程简单的理解 ...

最新文章

  1. 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧
  2. 《游戏引擎架构》笔记十四
  3. java finally块_java finally块后的语句是否要执行
  4. 【2018.5.19】模拟赛之三-ssl2434 取数【搜索,卡常或记忆化搜索】
  5. Windows下svn服务器安装
  6. 充分利用 UE4 中的噪声
  7. python编程入门 适合于零基础朋友-零基础能学好python吗?教女朋友学python是送命题吗?...
  8. java环境变量配置失败_java环境变量配置失败是怎么回事?出错解决办法分享
  9. 【图像重构】基于OMP算法实现图像重构附matlab代码
  10. 栅栏密码加密/解密【传统型】在线工具
  11. 松下服务器分频器输出信号与,详解几款常用分频器及音箱分频器电路图
  12. 〖Python接口自动化测试实战篇⑥〗- 接口抓包工具 Chrome 的使用
  13. 学java被“劝退”的第八天
  14. android布局靠底部,android – 使用layout_gravity =“bottom”放置在LinearLayout的底部
  15. jarvisoj_level1
  16. 阿里云服务器通用型实例g5与g6区别及如何选择?
  17. 【工作】引用文献(医学文献注意事项)
  18. matlab nan 无色_Matlab NAN如何去掉
  19. Spring中的@Transactional(rollbackFor = Exception.class) try catch 异常时候 会失效
  20. Artanis: 工作日志自动收发系统

热门文章

  1. js向php传递中文参数,JS传递参数时对中文进行编码和解码
  2. 通过学历造假获得面试机会,并成功拿到 Offer,这样的操作你认可吗?
  3. Zuul:构建高可用网关之多维度限流
  4. 带来高收入的三大竞争力技巧,可以涨到40W了!
  5. java反射 用处_浅谈Java反射
  6. 【SpringCloud】Zuul-实例
  7. 【SpringCloud】Eureka-实例
  8. reid笔记 yolov5 deepsort
  9. torch distributed 多GPU训练笔记
  10. c++ 获取时间字符串