USB -> To Serial -> To USB -> "Com4" 然后我关注了MSDN SerialP-6ren">
gpt4 book ai didi

c# - 同一台 Windows 机器上的串行端口通信无法正常工作

转载 作者:太空狗 更新时间:2023-10-29 21:12:06 24 4
gpt4 key购买 nike

打扰一下,快速提问:

我有这个硬件设置:

Same machine: "Com3" -> USB -> To Serial -> To USB -> "Com4"

然后我关注了MSDN SerialPort ClassMSDN SerialPort.ReadLine()建立这个例程:

SerialPort SendSerialPort = new SerialPort("Com3", 9600);
SerialPort ReceiveSerialPort = new SerialPort("Com4", 9600);

SendSerialPort.Open();
ReceiveSerialPort.Open();

SendSerialPort.WriteLine("Test");
var message = ReceiveSerialPort.ReadLine(); // control stops here

SendSerialPort.Close();
ReceiveSerialPort.Close();

Console.WriteLine(message);

但是,当我倾向于 ReadLine() 时,我的控件会停止并等待。我原本没想到。

我希望收到字符串 Test 并将其分配给我的 var message。你能告诉我我在这里做错了什么吗?

编辑:

我使用 Serial Port Utility Application 测试了我的硬件和 it worked just fine .

最佳答案

我修改了from the example you linked :

要让两个端口都运行来回读写,您实际上需要为两者实现读写线程。

使用计时器可能是个好主意。

public static void Main()
{
SerialPort SendSerialPort = new SerialPort("Com3", 9600);
SerialPort ReceiveSerialPort = new SerialPort("Com4", 9600);

StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Read);

// Set the read/write timeouts
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;

SendSerialPort.Open();
ReceiveSerialPort.Open();
bool _continue = true;
readThread.Start();

Console.Write("Name: ");
name = Console.ReadLine();

Console.WriteLine("Type QUIT to exit");

while (_continue)
{
message = Console.ReadLine();

if (stringComparer.Equals("quit", message))
_continue = false;
else
SendSerialPort.WriteLine(String.Format("<{0}>: {1}", name, message));
}
readThread.Join();
SendSerialPort.Close();
}

public static void Read()
{
while (_continue)
{
try
{
string message = ReceiveSerialPort.ReadLine();
Console.WriteLine(message);
}
catch (TimeoutException) { }
}
}

通常在写入的数据中会有一个开始值和结束值来告诉其他端口消息已完成,并且还让端口验证它们正在读取它们应该读取的数据,通常带有指示如何处理的命令那个数据。 (超出此问题的范围)。

同样缺乏但重要的是你的端口的初始化。

我更喜欢使用默认构造函数(仅偏好)

SerialPort Constructor ()

然后像这样设置任何值:

_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
_serialPort.Parity = SetPortParity(_serialPort.Parity);
_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
_serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
_serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);

所有的构造函数都会给出这些值:

This constructor uses default property values when none are specified. For example, the DataBits property defaults to 8, the Parity property defaults to the None enumeration value, the StopBits property defaults to 1, and a default port name of COM1.

甚至握手也有默认值。如果你look at the source code .

private const Handshake defaultHandshake = Handshake.None;

关于c# - 同一台 Windows 机器上的串行端口通信无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39294081/

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