首页 > 解决方案 > 如何向 RS232 串口发送命令?

问题描述

我最近得到了一张 sas 扩展卡。

给我卡的人说:

它在芯片上有一个固件,它可以显示传感器的温度。

他要我开发一个C# Console app执行固件。

我不知道固件源代码长什么样。

但它可以执行PuTTy,它的连接是通过RS232串行端口。

PuTTy连接设置:

在此处输入图像描述

在此处输入图像描述

单击后Open,按Enter并键入命令sys

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我在 C# 代码中尝试的内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Threading;


namespace SerialPortExample
{
    class SerialPortProgram
    {
        // Create the serial port with basic settings
        [STAThread]
        static void Main()
        {
           
           
            SerialPort mySerialPort = new SerialPort("COM5");

            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;
            mySerialPort.Open();
            if(mySerialPort.IsOpen)
            { 
                string str= "Enter";
                mySerialPort.Write(str);
 
            }
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            
            Console.ReadLine();
            
        }
        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
            Console.Write(indata);
        }


    }
}

我的代码执行什么:

在此处输入图像描述

我的代码有什么问题?

我怎样才能通过固件执行固件RS232并进行交互PuTTy

我的控制台应用程序正在使用.Net Framework 4.7.2.

标签: c#consoleserial-portfirmware.net-framework-4.8

解决方案


您正在发送字符串Enter(例如键入⇧</kbd>E, N, T, E, R). You should probably send the ⏎ Enter key, which is represented on a terminal with the ASCII code 13, i.e. \r in a C# string.

此外,您还没有发送任何实际命令。尝试类似的东西counters\ror sys\r

(您目前收到Enter回复作为回复,因为这是您发送的内容,并且卡片会回显任何传入的字符,因此它可以像外壳一样使用而无需盲打。目前还没有其他回复,因为从卡片的角度来看,您基本上开始输入(无效)命令Enter,但尚未与⏎ Enter密钥一起提交。)

另外,我建议在发送任何数据之前为接收到的数据添加事件侦听器,否则会出现竞争条件,在这种情况下,卡可能会在您设置侦听器之前做出响应,并且您会丢失部分数据。


附加说明:DataRecieved在您的情况下甚至可能不希望使用该事件。

根据文档

不保证每个接收到的字节都会引发 DataReceived 事件。使用该BytesToRead属性来确定缓冲区中还有多少数据要读取。

这意味着如果还没有发送足够的数据,您的DataReceived事件甚至可能根本不会触发(它可能会在一段时间后立即触发所有数据) - 但如果您在此之前退出程序,您将永远不会看到.

正如这里所建议的(强调我的):

这是我的一般方法:

对流数据使用事件驱动 (DataReceived) 代码。也就是说,数据是定期交付的,没有来自您的应用程序的特定关联命令。

对命令/响应协议使用轮询。 这些可能涉及您创建的要轮询的线程,但更常见的是简单的循环,这些循环可能会或可能不会阻塞其他操作,直到它们完成。

因此,建议改用其中一种Read方法(请参阅文档)。还有你可能会觉得有用的ReadToReadLine例如,您可以选择使用ReadTo(" bp1 >")


推荐阅读