You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:37:07