读写本地文件并用串口发送,同时把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();
}
}
分享到:
相关推荐
接下来,我们讨论如何"采用定时器把bin文件发送出去"。Qt的QTimer类可以用来触发周期性的事件。为了实现定时发送,我们需要: 1. **创建定时器**: 使用new QTimer(this)创建一个定时器,其中this代表父对象,通常为...
在给定的资源中,我们关注的是如何使用QT处理二进制文件,并通过串口进行分包定时发送数据。这里我们将详细讲解相关的知识点。 1. **QT编程基础**:QT库提供了一系列的类和函数,使得开发者可以方便地进行GUI(图形...
本教程聚焦于如何利用多线程实现串口(Serial Port)读写数据及文件的读写操作,这对于理解和开发高效通信系统至关重要。 首先,我们要理解什么是串口通信。串口通信是一种基于串行数据传输的通信方式,它通过一条...
`SerialPort`类是进行串口操作的核心,它提供了打开、关闭串口,设置串口参数,读写数据等一系列功能。创建一个`SerialPort`对象,你可以指定串口号(如"COM1"),波特率,数据位,停止位,校验位等参数: ```...
在本场景中,"sdram读写串口发送"涉及到将数据从SDRAM中读取,并通过串行接口发送出去。 首先,我们需要理解SDRAM的读写过程。读取操作通常包括预充电、行地址选通、列地址选通和数据传输等步骤。写入操作则涉及预...
通过`open()`函数打开串口,`setBaudRate()`、`setDataBits()`、`setParity()`、`setStopBits()`和`setFlowControl()`等方法配置串口参数,然后使用`write()`函数发送数据,`readyRead()`信号则用于监听串口是否有新...
在“通过串口发送数据”这一项目中,SLN文件可能包含了相关的C#或VB.NET项目,这些项目可能包含实现串口通信的类库。 5. **串口发送数据流程** - 打开串口:使用编程语言提供的API打开指定的COM端口。 - 设置参数...
此外,项目的"RFID串口"可能包含了实现这些功能的源代码文件,包括UI界面的设计(如XAML文件)、逻辑控制(如C#代码文件),以及可能的配置文件或帮助文档。 总的来说,这个项目为RFID开发人员提供了一个基础的测试...
LINUX C/C++ 串口读写串口读写【参照】 Linux C/C++ 串口读写串口读写是计算机中一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。本文将介绍 Linux C/C++ 串口读写的基本概念、串口操作、串口设置和波特...
总之,"串口读写_LabVIEW"主题涵盖了使用LabVIEW进行串口通信的基本步骤和技术要点,通过"串口读写.vi"这个实例,我们可以学习到如何在LabVIEW环境下构建一个完整的串口读写程序,从而实现设备间的有效通信。
该工具主要完成一下工作: ...3.保存上次发送的数据包信息(主要是读写txt文本,加载上次要发送的文本,已经按照樊工要求实现) 4.可以按照指定的时间,自动发送,从第一包,发送到最后一包,然后结束。
通过这些文件,我们可以学习到具体的串口读写实现细节,例如如何封装API函数,如何处理数据接收和发送的逻辑,以及如何处理异常和错误等。 总之,串口通信在VC6中主要涉及串口参数配置、读写操作以及异步通信,理解...
- 数据通过串口发送前,需先存储在单片机的缓冲区中,然后由硬件自动按照设定的波特率逐位发送出去。 - 发送数据通常通过SCON中的SM0和SM1设置串口工作模式,模式0或模式1常用于单工通信。 - TXD(P3.1)引脚用于...
基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。
本文将深入探讨如何在Linux下进行串口读写,主要围绕提供的两个源代码文件`read_seri.c`和`write_seri.c`展开。 首先,我们要理解串口的基本概念。串口,也称为串行接口,通过数据位的串行传输来实现通信。常见的...
labview 串口连续读写。可以轻松的完成串口数据的读取任务和写人物。
4. **数据分包**:由于串口一次只能发送有限长度的数据,因此大文件需要分割成多个小数据包。每个数据包通常包含数据内容和一些控制信息,如包的起始标志、结束标志、数据长度等,以确保正确传输。 5. **数据发送**...
3. `iniConfig.bas`: 通常用于读写配置文件,可能保存用户的串口设置和程序偏好。 4. `CMD命令调用.bat`: 这是一个批处理文件,可能用于执行操作系统级别的命令,例如开启或关闭串口服务,或者运行其他相关工具。 5....
4. **串口读写**:串口读写是串口通信的核心部分,涉及打开串口、设置波特率、数据位、校验位、停止位等参数,以及接收和发送数据的函数调用。例如,C++中通常使用`CreateFile`函数打开串口,`ReadFile`和`WriteFile...
在本例中,XML文件被用作数据存储格式,因为XML提供了结构化的数据表示方法,易于读写和解析。通过XML文件,工具能够自动记录用户上一次使用的COM口号(通信端口)和波特率(通信速率),这是串口通信的关键设置。...