免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 13974 | 回复: 24
打印 上一主题 下一主题

关于linux下串口接收数据出现“0A= 0D 0A”的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-03 22:04 |只看该作者 |倒序浏览
我在使用JAVA编程进行串口通讯时发现了一个问题——就是只要数据中存在0x0A时,0x0A前会多出一个0x0A,而且如果有0x0D这个数的话,系统会强行把0x0D变成0x0A,我试过用字符、字符串和字节的形式发送都不行。用DataOutputStream、OutputStream、OutputStreamWriter发送都不行。那位大虾帮帮忙解决一下,感激不尽!
     我专门发了03 10 03 10……这么一组数据收到的却是03 10 10 03 10 10,不知道为什么,有的说用二进制流发送就行,但OutputStream应该就是二进制流了
     由于第一次使用账号积分不够,希望好心人能帮忙解决难题!!!!

[ 本帖最后由 weichiying 于 2009-3-3 22:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-04 10:04 |只看该作者
谁能帮帮我啊!

论坛徽章:
0
3 [报告]
发表于 2009-03-04 10:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-03-04 10:45 |只看该作者
因为没看到源程序,在其它论坛上找了一下,应该还是LZ帖子。
从找到的代码段看写的部分应该没问题,估计问题是读的问题。
把读的代码试着改为以下形式试试

  1. final int RCV_BUF_LEN  256;
  2. int numBytes, pos;
  3. byte [] readBuffer = new byte[RCV_BUF_LEN ];
  4. ......
  5. ......
  6. case SerialPortEvent.DATA_AVAILABLE:
  7.     pos = 0;
  8.     try {
  9.         while ((numBytes = is.available()) > 0) {
  10.         numBytes = is.read(readBuffer, pos, RCV_BUF_LEN - pos);
  11.         pos += numBytes;
  12.         }
  13.         ........
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-03-04 11:26 |只看该作者

回复 #4 caojiqun 的帖子

谢谢,我试试看!
不过我从windows下发送,在linux下接收没问题啊

论坛徽章:
0
6 [报告]
发表于 2009-03-04 14:57 |只看该作者

回复 #3 javavsnet 的帖子

这样也不行啊,其实跟bytes[] numbytes={03,10,03,10,03,10}差不多都是以字节的形式存的

论坛徽章:
0
7 [报告]
发表于 2009-03-04 15:05 |只看该作者
这是我的接收和发送测试程序
package test;


import java.io.DataOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.TooManyListenersException;

import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;

//静态方法只能访问静态变量,如果想访问非静态变量,只能通过声明对象来访问
//静态方法不属于类,在类内方法访问变量不需加对象,类外(例如静态的main函数)需要加对象

public class Transceiver implements SerialPortEventListener {

CommPortIdentifier portId;
private String str;
private InputStream inputStream;
private static byte[] data1={$,03,10,03,10,03,10};
private SerialPort serialPort;

OutputStream outputStream;




String str1;// =new String();

public Transceiver(String com, int foc) {
// 构造函数

try {
portId = CommPortIdentifier.getPortIdentifier(com);
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {

}

try {
serialPort.getFlowControlMode();
try {
serialPort.setFlowControlMode(0);
} catch (UnsupportedCommOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
} catch (IOException e) {

}
try {
serialPort.addEventListener(this);// 进行端口监听 , 当事件发生自动调用
// serialEvent方法
} catch (TooManyListenersException e) {
}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(foc, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {

}
} catch (NoSuchPortException e) {

}
}// 构造函数

public void writeport(byte[] buffer) {

try {

outputStream.write(buffer,0,buffer.length);

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}

}

// ////////////////////////////////////////////////////////////////////

// 处理侦听到的串口事件
public void serialEvent(SerialPortEvent event) {
// System.out.println("接收数据...\r\n");
switch (event.getEventType()) {
case SerialPortEvent.BI:// 通讯中断.
case SerialPortEvent.OE:// 溢位错误.
case SerialPortEvent.FE:// 帧错误
case SerialPortEvent.PE:// 奇偶校验错.
case SerialPortEvent.CD:// 载波检测.
case SerialPortEvent.CTS:// 清除发送.
case SerialPortEvent.DSR:// 数据设备准备好
case SerialPortEvent.RI:// 振铃指示.
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:// OUTPUT_BUFFER_EMPTY -
// 输出缓冲区已清空
break;
case SerialPortEvent.DATA_AVAILABLE:// DATA_AVAILABLE - 有数据到达
// float ch;
int ch;
short command;

StringBuffer buf = new StringBuffer();
// 读数据
try {
InputStream input = serialPort.getInputStream();

while ((ch = input.read()) > 0) {
if (ch == 36)
break;
buf.append((char) ch); //会是03(乱码) \n \n 03(乱码) \n \n

}
input.read(data, 0, data.length);//若是用这个读的话就是03 10 10 03 10 10 03 10 10
str = buf.toString();
System.out.println(str);

}


} catch (IOException e) {
}
break;
}
}

public void Close() {
serialPort.close();

}
public static void main(String[] args) {
Transceiver transceiver=new Transceiver("/dev/ttyS0",9600);
while(true){
transceiver.writeport(data1);
Thread.sleep(10);
   }
}
}

论坛徽章:
0
8 [报告]
发表于 2009-03-04 16:40 |只看该作者
原帖由 weichiying 于 2009-3-4 11:26 发表
谢谢,我试试看!
不过我从windows下发送,在linux下接收没问题啊

抱歉,帮不了你的忙!因为没有环境做试验。
另外,为什么不试试linux下发送,windows下接收(随便找个串口调试工具就行),判断一下发送是不是真有问题。至少从程序看不出这点。

论坛徽章:
0
9 [报告]
发表于 2009-03-04 16:53 |只看该作者

回复 #8 caojiqun 的帖子

都试过了,就是不行。应该是发送的问题。linux下发送,windows下接收会多出0D;windows下发送,linux下接收一点事都没有;都在linux下发送和接收会多出0A,而且会把0D强制变成0A。真是郁闷啊

论坛徽章:
0
10 [报告]
发表于 2009-03-05 20:52 |只看该作者
问题找到了!
Sun的Comm包不行,用RXTX包就行了。
(Ubuntu 8.10)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP