如何用C#控制台程序向RS232串口发指令与SAS扩展卡固件交互?
问题排查
- 发送的回车指令错误:当前代码发送的是字符串
"Enter",但实际按下键盘回车对应的是串口发送控制字符换行+回车(\r\n),设备无法识别Enter字符串,自然不会返回响应。 - 接收事件注册时机错误:你在打开串口、发送数据之后才注册
DataReceived事件,发送指令后返回的响应触发事件时,事件还没有绑定完成,会导致响应丢失。 - 未发送后续业务指令:只发送了错误的回车模拟内容,没有按照流程发送
sys指令,也拿不到对应业务返回。 - 未指定串口编码:
SerialPort默认编码不是ASCII,部分串口设备对非ASCII编码的内容识别会出错。
修复方案
修正后的代码
using System; using System.IO.Ports; using System.Text; namespace SerialPortExample { class SerialPortProgram { [STAThread] static void Main() { SerialPort mySerialPort = new SerialPort("COM5"); // 基础串口参数配置,和PuTTY保持一致 mySerialPort.BaudRate = 115200; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.RtsEnable = true; mySerialPort.DtrEnable = true; mySerialPort.ReadTimeout = 2000; mySerialPort.WriteTimeout = 1000; // 显式指定ASCII编码 mySerialPort.Encoding = Encoding.ASCII; // 先注册接收事件,再打开端口 mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); try { mySerialPort.Open(); if (mySerialPort.IsOpen) { // 发送回车:WriteLine自动追加\r\n,等价于按下回车 mySerialPort.WriteLine(""); // 等待100ms保证设备处理完回车响应 System.Threading.Thread.Sleep(100); // 发送sys指令加回车 mySerialPort.WriteLine("sys"); } } catch (Exception ex) { Console.WriteLine("串口操作出错:" + ex.Message); } Console.ReadLine(); // 程序退出前关闭串口 if (mySerialPort.IsOpen) { mySerialPort.Close(); } } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine("Data Received:"); Console.Write(indata); } } }
额外注意点
如果设备只识别单种换行符,你可以把WriteLine替换为Write("\n")或者Write("\r"),和PuTTY的换行配置保持一致即可;如果仍有响应不全的问题,可以把ReadExisting替换为循环读取直到缓冲区为空,避免分包导致的内容截断。
内容的提问来源于stack exchange,提问作者Jacky
相关产品推荐
相关产品推荐

