在 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();