gpt4 book ai didi

java - 在 com 端口上同时读取和写入

转载 作者:行者123 更新时间:2023-11-29 05:33:50 25 4
gpt4 key购买 nike

我的问题是在一个com端口上不能同时读写吗?这只是为了演示目的,一旦我按下键盘上的 F5 键,我只会读取一个端口,但为了演示目的,我试图同时读取和写入但不能这样做。它表示 其他一些程序正在使用该端口

更新

package com_port;

import java.io.*;
import java.util.*;
import javax.comm.*;

public class simplerad implements Runnable, SerialPortEventListener
{
static CommPortIdentifier portId;
static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;

public static void main(String[] args) throws Exception
{
portList = CommPortIdentifier.getPortIdentifiers();
System.out.println("SimpleRead Started.");
while (portList.hasMoreElements())
{
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
System.out.println ("Found " + portId.getName());
if (portId.getName().equals("COM7"))
{
OutputStream outputStream;
SerialPort writePort = (SerialPort) portId.open("SimpleWriteApp", 2000);
writePort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
outputStream = writePort.getOutputStream();
outputStream.write("AT+CENG=2".getBytes());
System.out.println("write done");
writePort.close();
simplerad reader = new simplerad();
}
}
}
}

public simplerad()
{
try
{
System.out.println("1");
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
}
catch (PortInUseException e)
{
e.printStackTrace();
}
try
{
System.out.println("2");
inputStream = serialPort.getInputStream();
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
System.out.println("3");
serialPort.addEventListener(this);
}
catch (TooManyListenersException e)
{
e.printStackTrace();
}
serialPort.notifyOnDataAvailable(true);
try
{
System.out.println("4");
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}
catch (UnsupportedCommOperationException e)
{
e.printStackTrace();
}
readThread = new Thread(this);
readThread.start();
}

public void run()
{
System.out.println("5");
try
{
System.out.println("6");
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}

public void serialEvent(SerialPortEvent event)
{
System.out.println("7");
switch (event.getEventType())
{
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[20];

try
{
System.out.println("8");
while (inputStream.available() > 0)
{
int numBytes = inputStream.read(readBuffer);
System.out.print(new String(readBuffer, 0, numBytes, "us-ascii"));
}
System.out.print(new String(readBuffer));
}
catch (IOException e)
{
e.printStackTrace();
}
break;
}
}
}

为什么 serialEvent 没有运行?

最佳答案

这里的问题是你试图打开同一个 COM 端口两次,答案是否定的,这不会起作用 - 至少你在这里做的方式是这样。原因是底层操作系统只允许每个端口一个用户模式句柄。

但是是的,只要您的 COM 端口是双向的(大多数都是双向的),您就可以打开一个 COM 端口并同时对其进行读/写 - 这称为全双工模式。

要在您的应用程序中获得此行为,您需要打开“COM7”端口一次,然后让您的读取线程访问该原始对象,而不是尝试再次打开它。另一种方法是在打开后立即获取 InputStream 和 OutputStream,然后在应用程序的其余部分使用这些对象。

我不确定为什么您的事件监听器没有触发,但是对于您在这里实际尝试执行的操作,您的代码似乎有点复杂。打开/关闭可能会导致您错过事件通知。

这是一个你应该在打开时做什么的例子,这应该是一个比在读写之间打开/关闭端口更有效的解决方案:

// Each of these could be object members so all your class methods have access
OutputStream outputStream;
InputStream inputStream;
SerialPort serialPort;

// Open the port one time, then init your settings
serialPort = (SerialPort)portId.open("SimpleWriteApp", 2000);
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

// Get the input/output streams for use in the application
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();

// Finally, add your event listener
serialPort.addEventListener(this);

关于java - 在 com 端口上同时读取和写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20185999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com