微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Java语言的51单片机串口通讯PC机程序

基于Java语言的51单片机串口通讯PC机程序

时间:11-20 来源:互联网 点击:

可。

4)下一步为你的工程增加这个库函数,以便你在工程里调用它们。选择Project菜单中的Project Properities选项,左侧选中Paths,右侧选中Required Libraries,单击Add,出现一个小的对话框,选择我们刚才增加的comm函数库,如图3,点击OK两次即可。

现在环境已经配置好了,我们要开始正式工作了。

图2 Configure Library

图2 New Librariy Wizard


图3 Select comm. Library

3程序开发(JBuilderX)

1.与51单片机交互信息,数据库存取(Data)

为了保证数据传输的顺利进行,单片机与PC之间通讯要建立一个协议,在本实例中,采用如下协议:

程序打开串口后,程序发送“启始”符(0x01)表示通讯开始。

通讯开始后,程序就开始发送和接收数据包,数据包以“结束”符(0x00,0x0D, 0x0A)表示结尾。由于单片机受控于PC机,所以单片机一般不主动发送数据,只有在PC机发送一个“命令”,它才会发送一个“回应”。

如果程序“停止”符(0x00),则通讯结束。

2.界面设计(View)

这部分设计主程序的视图,即使用者看到的部分,包括按钮,下拉菜单,文字编辑框等。

为了程序的可读性,我们将所有的视图从主程序中分离出来,作成Bean的形式,然后在主程序中调用它们。Java提供了五种布局管理形式FlowLayout,,GridLayout,GridBagLayout,BorderLayout,,CardLayout。灵活的运用这些布局,可以达到各种各样的效果,其中GridBagLayout功能强大,使用灵活,本文主要采用这种布局。

3.主程序设计(Control)

这部分设计程序的实现方法,逻辑步骤。

1)首先定义串口,输入输出流等,如下所示:

package comm;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.comm.*;//包含comm类包,才能使用其API函数

import java.io.*;

import java.util.*;

public class CommFrame extends JFrame implements Runnable, SerialPortEventListener {

JPanel contentPane; //定义一个JPanel,将视图Bean包含进来

BorderLayout borderLayout1 = new BorderLayout();

IOBean ioBean = new IOBean();//右侧视图Bean类事例化

ControlBean controlBean = new ControlBean();//左侧视图Bean类事例化

//Communination define

static CommPortIdentifier portName;//定义串口

int portId;

static Enumeration portList;

InputStream inputStream;//定义输入流

OutputStream outputStream;//定义输出流

SerialPort serialPort;

Thread readThread;//定义一个线程,程序全双工通讯

static String TimeStamp;

//Construct the frame

public CommFrame() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();//程序初始化

commInit();//串口初始化

}catch(Exception e) {

e.printStackTrace();

}

}

private void jbInit() throws Exception{……}

public void commInit() {……}

public void commClose() {……}

public void commWrite() {……}

public void CommRead() {……}

public void run() {……}

public void serialEvent(SerialPortEvent event) {…….}//代码如下

//Overridden so we can exit when window is closed

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

commClose();

System.exit(0);

}

}

}

2)串口初始化,首先监测串口是否被占用,如果没有被占用则打开串口。打开输入输出流以便下面的程序从串口读写数据,定义串口的波特率,位数,停止位,奇偶校验,在使用过程中可以改变这些内容以适应不同的需求。

public void commInit() {

//Communination ports owned or not

portId = 1;

try{

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {

portName = (CommPortIdentifier) portList.nextElement();

if (portName.getPortType() == CommPortIdentifier.PORT_SERIAL) {

if (portName.isCurrentlyOwned()) {//串口是否被占用

ioBean.Receiver.append("\nCOM"+portId+"Ownedby"+ portName.getCurrentOwner());

TimeStamp = new java.util.Date().toString();

portId ++;

}else if (portName.getName().equals("COM" + portId)) {

break;

}

}

}

//Communination ports init

try {

serialPort = (SerialPort) portName.open("Gooseli_MCU_Control_App", 20

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top