`
心尘如梦
  • 浏览: 12814 次
  • 性别: 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"),波特率,数据位,停止位,校验位等参数: ```...

    QT打开二进制文件,串口分包定时发送,qt串口发送数据,QT源码.zip.zip

    在给定的资源中,我们关注的是如何使用QT处理二进制文件,并通过串口进行分包定时发送数据。这里我们将详细讲解相关的知识点。 1. **QT编程基础**:QT库提供了一系列的类和函数,使得开发者可以方便地进行GUI(图形...

    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开发人员提供了一个基础的测试...

    LINUXCC++串口读写串口读写[参照].pdf

    LINUX C/C++ 串口读写串口读写【参照】 Linux C/C++ 串口读写串口读写是计算机中一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。本文将介绍 Linux C/C++ 串口读写的基本概念、串口操作、串口设置和波特...

    串口读写_串口读写labview_

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

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

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

    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`展开。 首先,我们要理解串口的基本概念。串口,也称为串行接口,通过数据位的串行传输来实现通信。常见的...

    labview 串口连续读写

    labview 串口连续读写。可以轻松的完成串口数据的读取任务和写人物。

    vb做的串口传文件程序

    4. **数据分包**:由于串口一次只能发送有限长度的数据,因此大文件需要分割成多个小数据包。每个数据包通常包含数据内容和一些控制信息,如包的起始标志、结束标志、数据长度等,以确保正确传输。 5. **数据发送**...

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

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

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

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

    基于文件的串口工具

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

Global site tag (gtag.js) - Google Analytics