java串口程序---------------------------------------------------站等高手答疑解惑!!!

東刀人 2013-04-15 09:40:59
各位高手好,小弟初次接触串口,是一头雾水不知如何下手,在网上找了一些示例,但也还是云里雾里的。
小弟本次要实现在本地通过串口向对应的LED屏发送实时信息,但是不知道该怎么具体实现?很是苦恼,所以在本地想测试一下网上现成的示例,了解一下串口程序是如何发送信息的过程,但不知如何搭建测试环境,求各位高手指点解惑,感激之情无以言表!谢谢!
如下是网上现成示例:
发送程序
import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.comm.*; class S_Frame extends Frame implements Runnable,ActionListener { /*检测系统中可用的通讯端口类 */ static CommPortIdentifier portId; /*Enumeration 为枚举型类,在util中 */ static Enumeration portList; OutputStream outputStream; /*RS-232的串行口 */ SerialPort serialPort; Thread readThread; Panel p=new Panel(); TextField in_message=new TextField("打开COM1,波特率9600,数据位8,停止位1."); TextArea out_message=new TextArea(); Button btnOpen=new Button("打开串口, 发送数据"); Button btnClose=new Button("关闭串口, 停止发送数据"); byte data[]=new byte[10240]; /*设置判断要是否关闭串口的标志*/ boolean mark; /*安排窗体*/ S_Frame() { super("串口发送数据"); setSize(200,200); setVisible(true); add(out_message,"Center"); add(p,"North"); p.add(btnOpen); p.add(btnClose); add(in_message,"South"); btnOpen.addActionListener(this); btnClose.addActionListener(this); } //R_Frame() end /*点击按扭打开串口.*/ public void actionPerformed(ActionEvent event) { if (event.getSource()==btnClose){ serialPort.close(); //关闭串口 mark=true; //用于中止线程的run()方法 in_message.setText("串口COM1已经关闭,停止发送数据."); } else { mark=false; /*从文本区按字节读取数据*/ data=out_message.getText().getBytes(); /*打开串口*/ start(); in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据....."); } } //actionPerformed() end /*打开串口,并调用线程发送数据*/ public void start(){ /*获取系统中所有的通讯端口 */ portList=CommPortIdentifier.getPortIdentifiers(); /* 用循环结构找出串口 */ while (portList.hasMoreElements()){ /*强制转换为通讯端口类型*/ portId=(CommPortIdentifier)portList.nextElement(); if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){ if (portId.getName().equals("COM1")) { /*打开串口 */ try { serialPort = (SerialPort) portId.open("ReadComm", 2000); } catch (PortInUseException e) { } /*设置串口输出流*/ try { outputStream = serialPort.getOutputStream(); } catch (IOException e) {} } //if end } //if end } //while end /*调用线程发送数据*/ try{ readThread = new Thread(this); //线程负责每发送一次数据,休眠2秒钟 readThread.start(); } catch (Exception e) { } } //start() end /*发送数据,休眠2秒钟后重发*/ public void run() { /*设置串口通讯参数*/ try { serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { } /*发送数据流(将数组data[]中的数据发送出去)*/ try { outputStream.write(data); } catch (IOException e) { } /*发送数据后休眠2秒钟,然后再重发*/ try { Thread.sleep(2000); if (mark) {return; //结束run方法,导致线程死亡 } start(); } catch (InterruptedException e) { } } //run() end } //类S_Frame end public class SendComm {public static void main(String args[]) { S_Frame S_win=new S_Frame(); S_win.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0); } }); S_win.pack(); } }

接收程序
import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.comm.*; class R_Frame extends Frame implements Runnable,ActionListener,SerialPortEventListener { /* 检测系统中可用的通讯端口类 */ static CommPortIdentifier portId; /* Enumeration 为枚举型类,在java.util中 */ static Enumeration portList; InputStream inputStream; /* 声明RS-232串行端口的成员变量 */ SerialPort serialPort; Thread readThread; String str=""; TextField out_message=new TextField("上面文本框显示接收到的数据"); TextArea in_message=new TextArea(); Button btnOpen=new Button("打开串口"); /*建立窗体*/ R_Frame() { super("串口接收数据"); setSize(200,200); setVisible(true); btnOpen.addActionListener(this); add(out_message,"South"); add(in_message,"Center"); add(btnOpen,"North"); } //R_Frame() end /*点击按扭所触发的事件:打开串口,并监听串口. */ public void actionPerformed(ActionEvent event) { /*获取系统中所有的通讯端口 */ portList=CommPortIdentifier.getPortIdentifiers(); /* 用循环结构找出串口 */ while (portList.hasMoreElements()){ /*强制转换为通讯端口类型*/ portId=(CommPortIdentifier)portList.nextElement(); if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){ if (portId.getName().equals("COM1")) { try { serialPort = (SerialPort) portId.open("ReadComm", 2000); out_message.setText("已打开端口COM1 ,正在接收数据..... "); } catch (PortInUseException e) { } /*设置串口监听器*/ try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { } /* 侦听到串口有数据,触发串口事件*/ serialPort.notifyOnDataAvailable(true); } //if end } //if end } //while end readThread = new Thread(this); readThread.start(); //线程负责每接收一次数据休眠20秒钟 } //actionPerformed() end /*接收数据后休眠20秒钟*/ public void run() { try { Thread.sleep(20000); } catch (InterruptedException e) { } } //run() end /*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/ public void serialEvent(SerialPortEvent event) { /*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/ try {serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {} byte[] readBuffer = new byte[20];try {inputStream = serialPort.getInputStream();} catch (IOException e) {} try { /* 从线路上读取数据流 */ while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); } //while end str=new String(readBuffer); /*接收到的数据存放到文本区中*/ in_message.append(str+"\n"); } catch (IOException e) { } } //serialEvent() end } //类R_Frame end public class ReadComm { public static void main(String args[]) { /* 实例化接收串口数据的窗体类 */ R_Frame R_win=new R_Frame(); /* 定义窗体适配器的关闭按钮功能 */ R_win.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0); } }); R_win.pack(); } }

以上就是现成的类实现,不知道我在本地要怎么要才能与另外一个测试电脑来测试这个程序,求高手不吝赐教。
...全文
204 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
STEEL-CHINA 2013-04-19
  • 打赏
  • 举报
回复
引用 10 楼 Jamespass 的回复:
現在有一顆IC能同時連接電腦和安卓的, 是USB轉串口的, FT231X
==================== 你有什么问题?
Jamespass 2013-04-19
  • 打赏
  • 举报
回复
現在有一顆IC能同時連接電腦和安卓的, 是USB轉串口的, FT231X
東刀人 2013-04-15
  • 打赏
  • 举报
回复
引用 6 楼 lizhengguang 的回复:
还有,我在做的时候,没有用到监听,直接读数据采用类似于SOCKET一样的。你试一下吧,界面也不要,很简单的代码,先测试一下。
不用监听?还是要启动线程来实时发送数据的,对吧? 想问一下大侠:是不是先打开本地串口,然后在打开要发送信息的电脑串口,是这个么“serialPort = (SerialPort) portId.open("ReadComm", 2000);”?不知道我传一个对方的串口号,这边要具体怎么处理?才能按照这个串口发送信息过去呢?求教啦,谢谢!
東刀人 2013-04-15
  • 打赏
  • 举报
回复
引用 6 楼 lizhengguang 的回复:
还有,我在做的时候,没有用到监听,直接读数据采用类似于SOCKET一样的。你试一下吧,界面也不要,很简单的代码,先测试一下。
大侠可否给一个简单的示例?小弟是真不懂这块,想直观的看看从本机通过串口把信息发送到对方机器的过程,感觉这样理解起来比较快一点。或者大侠就本程序改改也行,能快速让小弟理解明白达到效果也可以。多谢大侠!!!
STEEL-CHINA 2013-04-15
  • 打赏
  • 举报
回复
还有,我在做的时候,没有用到监听,直接读数据采用类似于SOCKET一样的。你试一下吧,界面也不要,很简单的代码,先测试一下。
  • 打赏
  • 举报
回复
串口通信你用jni,不然你调用不到c++里面的方法
STEEL-CHINA 2013-04-15
  • 打赏
  • 举报
回复
两台电脑就把COMM两个连接起来(这个类似于RJ45)一样,在SOCKET通信中,打开端口。 这个也一样,如果你两台电脑都是COMM1,就都打开COMM1。一方发送数据,一方接收数据就可以了。
東刀人 2013-04-15
  • 打赏
  • 举报
回复
引用 2 楼 lizhengguang 的回复:
没时间细看,你遇到什么问题了? 首先你的包,资源文件,dll文件是否都按要求放到指定位置。 是否要以扫描出你本地串口,如果可能,应该没大问题。 串口操作比较简单,start();看一下,你这个会不会打开多次。 打开串口,发送数据。
大侠你好,资源文件,dll文件这些都放到指定位置了,上面的程序是完整的,只是现在我不知道我在本地想测试一下,在两台电脑间要怎么弄才能将这个程序跑起来?比如:是要把这两个程序分别放在我的电脑和测试机上,还是要怎么弄?怎么才能测试让它运行发数据?
STEEL-CHINA 2013-04-15
  • 打赏
  • 举报
回复
没时间细看,你遇到什么问题了? 首先你的包,资源文件,dll文件是否都按要求放到指定位置。 是否要以扫描出你本地串口,如果可能,应该没大问题。 串口操作比较简单,start();看一下,你这个会不会打开多次。 打开串口,发送数据。
東刀人 2013-04-15
  • 打赏
  • 举报
回复
上面的代码格式可能没弄好:如下: 发送程序
/******************************************
 * 程序文件名称:SendComm.java
 *  功能:从串行口COM1中发送数据
 ******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;

class S_Frame extends Frame implements Runnable, ActionListener {
	/* 检测系统中可用的通讯端口类 */
	static CommPortIdentifier portId;
	/* Enumeration 为枚举型类,在util中 */
	static Enumeration portList;
	OutputStream outputStream;
	/* RS-232的串行口 */
	SerialPort serialPort;
	Thread readThread;
	Panel p = new Panel();
	TextField in_message = new TextField("打开COM1,波特率9600,数据位8,停止位1.");
	TextArea out_message = new TextArea();
	Button btnOpen = new Button("Open打开串口,   发送数据");
	Button btnClose = new Button("Close关闭串口, 停止发送数据");
	byte data[] = new byte[10240];
	/* 设置判断要是否关闭串口的标志 */
	boolean mark;

	/* 安排窗体 */
	S_Frame() {
		super("串口发送数据");
		setSize(200, 200);
		setVisible(true);
		add(out_message, "Center");
		add(p, "North");
		p.add(btnOpen);
		p.add(btnClose);
		add(in_message, "South");
		btnOpen.addActionListener(this);
		btnClose.addActionListener(this);
	} // R_Frame() end

	/* 点击按扭打开串口. */
	public void actionPerformed(ActionEvent event) {
		if (event.getSource() == btnClose) {
			serialPort.close();// 关闭串口
			mark = true; // 用于中止线程的run()方法
			in_message.setText("串口COM1已经关闭,停止发送数据.");
		} else {
			mark = false;
			/* 从文本区按字节读取数据 */
			data = out_message.getText().getBytes();
			/* 打开串口 */
			start();
			in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据.....");
		}
	} // actionPerformed() end

	/* 打开串口,并调用线程发送数据 */
	public void start() {
		/* 获取系统中所有的通讯端口 */
		portList = CommPortIdentifier.getPortIdentifiers();
		/* 用循环结构找出串口 */
		while (portList.hasMoreElements()) {
			/* 强制转换为通讯端口类型 */
			portId = (CommPortIdentifier) portList.nextElement();
			if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
				if (portId.getName().equals("COM3")) {
					/* 打开串口 */
					try {
						serialPort = (SerialPort) portId.open("ReadComm", 2000);
					} catch (PortInUseException e) {
						e.printStackTrace();
					}
					/* 设置串口输出流 */
					try {
						outputStream = serialPort.getOutputStream();
					} catch (IOException e) {
						e.printStackTrace();
					}
				} // if end
			} // if end
		} // while end
		/* 调用线程发送数据 */
		try {
			readThread = new Thread(this);
			// 线程负责每发送一次数据,休眠2秒钟
			readThread.start();
		} catch (Exception e) {
		}
	} // start() end

	/* 发送数据,休眠2秒钟后重发 */
	public void run() {
		/* 设置串口通讯参数 */
		try {
			serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
					SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
		} catch (UnsupportedCommOperationException e) {
		}
		/* 发送数据流(将数组data[]中的数据发送出去) */
		try {
			outputStream.write(data);
		} catch (IOException e) {
		}
		/* 发送数据后休眠2秒钟,然后再重发 */
		try {
			Thread.sleep(2000);
			if (mark) {
				return; // 结束run方法,导致线程死亡
			}
			start();
		} catch (InterruptedException e) {
		}
	} // run() end
} // 类S_Frame end

