请教串口通信问题(Java)--用java串口程序读取不是一整条信息

liuhang3 2009-08-01 04:21:23
我的问题是为什么串口每次串口读取的数据都是一个字节,而不是把整个字符串读取出来。例如下面的程序读取的内容为
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("------");
}

我做的应用是从串口中接受温度,湿度信息然后插入数据库,现在每次读取的数据都是分开的,有没有方法可以一次性的接受传感器发送的单次数据
...全文
421 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
woodshappy 2012-08-14
  • 打赏
  • 举报
回复
楼主在吗 我最近也在学习rxtx有啥经验分享下呗 先谢谢了
zfh111111 2012-05-18
  • 打赏
  • 举报
回复
我最近也遇到了这个问题 请问楼主“采用了RXTX的包” 是什么意思 能具体说说吗? 谢谢啊
liuhang3 2009-08-02
  • 打赏
  • 举报
回复
采用了rxtx的包
liuhang3 2009-08-02
  • 打赏
  • 举报
回复
问题已解决,谢谢各位。
liuhang3 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gesanri 的回复:]
引用 3 楼 liuhang3 的回复:
引用 2 楼 still_rain 的回复:
引用 1 楼 gesanri 的回复:
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)

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

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

只能读出8位?你该不是把数组byte[] b的大小只设置为8了吧?你设置大点不就可以了
[/Quote]

设置512都不起作用,应该不是数组大小设置的问题。不过还是谢谢了
wuxuankaishi 2009-08-02
  • 打赏
  • 举报
回复
建议你进行封装 BufferedReader br = new InputStreamReader(inputStream)
然后通过br.readLine();
data的类型也需要改.
gesanri 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuhang3 的回复:]
引用 2 楼 still_rain 的回复:
引用 1 楼 gesanri 的回复:
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)

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

我最开始用的就是这种方法,不过它每次只读取出来8位,也不是一整条信息
[/Quote]
只能读出8位?你该不是把数组byte[] b的大小只设置为8了吧?你设置大点不就可以了
itisonlylove_yy 2009-08-02
  • 打赏
  • 举报
回复
read(byte[] b)参数可以是一条信息的总长度;这一样不说一次性把信息全读完了哟
itisonlylove_yy 2009-08-02
  • 打赏
  • 举报
回复
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]。
liuhang3 2009-08-02
  • 打赏
  • 举报
回复
如果实在没有办法,我只有在传感器传送的数据包里设一个终止位了
liuhang3 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 still_rain 的回复:]
引用 1 楼 gesanri 的回复:
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)

同上,读入到1个缓冲字节数组中,详见API文档。
[/Quote]
我最开始用的就是这种方法,不过它每次只读取出来8位,也不是一整条信息
爱摸鱼de老邪 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gesanri 的回复:]
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)
[/Quote]
同上,读入到1个缓冲字节数组中,详见API文档。
gesanri 2009-08-01
  • 打赏
  • 举报
回复
read()从输入流读取下一个数据字节,要整个读出来你可以用read(byte[] b)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