

using System;
using System.IO.Ports;
class Program
{
static void Main(string[] args)
{
// 创建串口对象
SerialPort serialPort = new SerialPort();
// 设置串口参数
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
// 打开串口
serialPort.Open();
// 注册数据接收事件处理方法
serialPort.DataReceived += SerialPort_DataReceived;
// 等待用户按下任意键退出程序
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
// 关闭串口
serialPort.Close();
}
static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 强制转换为SerialPort对象
SerialPort serialPort = (SerialPort)sender;
// 读取串口接收缓冲区中的数据
string data = serialPort.ReadExisting();
// 处理接收到的数据(打印或其他操作)
Console.WriteLine("Received Data: " + data);
}
}这个示例程序创建了一个SerialPort对象,设置了串口参数,并打开了串口。然后注册了一个数据接收事件处理方法,当串口接收到数据时会调用这个方法。在事件处理方法中,我们可以读取串口接收缓冲区中的数据,并进行处理(例如打印数据)。最后,程序等待用户按下任意键退出,并在退出前关闭了串口。请根据实际情况修改串口参数和处理接收到的数据的逻辑。
import jssc.SerialPort;
import jssc.SerialPortException;
import jssc.SerialPortList;
public class SerialCommunicationReader {
public static void main(String[] args) {
// 获取可用的串口列表
String[] portNames = SerialPortList.getPortNames();
// 打开第一个可用的串口
SerialPort serialPort = new SerialPort(portNames[0]);
try {
serialPort.openPort();
// 设置串口参数,如波特率、数据位、停止位等
serialPort.setParams(SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
// 设置串口监听器
serialPort.addEventListener(event -> {
if (event.isRXCHAR()) { // 如果收到数据
try {
// 读取并输出收到的数据
byte[] buffer = serialPort.readBytes(event.getEventValue());
System.out.println(new String(buffer));
} catch (SerialPortException e) {
e.printStackTrace();
}
}
});
// 读取数据直到程序退出
while (true) {
// do nothing
}
} catch (SerialPortException e) {
e.printStackTrace();
} finally {
try {
// 关闭串口
serialPort.closePort();
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
}这个示例程序使用了jCommSerial库来读取串口通讯。它首先获取可用的串口列表,然后打开第一个可用的串口。接下来,通过设置串口参数来配置串口,如波特率、数据位、停止位等。然后,设置串口监听器来接收串口收到的数据,并在收到数据时将其输出到控制台。最后,程序进入一个无限循环,持续读取串口数据,直到程序退出。在程序退出时,需要手动调用closePort()方法来关闭串口。
请注意,jCommSerial库需要在项目中引入。你可以在jCommSerial的官方网站(https://github.com/NeuronRobotics/nrjavaserial)上找到该库的下载和使用说明。
以下是一个简单的示例程序:
#include <iostream>
#include <string>
#include <windows.h> // Windows下的串口库头文件
int main() {
HANDLE hSerial;
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS timeouts = { 0 };
// 打开串口
hSerial = CreateFile("COM1", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
std::cout << "Failed to open serial port." << std::endl;
return 1;
}
// 配置串口参数
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
std::cout << "Failed to get serial port state." << std::endl;
CloseHandle(hSerial);
return 1;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
std::cout << "Failed to set serial port state." << std::endl;
CloseHandle(hSerial);
return 1;
}
// 设置串口读取超时时间
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(hSerial, &timeouts)) {
std::cout << "Failed to set serial port timeouts." << std::endl;
CloseHandle(hSerial);
return 1;
}
// 读取串口数据
char buffer[1024];
DWORD bytesRead;
while (true) {
if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) {
std::cout << "Failed to read from serial port." << std::endl;
CloseHandle(hSerial);
return 1;
}
if (bytesRead > 0) {
std::string receivedData(buffer, bytesRead);
std::cout << "Received data: " << receivedData << std::endl;
}
}
// 关闭串口
CloseHandle(hSerial);
return 0;
}上述示例程序实现了打开串口 COM1,并读取串口数据,然后将读取到的数据打印到终端。你可以根据需要修改串口名称和参数。注意,在使用该示例程序之前,你需要安装 Windows 下的串口库,并将其链接到你的项目中。