用comm类读串口,同一次发送的数据分段了?

hanxingruo 2008-09-02 09:10:31
用comm读串口数据代码如下

int count = 0;
receivejTextArea.append("re>");
while ( count == 0) {
count = inputStream.available();
if( count > 0){
byte readBuffer[] = new byte[count];
inputStream.read(readBuffer);
String receiveString = new String(readBuffer);
receivejTextArea.append(receiveString+"\r\n");// 打印串口数据
}
}


当串口发字符串“PLEASE ENTER SERVEN CHARS:”时,显示是
re>PLEASE
re>ENTER SE
re>RVEN CHARS:

我读数据的代码有问题么,为什么同一次发送的数据,读出来却是分段的??但是有时候却能整段的读完,不明白原因
请大家帮忙

...全文
193 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanxingruo 2008-09-02
  • 打赏
  • 举报
回复
555~~
没有人回复么
hanxingruo 2008-09-02
  • 打赏
  • 举报
回复
谢谢BatiTan
你的inStream是DataInputStream类型吧?调用一次inStream.read();是读取一个整型数据(四个字节)么?

我使用的是InputStream,调用inputStream.available()得到当前串口缓冲区内的字节数,然后new一个相应长度的字节读取进去。
给串口发送一段字符串时,比如 PLEASE ENTER SERVEN CHARS:
我觉得应该是inputStream.available()返回26(有26个字母),然后就可以一次读取出来

但是实际情况是把上面字符分成了三段,每次我只能读一段,一共发了三次DATA_AVAILABLE消息

为什么不能一次读取出来呢
BatiTan 2008-09-02
  • 打赏
  • 举报
回复

public void serialEvent(SerialPortEvent e){
StringBuffer stringBuffer= new StringBuffer();
int readData= 0;
switch(e.getEventType()){
case SerialPortEvent.DATA_AVAILABLE:
while(readData!= -1){
try{
readData= inStream.read();
if(readData== -1){
break;
}

String value; //转换数据显示,用十六进制输出
if(readData>= 16){
value= Integer.toHexString(readData).toUpperCase();
}else if(readData>= 0){
value= "0".concat(Integer.toHexString(readData).toUpperCase());
}else{
value= Integer.toHexString(readData).substring(6).toUpperCase(); //当数据小于0时转换成十六进制显示时取后两位数据位,忽略符号位
}

stringBuffer.append(value+ " "); //将数据转换为十六进制显示
}catch(IOException ex){
ex.printStackTrace();
}
}

/**
* 以下代码构造接收的数据字符串,并在输出区域显示返回信息
*/
for(int i=101;i<stringBuffer.length();i+=3*34){ //数据过长时加入换行符
stringBuffer.setCharAt(i, '\n'); //通过在指定位置插入换行符实现自动换行功能
}
String data= new String(stringBuffer);
String infoStr= new Date()+ "(串口测试)\n"+ data+ "\n\n";
System.out.println(infoStr);
this.commFrame.getRecvArea().append(infoStr); //将接收到的数据以十六进制显示在文本区域
// case SerialPortEvent.BI:
// System.err.println("Break Interrupted...!");
// String info= new Date()+ "\n "+ "Break Interrupted...!"+ "\n\n";
// this.commFrame.getRecvArea().append(info);
}
}
BatiTan 2008-09-02
  • 打赏
  • 举报
回复
应该是读数据的时候有问题~
前段时间还用了这个 javax.comm
我帮你找找我原来怎么用的

62,612

社区成员

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

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