我在使用JAVA编程进行串口通讯时发现了一个问题——就是只要数据中存在0x0A时,在windows操作系统下0x0A前会多出一个0x0D;而在linux下0x0A前会多出一个0x0A,而且如果有0x0D这个数的话,系统会强行把0x0D变成0x0A,我试过用字符、字符串和字节的形式发送都不行。用DataOutputStream、OutputStream、OutputStreamWriter发送都不行。那位大虾帮帮忙解决一下,感激不尽!
解决方案 »
- 预编译如何输入一个指定日期呢?高手救急~~~
- Java的前景和主要就业城市
- ##做了个即时通讯+信息发布搜索的东东,大家帮忙看看,提提意见,顺便帮我测试测试##
- j2ee的基础的问题!
- 有用java是从头开发的吗
- 通过InputStream获得URL页面代码,程序为什么总是会死在while (in.available()!=0)循坏中?
- 急需JAVA RMI相关中文资料
- 为什么从sun官方网站下的jdk无法打开?
- 如何从键盘读入一个double或int型数组??(高分!!)
- 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
- 类中对象的初始化
- 如何学好Java编程语言?
OutputStream out;
out = serialPort.getOutputStream();
out.Write(HexString);
没什么问题啊
win xp系统没有linux环境
不过两边都设置号了是收发十六进制或者是字符串,应该就是一样的哦
在win xp下呢
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); }
input.read(data, 0, data.length);//若是用这个读的话就是03 10 10 03 10 10 93 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); transceiver.writeport(data1);
}
}
package send;public class SerialBuffer
{
public String Content = "";
private String CurrentMsg;
private boolean available = false;
private int LengthNeeded = 2;
public boolean isTimeOut=false; public synchronized String getMsg(long timeOut)//获得所读取的前两个字符
{
while (Content.equals("")||Content==null)
{
try
{
wait(timeOut);
}catch(InterruptedException e){
e.printStackTrace();
}
if(Content.equals("")||Content==null)
{
isTimeOut=true;
Content="aa";
}
else
{
break;
}
}
CurrentMsg = Content.substring(0, LengthNeeded);
Content = Content.substring(LengthNeeded, Content.length());
notifyAll();
return CurrentMsg;
} public synchronized void putChar(int c)//得到串口读过来的数据存到字符变量中
{
String t="";
t=Integer.toHexString(c);
if(t.length()<2)
{
t="0"+t;
}
Content = Content.concat(t);
if (LengthNeeded < Content.length())
{
available = true;
}
notifyAll();
}
public synchronized void cleanBuff()
{
Content="";
notifyAll();
}public synchronized boolean getIsTimeOut()
{
notifyAll();
return isTimeOut;
}
}
package send;
import java.io.*;
import javax.comm.*;public class SerialBean
{
private String mess="";//从串口读过来的数据
private static String PortName;
private CommPortIdentifier portId;
private SerialPort serialPort;
private static OutputStream out;
private static InputStream in;
private String Content = "";
private String CurrentMsg;
private boolean available = false;
private int LengthNeeded = 2;
private ReadSerial rs;
private SerialBuffer sb;
public SerialBean(int PortID,int BaudRate)
{
Initialize(PortID,BaudRate);
}
public int Initialize(int PortID,int BaudRate)
{
PortName = "COM" + PortID;
int InitSuccess = 1;
int InitFail = -1;
try
{
portId = CommPortIdentifier.getPortIdentifier(PortName);
try
{
serialPort = (SerialPort)
portId.open("Serial_Communication", 2000);
} catch (PortInUseException e)
{
return InitFail;
}
try
{
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
} catch (IOException e)
{
return InitFail;
}
try
{
serialPort.setSerialPortParams(BaudRate,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e)
{
return InitFail;
}
} catch (NoSuchPortException e){
return InitFail;
}
sb=new SerialBuffer();
rs=new ReadSerial(sb,in);
rs.start() ;
return InitSuccess;
}
public void wPort(String str)
{
try
{
out.write(StrToHex(str));
}catch(IOException e){e.printStackTrace();}
}
public String rPort(long timeOut)
{
mess=sb.getMsg(timeOut);
return mess;
}
public void clPort()
{
sb.cleanBuff();
}
public boolean isTimeOut()
{
return sb.getIsTimeOut();
}
public static byte[] StrToHex(String hexstr) //十六进制字符串转化为字节数组
{
byte[] b = new byte[hexstr.length() / 2];
int j = 0;
for (int i = 0; i < b.length; i++) {
char c0 = hexstr.charAt(j++);
char c1 = hexstr.charAt(j++);
b[i] = (byte) ((parse(c0) << 4) | parse(c1));
}
return b;
}
private static int parse(char c)
{
if (c >= 'a')
return (c - 'a' + 10) & 0x0f;
if (c >= 'A')
return (c - 'A' + 10) & 0x0f;
return (c - '0') & 0x0f;
}
}package send;import java.io.*;public class ReadSerial extends Thread//读取串口数据的线程
{
private SerialBuffer sb;
private InputStream in;
public ReadSerial(SerialBuffer sb, InputStream in)
{
this.sb = sb;
this.in =in;
}
public void run()
{
int c;
try
{
while(true)
{
c = in.read();
sb.putChar(c);
}
} catch (IOException e) {System.out.println("------------block----------");}
}
}
加main
不知道他们区别都在哪里
在linux下估计你程序要变动一下了
根据你所要发送和接收的情况,过滤一下啊