linux下的串口开发小记
1.了解一下什么是串口.
串口叫做串行接口,也称串行通信接口,按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。USB是近几年发展起来的新型接口标准,主要应用于高速数据传输领域。
而我需要记录的也是RS232标准串口
RS-232-C:也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座。后来的PC上使用简化了的9芯D型插座。现在应用中25芯插头座已很少采用。现在的台式电脑一般有两个串行口:COM1和COM2,从设备管理器的端口列表中就可以看到。硬件表现为计算机后面的9针D形接口,由于其形状和针脚数量的原因,其接头又被称为DB9接头。现在有很多手机数据线或者物流接收器都采用COM口与计算机相连,很多投影机,液晶电视等设备都具有了此接口,厂家也常常会提供控制协议,便于在控制方面实现编程受控,现在越来越多的智能会议室和家居建设都采用了中央控制设备对多种受控设备的串口控制方式。
2.如果你是用笔记本开发串口程序,可以使用pcmicia转串口设备.
3.关于在linux下开发基于串口的java程序
下载jar包http://java.sun.com/products/javacomm/
解压,把其中so文件复制到/usr/lib
把javax.comm.properties复制到jre目录下
把comm.jar放到classpath目录下
串口连接:
CommPortIdentifierportID;
Stringowner=newString("modem");
intkeeptime=5000;
EnumerationportList;
portList=CommPortIdentifier.getPortIdentifiers();
//Stringdrivername="com.sun.comm.Win32Driver";
Stringdrivername="com.sun.comm.LinuxDriver";
CommDriverdriver=null;
try{
//System.loadLibrary("win32com");
driver=(CommDriver)Class.forName(driverName).newInstance();
driver.initialize();
System.out.println("Win32DriverInitialized");
}catch(Exceptione){
e.printStackTrace();
}
//如果有多个端口
while(portList.hasMoreElements()){
portID=(CommPortIdentifier)portList.nextElement();
System.out.println("COM:"+portID.getName());
//if(portID.getName().equals("COM1"))
if(portID.getName().equals("/dev/ttyS0"))
try{
sPort=(SerialPort)portID.open(owner,keeptime);
break;
}catch(PortInUseExceptione){
e.printStackTrace();
System.exit(1);
}
}
try{
if(sPort!=null)
{
in=sPort.getInputStream();
out=sPort.getOutputStream();
try{
sPort.addEventListener(this);
sPort.notifyOnDataAvailable(true);
}catch(TooManyListenersExceptione){
e.printStackTrace();
}
}
}catch(Exceptione)
{
e.printStackTrace();
}
其中注释掉的是windows下的连接方法
全部代码
importjavax.comm.*;
importjava.util.Enumeration;
importjava.util.TooManyListenersException;
importjava.io.*;
publicclassATSmsimplementsSerialPortEventListener{
privateSerialPortsPort=null;
privateInputStreamin=null;
privateOutputStreamout=null;
privatebyteb[]=newbyte[1024];
privateStringcmd="";
privateintlen=0;
privateStringrecvMsg="";
publicATSms()
{
init();
}
publicsynchronizedvoidserialEvent(SerialPortEventserialPortEvent){
intc=0;
//如果有串口事件发生
if(serialPortEvent.getEventType()==SerialPortEvent.DATA_AVAILABLE)
{
try{
System.out.print("Recv:");
while((c=in.read())!=-1){
System.out.print((char)c);
recvMsg+=((char)c);
}
}//try
catch(IOExceptione){
e.printStackTrace();
}
}
}
privatestaticStringgetUnicodeString(Strings)
{
StringunicodeStr="";
for(inti=0;i<S.LENGTH();I++)
{
Stringc=Integer.toHexString(s.charAt(i)&0xffff);
while(c.length()<4)
{
c="0"+c;
}
unicodeStr+=c;
}
returnunicodeStr;
}
privatestaticStringgetSMobile(Stringmobile)
{
StringBuffersMobile=newStringBuffer("68");
for(inti=0;i<MOBILE.LENGTH();I=I+2)
{
sMobile.append((i+1<MOBILE.LENGTH())?MOBILE.CHARAT(I+1):"F");
</MOBILE.LENGTH())?MOBILE.CHARAT(I+1):"F");
sMobile.append(mobile.charAt(i));
}
returnsMobile.toString();
}
privatevoidinit()
{
CommPortIdentifierportID;
Stringowner=newString("modem");
intkeeptime=5000;
EnumerationportList;
portList=CommPortIdentifier.getPortIdentifiers();
//Stringdrivername="com.sun.comm.Win32Driver";
Stringdrivername="com.sun.comm.LinuxDriver";
CommDriverdriver=null;
try{
//System.loadLibrary("win32com");
//System.out.println("Win32ComLibraryLoaded");
driver=(CommDriver)Class.forName(driverName).newInstance();
driver.initialize();
System.out.println("Win32DriverInitialized");
}catch(Exceptione){
e.printStackTrace();
}
//如果有多个端口
while(portList.hasMoreElements()){
portID=(CommPortIdentifier)portList.nextElement();
System.out.println("COM:"+portID.getName());
//if(portID.getName().equals("COM1"))
if(portID.getName().equals("/dev/ttyS0"))
try{
//System.out.println("trytoopenthe/dev/ttyS0");
sPort=(SerialPort)portID.open(owner,keeptime);
//System.out.println("trytoopenthe/dev/ttyS0OK");
break;
}catch(PortInUseExceptione){
e.printStackTrace();
System.exit(1);
}
}
try{
if(sPort!=null)
{
in=sPort.getInputStream();
out=sPort.getOutputStream();
try{
sPort.addEventListener(this);
sPort.notifyOnDataAvailable(true);
}catch(TooManyListenersExceptione){
e.printStackTrace();
}
}
/**
System.out.print("setPDUmode:");
out.write("at+cmgf=0\r".getBytes());
out.flush();
//len=in.read(b);
for(inti=0;i<3;i++)
{
recvMsg=readThread.readComMsg();
if(!"".equals(recvMsg))break;
Thread.sleep(1000);
System.out.println("Sleep1001.");
}
if(recvMsg.indexOf("OK")>=0)
{
System.out.println("OK");
}else
{
System.out.println("ERROR");
}
*/
}catch(Exceptione)
{
e.printStackTrace();
}
}
publicvoidclose()
{
try{
Thread.sleep(4000);
in.close();
out.close();
}catch(Exceptione){
e.printStackTrace();//TochangebodyofcatchstatementuseFile|Settings|FileTemplates.
}
sPort.close();
}
publicintsendSms(Stringrecv,Stringcontent)
{
intsendok=1;
for(inti=0;i<CONTENT.LENGTH();I=I+70)
{
sendok=sendShortSms(recv,((i+70<=content.length())?content.substring(i,i+70):content.substring(i)));
}
returnsendok;
}
privateintsendShortSms(Stringrecv,Stringcontent)
{
intsendok=-1;
try{
System.out.println("sendsmsto:"+recv+"\ncontent:"+content);
content=getUnicodeString(content);
//content=(j+70>uc.length()/2)?uc.substring(j):uc.substring(j,j+140);
//System.out.println(j+":"+content);
cmd="at+cmgs="+Integer.toString(15+content.length()/2)+"\r";
out.write(cmd.getBytes());
out.flush();
System.out.println("Send:"+cmd);
for(inti=0;i<5;i++)
{
if(recvMsg.indexOf(">")>=0)
{
recvMsg=recvMsg.substring(recvMsg.indexOf(">")+1);
break;
}else
{
try
{
Thread.sleep(1000);
}catch(Exceptione)
{
}
}
}
cmd=Integer.toHexString(content.length()/2&0xffff);
if(cmd.length()<2)cmd="0"+cmd;
cmd="0011000D91"+getSMobile(recv)+"000800"+cmd+content;
cmd=cmd.toUpperCase();
out.write(cmd.getBytes());
out.write(26);
out.flush();
System.out.println("Send:"+cmd);
for(inti=0;i<5;i++)
{
if(recvMsg.indexOf("OK")>=0)
{
recvMsg=recvMsg.substring(recvMsg.indexOf("OK")+2);
sendok=1;
break;
}else
{
try
{
Thread.sleep(1000);
}catch(Exceptione)
{
}
}
}
}catch(Exceptione)
{
sendok=-1;
e.printStackTrace();
}
returnsendok;
}
publicstaticvoidmain(Stringargs[])
{
Stringc=("16日");
ATSmsat=newATSms();
at.sendSms("13999999999",c);
at.close();
}
}