public class SendComm {
	public static void main(String args[]) {
		S_Frame S_win = new S_Frame();
		S_win.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		S_win.pack();
	}
}
接收程序
/******************************************
 * 程序文件名称:ReadComm.java
 *  功能:从串行口COM1中接收数据
 ******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;

class R_Frame extends Frame implements Runnable, ActionListener,
		SerialPortEventListener {
	/* 检测系统中可用的通讯端口类 */
	static CommPortIdentifier portId;
	/* Enumeration 为枚举型类,在java.util中 */
	static Enumeration portList;
	InputStream inputStream;
	/* 声明RS-232串行端口的成员变量 */
	SerialPort serialPort;
	Thread readThread;
	String str = "";
	TextField out_message = new TextField("上面文本框显示接收到的数据");
	TextArea in_message = new TextArea();
	Button btnOpen = new Button("Open Serial打开串口");

	/* 建立窗体 */
	R_Frame() {
		super("串口接收数据");
		setSize(200, 200);
		setVisible(true);
		btnOpen.addActionListener(this);
		add(out_message, "South");
		add(in_message, "Center");
		add(btnOpen, "North");
	} // R_Frame() end

	/* 点击按扭所触发的事件:打开串口,并监听串口. */
	public void actionPerformed(ActionEvent event) {
		/* 获取系统中所有的通讯端口 */
		portList = CommPortIdentifier.getPortIdentifiers();
		/* 用循环结构找出串口 */
		while (portList.hasMoreElements()) {
			/* 强制转换为通讯端口类型 */
			portId = (CommPortIdentifier) portList.nextElement();
			if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
				if (portId.getName().equals("COM1")) {
					try {
						serialPort = (SerialPort) portId.open("ReadComm", 2000);
						out_message.setText("已打开端口COM1 ,正在接收数据..... ");
					} catch (PortInUseException e) {
					}

					/* 设置串口监听器 */
					try {
						serialPort.addEventListener(this);
					} catch (TooManyListenersException e) {
					}
					/* 侦听到串口有数据,触发串口事件 */
					serialPort.notifyOnDataAvailable(true);
				} // if end
			} // if end
		} // while end
		readThread = new Thread(this);
		readThread.start();// 线程负责每接收一次数据休眠20秒钟
	} // actionPerformed() end

	/* 接收数据后休眠20秒钟 */
	public void run() {
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
		}
	} // run() end

	/* 串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中 */
	public void serialEvent(SerialPortEvent event) {
		/*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/
		try {
           serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
		}catch (UnsupportedCommOperationException e) {}
		byte[] readBuffer = new byte[20];
	    try {
	    	inputStream = serialPort.getInputStream();
		}catch (IOException e) {}
		try {
			/* 从线路上读取数据流 */
	        while (inputStream.available() > 0) { 
	            int numBytes = inputStream.read(readBuffer);
	        }    //while end
	        str=new String(readBuffer);
	         /*接收到的数据存放到文本区中*/
	        in_message.append(str+"\n");
		}catch (IOException e) {    }
	} //serialEvent() end
} // 类R_Frame end

