C#串口通信与Putty响应不一致问题求助
串口通信异常问题求助
我被这个问题卡了两天,求技术指导:
通过串口连接某系统时,Putty上操作完全正常:
- 发送任意命令,设备返回
命令+<00>代表成功,<21>代表错误 - 清错命令
KL首次发送返回KL<21>,再次发送必定返回KL<00>
但用C#代码发送相同命令序列时,却出现异常:
- 直接用C#连接发送
KL,始终返回KL<21> - 先在Putty中执行清错后断开,再用C#连接,首次发送
KL返回KL<00>,但后续所有命令(包括再次发送KL)都返回<21>
Putty配置、响应及C#界面见附图(原提问附图未提供),C#代码如下(忽略scale和Vacc相关逻辑,这部分运行正常):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace PortApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) { serialPort1.PortName = com.Text; serialPort1.BaudRate = int.Parse(baud.Text); serialPort1.DataBits = int.Parse(databit.Text); // Parity if (parity.Text.ToLower() == "n") { serialPort1.Parity = System.IO.Ports.Parity.None; } else if (parity.Text.ToLower() == "o") { serialPort1.Parity = System.IO.Ports.Parity.Odd; } else if (parity.Text.ToLower() == "e") { serialPort1.Parity = System.IO.Ports.Parity.Even; } else if (parity.Text.ToLower() == "m") { serialPort1.Parity = System.IO.Ports.Parity.Mark; } else if (parity.Text.ToLower() == "s") { serialPort1.Parity = System.IO.Ports.Parity.Space; } // StopBits if (stopbit.Text.ToLower() == "n") { serialPort1.StopBits = System.IO.Ports.StopBits.None; } else if (stopbit.Text.ToLower() == "1") { serialPort1.StopBits = System.IO.Ports.StopBits.One; } else if (stopbit.Text.ToLower() == "1.5") { serialPort1.StopBits = System.IO.Ports.StopBits.OnePointFive; } else if (stopbit.Text.ToLower() == "2") { serialPort1.StopBits = System.IO.Ports.StopBits.Two; } // FlowControl if (flowcontrol.Text.ToLower() == "n") { serialPort1.Handshake = Handshake.None; serialPort1.RtsEnable = true; serialPort1.DtrEnable = true; } else if (flowcontrol.Text.ToLower() == "h") { serialPort1.Handshake = Handshake.RequestToSend; } else if (flowcontrol.Text.ToLower() == "xonxoff") { serialPort1.Handshake = Handshake.XOnXOff; } else if (flowcontrol.Text.ToLower() == "hxonxoff") { serialPort1.Handshake = Handshake.RequestToSendXOnXOff; } // connect // Set the read/write timeouts serialPort1.ReadTimeout = 500; serialPort1.WriteTimeout = 1000; try { serialPort1.Open(); textBox2.Text += "\r\n=================="; textBox2.Text += "\r\nPort Opened"; } catch { Debug.Print(DateTime.Now.ToString("dd/MM/yy HH:mm:ss: ") + "Com port failed to open."); } } else { textBox2.Text += "\r\n=================="; textBox2.Text += "\r\nPort already Open"; } } private void button2_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) { textBox2.Text += "\r\n=================="; textBox2.Text += "\r\nPort not Open"; } else { serialPort1.Write(this.textBox1.Text+"\r\n"); var data = ""; var counter = 20; while (data == "" && counter > 0) { try { counter -= 1; data = serialPort1.ReadLine(); Console.Write(".'"+data+"'\n"); //Thread.Sleep(1000); textBox2.Text += "\r\n" + textBox1.Text; textBox2.Text += "\r\n: '" + data+"'"; textBox1.Text = ""; } catch(Exception ex) { Debug.Print(DateTime.Now.ToString("dd/MM/yy HH:mm:ss: ") + "Exception1:::: " + ex.Message); Console.Write(">X>'" + ex.Message + "'\n"); } } try { data = serialPort1.ReadLine(); Console.Write(">'" + data + "'\n"); textBox2.Text += "\r\n:: '" + data + "'"; } catch (Exception ex) { Debug.Print(DateTime.Now.ToString("dd/MM/yy HH:mm:ss: ") + "Exception2:::: " + ex.Message); Console.Write(">XX>'" + ex.Message + "'\n"); } } } private void disconnect_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) { textBox2.Text += "\r\n=================="; textBox2.Text += "\r\nPort not Open"; } else { Console.Write("Port Closed\n"); textBox2.Text += "\r\nPort Closed"; serialPort1.DiscardInBuffer(); serialPort1.DiscardOutBuffer(); serialPort1.Dispose(); serialPort1.Close(); } } private void robot_Click(object sender, EventArgs e) { com.Text = "COM3"; baud.Text = "9600"; databit.Text = "8"; parity.Text = "o"; stopbit.Text = "1"; flowcontrol.Text = "N"; } private void scale_Click(object sender, EventArgs e) { com.Text = "COM4"; baud.Text = "9600"; databit.Text = "7"; parity.Text = "o"; stopbit.Text = "1"; flowcontrol.Text = "N"; } private void vacc_Click(object sender, EventArgs e) { com.Text = "COM6"; baud.Text = "9600"; databit.Text = "8"; parity.Text = "n"; stopbit.Text = "1"; flowcontrol.Text = "N"; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); } } } }
内容的提问来源于stack exchange,提问作者S4nd33p
相关产品推荐
相关产品推荐

