我在笔记本电脑上,现在无法检查,我想知道我是否打开COM2连接,并为COM2端口添加接收事件,然后通过&#34关闭COM2连接; serial.Close()"在程序中,我仍然可以在COM2端口上接收接收事件吗?如果它仍然可以接收,我想我会在接收事件中打开COM2端口连接并读取数据,可以这样做吗?
SerialPort serial = new SerialPort()
{
PortName = "com2",
BaudRate = 9600,
Handshake = System.IO.Ports.Handshake.None,
Parity = Parity.None,
DataBits = 8,
StopBits = StopBits.One,
ReadTimeout = 400,
WriteTimeout = 200,
};
serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive);
private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
using (SerialPort serialPort = serial)
{
if (serialPort.IsOpen)
serialPort.Close();
try
{
serialPort.Open();
received_data = serialPort.ReadExisting();
Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(WriteMyData), received_data);
}
catch (Exception ex)
{
}
finally
{
if (serialPort != null)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
Thread.Sleep(5);
//serialPort.Dispose();
}
Thread.Sleep(5);
}
}
}
public void SerialCmdSendByte(byte[] hexstring)
{
using (SerialPort serialPort = serial)
{
if (serialPort.IsOpen)
serialPort.Close();
try
{
serialPort.Open();
foreach (byte hexval in hexstring)
{
byte[] _hexval = new byte[] { hexval };
serialPort.Write(_hexval, 0, 1);
Thread.Sleep(3);
}
}
catch (IOException ex)
{
}
finally
{
if (serialPort != null)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
Thread.Sleep(5);
//serialPort.Dispose();
}
Thread.Sleep(5);
}
}
}
我的想法是只在我想从C#程序发送并立即关闭它时打开一个连接,但实际上需要同一个COM端口监听来自基于PIC的微控制器的通信。目前我们遇到的问题是以前程序从不尝试关闭连接(与上面的代码不同),但有时基于PIC的微控制器的接收部分工作,但程序的发送部分不起作用。这只会在某个时候发生,因为通常程序工作正常......
重新启动系统似乎重置了这个OK。所以我在考虑制作上面的代码对我的情况有帮助(能够发送,并在同一个COM端口上监听)?
答案 0 :(得分:0)
不幸的是,没有。一次只能打开1个与COM端口的连接。
如果您有设备正在侦听该端口,那么其他任何设备都无法发送。
如果您可以访问微控制器用于在设备上侦听的代码,您可以随时编写一些内容,允许您向微控制器发送消息并让该设备发送COM消息。
否则,您唯一能做的就是让微控制器停止监听端口,从代码发送消息,接收发送消息后发出的任何响应,然后重新启用微控制器的监听功能。
修改强>
只是关于代码的说明。 using语句旨在在超出范围时关闭所有连接后处置对象。
在您的代码中,您将在 using block 中创建对串行端口实例的引用。如果按照定义工作,则需要先实例化串口实例,然后才能再次调用它。
答案 1 :(得分:0)
作为jp2code答案的补充,由于想象力是极限,你可能想要尝试更多"开箱即用"解决方案,类似于 Man-In-The-Middle 。
THIS POST可能会让您更好地了解我所谈论的内容。
答案 2 :(得分:0)
端口关闭时,您无法在串口上进行通信或侦听。 所以你写的代码是完全错误的。
理想情况下,您不应关闭COM端口。
以下可能是您的通讯失败的原因。
1.这个似乎是最可能的答案:如果在前一次运行中COM端口未正确关闭,则不会进行通信。在这种情况下,您必须重置系统。当系统崩溃时会发生这种情况。
当连接器不紧时,可能会发生这种情况。
检查接地连接是否正确。
如果您需要帮助更改代码,请与我们联系。