日期:2014-05-20  浏览次数:20726 次

请教串口通信问题(Java)--用java串口程序读取不是一整条信息
我的问题是为什么串口每次串口读取的数据都是一个字节,而不是把整个字符串读取出来。例如下面的程序读取的内容为
A-------
d-------
d-------
r------
e-----
s-----
而不是Address=0x1,humidity=62,Temperature=29,Voltage=2315---------
芯片是10秒钟发送一次数据。代码如下:
public void serialEvent(SerialPortEvent event) {
  int data=0;
  StringBuffer inputbuffer=new StringBuffer();
  switch(event.getEventType()) {
  case SerialPortEvent.BI:/*Break interrupt,通讯中断*/
  case SerialPortEvent.OE:/*Overrun error,溢位错误*/ 
  case SerialPortEvent.FE:/*Framing error,传帧错误*/
  case SerialPortEvent.PE:/*Parity error,校验错误*/
  case SerialPortEvent.CD:/*Carrier detect,载波检测*/
  case SerialPortEvent.CTS:/*Clear to send,清除发送*/
  case SerialPortEvent.DSR:/*Data set ready,数据设备就绪*/
  case SerialPortEvent.RI:/*Ring indicator,响铃指示*/
  case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/
  break;
  case SerialPortEvent.DATA_AVAILABLE:/*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/
  while(data!=-1){
  try{
  data=inputStream.read();
  if(data==-1){
  //break;
  }
   
  inputbuffer.append((char)data);
  } catch (IOException e) {}
  System.out.print(inputbuffer.toString());
  break;
   
  }
  }
  System.out.println("------");
  }

我做的应用是从串口中接受温度,湿度信息然后插入数据库,现在每次读取的数据都是分开的,有没有方法可以一次性的接受传感器发送的单次数据

------解决方案--------------------
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)
------解决方案--------------------
探讨
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)

------解决方案--------------------
public int read(byte[] b)
throws IOException从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。 
如果 b 为 null,将抛出 NullPointerException。如果 b 的长度为 0,则无字节可读且返回 0;否则,要尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少可以读取一个字节并将其存储在 b 中。 

将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。让 k 为实际读取的字节数;这些字节将存储在元素 b[0] 至 b[k-1] 之间,不影响元素 b[k] 至 b[b.length-1]。 

------解决方案--------------------
探讨
引用:
引用:
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)

同上,读入到1个缓冲字节数组中,详见API文档。

我最开始用的就是这种方法,不过它每次只读取出来8位,也不是一整条信息

------解决方案--------------------
建议你进行封装 BufferedReader br = new InputStreamReader(inputStream)
然后通过br.readLine();
data的类型也需要改.