如何在 C# 中复制 Tera Term SerialPort 命令?
How to replicate Tera Term SerialPort command in C#?
在 Tera Term 中,我通过 USB 连接到串行设备(在启动时 select 单选按钮 "serial" 和正确的端口)。连接后,我只将默认速度更改为 115200(在设置 => 串行端口中)。
在此之后,tera term 要求我填写如下命令:
命令>
我填写设备特定命令。在这种情况下,它是 "PC" 并且我收到了预期的响应,即。 "ABC"
现在我正尝试在 C# 中做同样的事情。不幸的是,我得到的响应总是与我实际输入的命令相同。
所以如果我输入 "PC",响应是 "PC",但我期望 "ABC"。其他命令也有同样的问题。命令 ”?”用“?”回应而我预计 "CBA".
如果我输入错误的命令 => 然后我会收到消息 "Unknown command"
所以我怀疑设备实际上得到了正确的命令。
我正在使用以下代码:
SerialPort COMport = new SerialPort(Port_Name, Baud_Rate); //Create a new SerialPort Object (defaullt setting -> 8N1)
COMport.DataReceived += new SerialDataReceivedEventHandler(sPort_dataReceived);
COMport.ErrorReceived += new SerialErrorReceivedEventHandler(sPort_ErrorReceived);
COMport.BaudRate = 115200;
COMport.Parity = Parity.None;
COMport.DataBits = 8;
COMport.StopBits = StopBits.One;
COMport.RtsEnable = true;
COMport.Handshake = Handshake.None;
COMport.Open();
COMport.WriteLine(Data);
Thread.Sleep(1000); // Just discovered after a lot of testing that this is necessary to read the response before the Comport closes
COMport.Close();
然后我执行以下操作:
private void sPort_dataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
MessageBox.Show(indata);
}
我尝试过不同的方法,但我无法让它工作。希望这是因为我是新手。我以前从未使用过 Tera term。
提前致谢,
我尝试过的一些(但绝对不是全部)事情:
尝试了这些人的建议和代码:https://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
从这里下载并尝试:https://www.xanthium.in/building-opensource-gui-based-serial-port-communication-program-dot-net-framework-and-arduino#simple-serial-source-code(虽然我的设备不是 arduino)
试图添加“\r\n”:C# Errors with SerialPort WriteLine commands
编辑编辑编辑编辑
所以我发现了更多。如果我使用以下代码(Write 而不是 WriteLine),我确实会得到很好的结果,但不是每次都这样:
现在发送完整命令:"Command>PC"
string Command1 = txtCommand.Text;
Command1 = Command1 + "\r\n";
string CommandSent;
int Length, j = 0;
Length = Command1.Length;
for (int i = 0; i < Length; i++)
{
CommandSent = Command1.Substring(j, 1);
ComPort.Write(CommandSent);
j++;
}
第一次,现在效果不错。第二次得到"Unknow Command",第3次=>好结果,第4次="Unknown Command"...等...
它似乎总是工作 1 次好,然后 1 次不行。
我只有切换命令格式才能让它始终如一地工作:
第一次命令:"Command>PC"
第二次命令:"PC"
第三次命令:"Command>PC"
第四次命令:"PC"
等...
我已经尝试过在发送前清除缓冲区,但没有效果。
ComPort.DiscardInBuffer();
ComPort.DiscardOutBuffer();
换行符似乎有问题。
我需要使用 Comport.Write(而不是 WriteLine)。然后我还需要附加一个回车 return "\r" 但没有像我以前想的那样换行 '\n' 。 (传入数据在 "Command>" 之后显示换行符,因此无法发送另一个有意义的命令 => 原因是 '\n' => 删除它解决了问题)
这是我当前的代码,似乎可以工作(我不再需要附加 "Command>",只需按原样发送命令):
if (thecommand == "")
{
ComPort.Write("\r"); //start from a clean slate
return;
}
ComPort.DiscardInBuffer();
ComPort.DiscardOutBuffer();
string Command1 = thecommand + "\r";
ComPort.Write(Command1);
在 Tera Term 中,我通过 USB 连接到串行设备(在启动时 select 单选按钮 "serial" 和正确的端口)。连接后,我只将默认速度更改为 115200(在设置 => 串行端口中)。
在此之后,tera term 要求我填写如下命令:
命令>
我填写设备特定命令。在这种情况下,它是 "PC" 并且我收到了预期的响应,即。 "ABC"
现在我正尝试在 C# 中做同样的事情。不幸的是,我得到的响应总是与我实际输入的命令相同。
所以如果我输入 "PC",响应是 "PC",但我期望 "ABC"。其他命令也有同样的问题。命令 ”?”用“?”回应而我预计 "CBA".
如果我输入错误的命令 => 然后我会收到消息 "Unknown command" 所以我怀疑设备实际上得到了正确的命令。
我正在使用以下代码:
SerialPort COMport = new SerialPort(Port_Name, Baud_Rate); //Create a new SerialPort Object (defaullt setting -> 8N1)
COMport.DataReceived += new SerialDataReceivedEventHandler(sPort_dataReceived);
COMport.ErrorReceived += new SerialErrorReceivedEventHandler(sPort_ErrorReceived);
COMport.BaudRate = 115200;
COMport.Parity = Parity.None;
COMport.DataBits = 8;
COMport.StopBits = StopBits.One;
COMport.RtsEnable = true;
COMport.Handshake = Handshake.None;
COMport.Open();
COMport.WriteLine(Data);
Thread.Sleep(1000); // Just discovered after a lot of testing that this is necessary to read the response before the Comport closes
COMport.Close();
然后我执行以下操作:
private void sPort_dataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
MessageBox.Show(indata);
}
我尝试过不同的方法,但我无法让它工作。希望这是因为我是新手。我以前从未使用过 Tera term。
提前致谢,
我尝试过的一些(但绝对不是全部)事情:
尝试了这些人的建议和代码:https://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport
从这里下载并尝试:https://www.xanthium.in/building-opensource-gui-based-serial-port-communication-program-dot-net-framework-and-arduino#simple-serial-source-code(虽然我的设备不是 arduino)
试图添加“\r\n”:C# Errors with SerialPort WriteLine commands
编辑编辑编辑编辑
所以我发现了更多。如果我使用以下代码(Write 而不是 WriteLine),我确实会得到很好的结果,但不是每次都这样:
现在发送完整命令:"Command>PC"
string Command1 = txtCommand.Text;
Command1 = Command1 + "\r\n";
string CommandSent;
int Length, j = 0;
Length = Command1.Length;
for (int i = 0; i < Length; i++)
{
CommandSent = Command1.Substring(j, 1);
ComPort.Write(CommandSent);
j++;
}
第一次,现在效果不错。第二次得到"Unknow Command",第3次=>好结果,第4次="Unknown Command"...等... 它似乎总是工作 1 次好,然后 1 次不行。
我只有切换命令格式才能让它始终如一地工作:
第一次命令:"Command>PC"
第二次命令:"PC"
第三次命令:"Command>PC"
第四次命令:"PC"
等...
我已经尝试过在发送前清除缓冲区,但没有效果。
ComPort.DiscardInBuffer();
ComPort.DiscardOutBuffer();
换行符似乎有问题。
我需要使用 Comport.Write(而不是 WriteLine)。然后我还需要附加一个回车 return "\r" 但没有像我以前想的那样换行 '\n' 。 (传入数据在 "Command>" 之后显示换行符,因此无法发送另一个有意义的命令 => 原因是 '\n' => 删除它解决了问题)
这是我当前的代码,似乎可以工作(我不再需要附加 "Command>",只需按原样发送命令):
if (thecommand == "")
{
ComPort.Write("\r"); //start from a clean slate
return;
}
ComPort.DiscardInBuffer();
ComPort.DiscardOutBuffer();
string Command1 = thecommand + "\r";
ComPort.Write(Command1);