public class ReadComm {
	public static void main(String args[]) {
		/* 实例化接收串口数据的窗体类 */
		R_Frame R_win = new R_Frame();
		/* 定义窗体适配器的关闭按钮功能 */
		R_win.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		R_win.pack();
	}
}
在线等高手赐教,急呀!!!
STEEL-CHINA 2013-04-15
  • 打赏
  • 举报
回复
引用 8 楼 cgw1123 的回复:
引用 6 楼 lizhengguang 的回复:还有,我在做的时候,没有用到监听,直接读数据采用类似于SOCKET一样的。你试一下吧,界面也不要,很简单的代码,先测试一下。 不用监听?还是要启动线程来实时发送数据的,对吧? 想问一下大侠:是不是先打开本地串口,然后在打开要发送信息的电脑串口,是这个么“serialPort = (SerialPort) portId.o……
======================================= 不需要,两台电脑的程序一模一样就可以了,通过串口线连接就行。目前主机一般只有一个COM口了,有些可能没有了。 主机A:COMM1 ------------数据线------------- 主机B:COMM1 COMM1 打开,写数据 ------------------------- COMM1 打开,读数据 COMM1 读数据,写数据 ----------------------- COMM1 写数据,打数据 因为COMM1一般不会有多线程操作,所以不需要多线程处理。具体看实现吧。

50,543

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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