Java Gui与串口通信
Java Gui communication with serial port
我有Class,从串口接收和发送信息:
public class Terminal implements Runnable
{
static LinkedList<String> receiver = new LinkedList<String>();
public Terminal()
{
//...
}
public String getReceivedMessage()
{
String data = receivedMessfges.removeFirst();
return data;
}
// Other function that perform connection to COM port
// ...
}
我还有基于 Swing 的图形用户界面 class:
public class Gui extends JFrame
{
// Functions that display information, received from COM port
}
使用第三个 class 将信息从 Terminal
传递到 Gui
的正确方法是什么:
public class Monitor
{
static Gui gui;
static terminal terminal;
public static void main(String args[])
{
monitor = new Monitor();
}
public Monitor()
{
gui = new Gui();
terminal = new Terminal();
}
// Functions, that get information COM port
// using getReceivedMessage() function
// and display it on Gui
}
谢谢)
您可以使用外部接口,例如将数据写入文件并从那里读取....
我会使用 Monitor
class 在 Gui
和 Terminal
之间进行通信。
如果 receivedMessfges.removeFirst();
在收到应在 gui 中显示的完整消息后才 return,您可以这样做:
Thread messageChecker = new Thread(new Runnable() {
public void run() {
while (!Thread.isInterrupted()) {
String message = terminal.getReceivedMessage();
// Prepare message for gui display
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui.methodToDisplayTheReceivedMessage(message);
}
}
}
}
}).start();
Monitor
class.
里面的某个地方
代码执行以下操作:
- 创建一个新的Runnable(匿名class)
- 我们使用
run()
方法
- 检查线程是否中断
- 如果有,停止
- 如果还没有,请等到我们收到来自 的新消息并将其发送到 gui。
- 创建一个新的线程集来执行我们新的Runnable
的run()
方法
- 启动此线程。
- 将线程的引用分配给变量
messageChecker
。
要停止线程,只需调用 messageChecker.interrupt();
。
另一方面,如果 terminal.getReceivedMessage();
return 只有部分消息,即在我们调用它之前收到的消息,我认为最好的方法是使用观察者模式。
- 使终端class实现接口
Observable
- 使监视器class实现接口
Observer
然后,您需要编写代码,以便在终端 class 有完整消息时立即通知观察者消息。我建议在终端 class 内部设置一个线程,定期检查新数据。一旦它有一个完整的消息,它应该调用 notifyObservers(message)
(message
显然是一个包含完整消息的 String
类型的变量)。
在监视器class中,你必须有一个update(Observable o, Object arg)
方法来满足Observer
接口:
// In the Monitor class
void update(Observable terminal, Object message) {
SwingUtilities.invokeLater(new Runnable() {
gui.methodToDisplayTheReceivedMessage((String)message); // This cast is safe, since we only ever call notifyObservers() with a string argument.
}
}
最后但同样重要的是,您需要从 Monitor class(可能是从构造函数)调用 terminal.addObserver(this);
,否则 notifyObservers()
将通知您所有的 0 个观察者并且什么也不会发生.
谷歌搜索 "java observer pattern" 可以得到很多有用的资源和示例,以备不时之需。
我有Class,从串口接收和发送信息:
public class Terminal implements Runnable
{
static LinkedList<String> receiver = new LinkedList<String>();
public Terminal()
{
//...
}
public String getReceivedMessage()
{
String data = receivedMessfges.removeFirst();
return data;
}
// Other function that perform connection to COM port
// ...
}
我还有基于 Swing 的图形用户界面 class:
public class Gui extends JFrame
{
// Functions that display information, received from COM port
}
使用第三个 class 将信息从 Terminal
传递到 Gui
的正确方法是什么:
public class Monitor
{
static Gui gui;
static terminal terminal;
public static void main(String args[])
{
monitor = new Monitor();
}
public Monitor()
{
gui = new Gui();
terminal = new Terminal();
}
// Functions, that get information COM port
// using getReceivedMessage() function
// and display it on Gui
}
谢谢)
您可以使用外部接口,例如将数据写入文件并从那里读取....
我会使用 Monitor
class 在 Gui
和 Terminal
之间进行通信。
如果 receivedMessfges.removeFirst();
在收到应在 gui 中显示的完整消息后才 return,您可以这样做:
Thread messageChecker = new Thread(new Runnable() {
public void run() {
while (!Thread.isInterrupted()) {
String message = terminal.getReceivedMessage();
// Prepare message for gui display
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui.methodToDisplayTheReceivedMessage(message);
}
}
}
}
}).start();
Monitor
class.
代码执行以下操作:
- 创建一个新的Runnable(匿名class)
- 我们使用
run()
方法- 检查线程是否中断
- 如果有,停止
- 如果还没有,请等到我们收到来自 的新消息并将其发送到 gui。
- 我们使用
- 创建一个新的线程集来执行我们新的Runnable 的
- 启动此线程。
- 将线程的引用分配给变量
messageChecker
。
run()
方法
要停止线程,只需调用 messageChecker.interrupt();
。
另一方面,如果 terminal.getReceivedMessage();
return 只有部分消息,即在我们调用它之前收到的消息,我认为最好的方法是使用观察者模式。
- 使终端class实现接口
Observable
- 使监视器class实现接口
Observer
然后,您需要编写代码,以便在终端 class 有完整消息时立即通知观察者消息。我建议在终端 class 内部设置一个线程,定期检查新数据。一旦它有一个完整的消息,它应该调用 notifyObservers(message)
(message
显然是一个包含完整消息的 String
类型的变量)。
在监视器class中,你必须有一个update(Observable o, Object arg)
方法来满足Observer
接口:
// In the Monitor class
void update(Observable terminal, Object message) {
SwingUtilities.invokeLater(new Runnable() {
gui.methodToDisplayTheReceivedMessage((String)message); // This cast is safe, since we only ever call notifyObservers() with a string argument.
}
}
最后但同样重要的是,您需要从 Monitor class(可能是从构造函数)调用 terminal.addObserver(this);
,否则 notifyObservers()
将通知您所有的 0 个观察者并且什么也不会发生.
谷歌搜索 "java observer pattern" 可以得到很多有用的资源和示例,以备不时之需。