如何在 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);