0

在 Tera Term 中,我通过 USB 连接到串行设备(在启动时选择单选按钮“串行”和正确的端口)。连接后,我只需将默认速度更改为 115200(在设置 => 串行端口中)。

在此之后,tera term 要求我填写如下命令:

命令>

我填写设备特定的命令。在这种情况下,它是“PC”,我收到了预期的响应,即。“美国广播公司”


现在我正在尝试在 C# 中做同样的事情。不幸的是,我得到的响应总是与我实际输入的命令相同。

所以如果我输入“PC”,响应是“PC”,但我期待“ABC”。其他命令也有同样的问题。命令 ”?” 回复“?” 而我期待“CBA”。

如果我输入了错误的命令 => 然后我收到消息“未知命令”所以我怀疑设备实际上得到了正确的命令。

我正在使用以下代码:

        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 术语。

提前致谢,

我尝试过的一些(但肯定不是全部)事情:

试过这个家伙的建议和代码: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++;
        }

第一次,现在我得到了很好的结果。我第二次得到“未知命令”,第三次 => 好结果,第四次 =“未知命令”......等等......它似乎总是工作 1 次,然后 1 次不行。

如果我切换命令格式,我只能让它始终如一地工作:

第一次命令:“命令>PC”

第二次命令:“PC”

第三次命令:“命令>PC”

第四次命令:“PC”

ETC...

我已经尝试在发送之前清除缓冲区,但没有效果。

        ComPort.DiscardInBuffer();
        ComPort.DiscardOutBuffer();
4

1 回答 1

0

换行符似乎是个问题。

我需要使用 Comport.Write(而不是 WriteLine)。然后我还需要附加一个回车符 "\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);
于 2019-08-26T12:05:25.950 回答