`
心尘如梦
  • 浏览: 12798 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

读写文件并用串口发送出去

阅读更多

读写本地文件并用串口发送,同时把GBK内码存入另一个文件中

 

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class COM_Send {
	private CommPortIdentifier portId = null;
	private SerialPort serialPort = null;
	private InputStream in = null;
	private OutputStream out = null;
	private boolean sendNext = true; // 收到响应发送下一条数据

	/**
	 * 串口连接
	 */
	private void connect() {
		try {
			portId = CommPortIdentifier.getPortIdentifier("COM1");
			serialPort = (SerialPort) portId.open("myCom", 1000);

			serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
					SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
			in = serialPort.getInputStream();
			out = serialPort.getOutputStream();
		} catch (NoSuchPortException e) {
			e.printStackTrace();
		} catch (PortInUseException e) {
			e.printStackTrace();
		} catch (UnsupportedCommOperationException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 关闭串口
	 */
	private void close() {
		try {
			in.close();
			out.close();
			serialPort.close();
			portId = null;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 向文件及串口发送数据
	 * 
	 * @throws IOException
	 */
	private void writeOutput() throws IOException {
		InputStreamReader fromFile = new InputStreamReader(new FileInputStream(
				"c://123.txt"), "GBK");
		BufferedReader fromFileBuffer = new BufferedReader(fromFile);
		String s;
		File file = new File("c://456.txt");
		if (!file.exists()) {
			file.createNewFile();
		}
		OutputStreamWriter toFile = new OutputStreamWriter(
				new FileOutputStream(file), "GBK");
		OutputStreamWriter toCom = new OutputStreamWriter(out, "GBK");

		while ((s = fromFileBuffer.readLine()) != null && sendNext) {
			System.out.println(s);

			byte b[] = s.getBytes("GBK");
			for (int i = 0; i < b.length;) {
				// 第一个字节
				int firstByte = b[i] & 0xFF;
				// 转换成16进制
				String str = Integer.toHexString(firstByte).toUpperCase();
				if (str.length() < 2) {
					str += "0";
				}
				if (firstByte >= 0xB0 && firstByte <= 0xF7) { // 高字节在GBK内码范围内
					int secondByte = b[i + 1] & 0xFF;
					if (secondByte >= 0xA1 && secondByte <= 0xFE) { // 低字节在GBK内码范围内
						String secondStr = Integer.toHexString(secondByte)
								.toUpperCase();
						if (str.length() < 2) {
							secondStr += "0";
						}
						str += secondStr;
						i++;
					}
				}
				// 以16进制方式将汉字写入另一个文件,汉字为两个字节,其他字符为一个字节
				toFile.write(str);
				toFile.write(" ");
				i++;
			}
			toFile.write("\r\n");

			// 将文件写入到串口
			toCom.write(s);
			toCom.write("\r\n");
			toCom.flush();

			try {
				Thread.sleep(100);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}

			// 等待正确返回“ok”再发下一行数据,否则认为通讯失败
			int i = 0; // 超时的次数
			while (i < 5) {
				if (in.available() == 2) { // 返回“ok”
					if (in.available() >= 2) {// 大于等于2个字节
						byte[] ok = new byte[2];
						in.read(ok, 0, 2);
						if (ok[0] == 0x6F && ok[1] == 0x6B) { // 等于 ok
							System.out.println("Success!");
							break;
						}
					}

				}
				i++;
				try {
					// Thread.sleep(50);
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(i);
			if (i == 5) {
				System.out.println("超时!");
				sendNext = false;
			}
		}

		if (sendNext) {
			System.out.println("发送成功!");
		}

		fromFileBuffer.close();
		fromFile.close();
		toFile.close();
		toCom.close();
		close();
	}

	public static void main(String args[]) throws IOException {
		COM_Send cs = new COM_Send();
		cs.connect();
		cs.writeOutput();
		cs.close();
	}
}
 
分享到:
评论

相关推荐

    Qt利用串口读取bin文件

    接下来,我们讨论如何"采用定时器把bin文件发送出去"。Qt的QTimer类可以用来触发周期性的事件。为了实现定时发送,我们需要: 1. **创建定时器**: 使用new QTimer(this)创建一个定时器,其中this代表父对象,通常为...

    用多线程实现串口读写数据以及文件的读写

    本教程聚焦于如何利用多线程实现串口(Serial Port)读写数据及文件的读写操作,这对于理解和开发高效通信系统至关重要。 首先,我们要理解什么是串口通信。串口通信是一种基于串行数据传输的通信方式,它通过一条...

    c# 串口发送数据 c# 串口发送数据

    `SerialPort`类是进行串口操作的核心,它提供了打开、关闭串口,设置串口参数,读写数据等一系列功能。创建一个`SerialPort`对象,你可以指定串口号(如"COM1"),波特率,数据位,停止位,校验位等参数: ```...

    sdram读写串口发送

    在本场景中,"sdram读写串口发送"涉及到将数据从SDRAM中读取,并通过串行接口发送出去。 首先,我们需要理解SDRAM的读写过程。读取操作通常包括预充电、行地址选通、列地址选通和数据传输等步骤。写入操作则涉及预...

    Qt 线程串口读写串口数据

    通过`open()`函数打开串口,`setBaudRate()`、`setDataBits()`、`setParity()`、`setStopBits()`和`setFlowControl()`等方法配置串口参数,然后使用`write()`函数发送数据,`readyRead()`信号则用于监听串口是否有新...

    通过串口发送数据

    在“通过串口发送数据”这一项目中,SLN文件可能包含了相关的C#或VB.NET项目,这些项目可能包含实现串口通信的类库。 5. **串口发送数据流程** - 打开串口:使用编程语言提供的API打开指定的COM端口。 - 设置参数...

    RFID 读写器串口

    此外,项目的"RFID串口"可能包含了实现这些功能的源代码文件,包括UI界面的设计(如XAML文件)、逻辑控制(如C#代码文件),以及可能的配置文件或帮助文档。 总的来说,这个项目为RFID开发人员提供了一个基础的测试...

    分包发送数据串口通信(点击按钮自动分包一次发送数据)

    该工具主要完成一下工作: ...3.保存上次发送的数据包信息(主要是读写txt文本,加载上次要发送的文本,已经按照樊工要求实现) 4.可以按照指定的时间,自动发送,从第一包,发送到最后一包,然后结束。

    串口读写_串口读写labview_

    总之,"串口读写_LabVIEW"主题涵盖了使用LabVIEW进行串口通信的基本步骤和技术要点,通过"串口读写.vi"这个实例,我们可以学习到如何在LabVIEW环境下构建一个完整的串口读写程序,从而实现设备间的有效通信。

    vc6 串口 读写 vc6 串口 读写

    通过这些文件,我们可以学习到具体的串口读写实现细节,例如如何封装API函数,如何处理数据接收和发送的逻辑,以及如何处理异常和错误等。 总之,串口通信在VC6中主要涉及串口参数配置、读写操作以及异步通信,理解...

    51单片机串口数据发送,LCD显示

    - 数据通过串口发送前,需先存储在单片机的缓冲区中,然后由硬件自动按照设定的波特率逐位发送出去。 - 发送数据通常通过SCON中的SM0和SM1设置串口工作模式,模式0或模式1常用于单工通信。 - TXD(P3.1)引脚用于...

    基于select的Linux串口485读写,文件描述符 fd_set

    基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。

    linux下的串口读写

    本文将深入探讨如何在Linux下进行串口读写,主要围绕提供的两个源代码文件`read_seri.c`和`write_seri.c`展开。 首先,我们要理解串口的基本概念。串口,也称为串行接口,通过数据位的串行传输来实现通信。常见的...

    A890-RES串口发送接收调试软件V3.0_VB源代码

    3. `iniConfig.bas`: 通常用于读写配置文件,可能保存用户的串口设置和程序偏好。 4. `CMD命令调用.bat`: 这是一个批处理文件,可能用于执行操作系统级别的命令,例如开启或关闭串口服务,或者运行其他相关工具。 5....

    c++串口读写实例源代码

    4. **串口读写**:串口读写是串口通信的核心部分,涉及打开串口、设置波特率、数据位、校验位、停止位等参数,以及接收和发送数据的函数调用。例如,C++中通常使用`CreateFile`函数打开串口,`ReadFile`和`WriteFile...

    基于文件的串口工具

    在本例中,XML文件被用作数据存储格式,因为XML提供了结构化的数据表示方法,易于读写和解析。通过XML文件,工具能够自动记录用户上一次使用的COM口号(通信端口)和波特率(通信速率),这是串口通信的关键设置。...

    android下的串口读写及数据保存

    "android下的串口读写及数据保存"这个主题涵盖了Android系统中如何与串行端口交互以及如何处理接收到的数据并将其保存到文件的关键技术点。下面我们将深入探讨这些知识点。 首先,Android系统的串口通信主要是通过...

    Labview 编写的串口发送文件小程序

    在这个“Labview编写的串口发送文件小程序”中,开发者利用Labview的强大功能,创建了一个能够通过串行接口发送文件的实用程序。这个程序对于需要在设备之间进行数据传输或者控制系统的人来说非常有用,特别是在...

    c#串口读写类,这对串口的读写操作

    根据提供的文件名"NetSerialComm",这可能是一个包含串口通信功能的自定义类库或代码文件。在使用此类库时,应了解其提供的API和具体实现,以便更好地进行串口操作。 总之,C#中的串口读写操作主要通过`SerialPort...

    串口通讯+文件读写+汉字字模提前(原程序)

    串口通讯、文件读写和汉字字模提取是嵌入式系统或计算机编程中的关键技能,这些技术在很多领域都有广泛的应用,例如工业自动化、物联网设备、数据采集系统等。以下将详细介绍这三个方面: 1. **串口通讯**:串口...

Global site tag (gtag.js) - Google Analytics