c# - 如何向 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
.
解决方案
您正在发送字符串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\r
or sys\r
。
(您目前收到Enter
回复作为回复,因为这是您发送的内容,并且卡片会回显任何传入的字符,因此它可以像外壳一样使用而无需盲打。目前还没有其他回复,因为从卡片的角度来看,您基本上开始输入(无效)命令Enter
,但尚未与⏎ Enter密钥一起提交。)
另外,我建议在发送任何数据之前为接收到的数据添加事件侦听器,否则会出现竞争条件,在这种情况下,卡可能会在您设置侦听器之前做出响应,并且您会丢失部分数据。
附加说明:DataRecieved
在您的情况下甚至可能不希望使用该事件。
根据文档:
不保证每个接收到的字节都会引发 DataReceived 事件。使用该
BytesToRead
属性来确定缓冲区中还有多少数据要读取。
这意味着如果还没有发送足够的数据,您的DataReceived
事件甚至可能根本不会触发(它可能会在一段时间后立即触发所有数据) - 但如果您在此之前退出程序,您将永远不会看到.
正如这里所建议的(强调我的):
这是我的一般方法:
对流数据使用事件驱动 (DataReceived) 代码。也就是说,数据是定期交付的,没有来自您的应用程序的特定关联命令。
对命令/响应协议使用轮询。 这些可能涉及您创建的要轮询的线程,但更常见的是简单的循环,这些循环可能会或可能不会阻塞其他操作,直到它们完成。
因此,建议改用其中一种Read
方法(请参阅文档)。还有你可能会觉得有用的ReadTo
。ReadLine
例如,您可以选择使用ReadTo(" bp1 >")
。
推荐阅读
- python - 与 sklearn.metrics.confusion_matrix 相比,为什么 tf.keras.models.Sequential 在评估()之后给出不同的准确度?
- time-series - 绘制 SVD 分量会产生锥形形状
- excel - 从 Excel 中的别名列表中获取主名称
- c# - 使用 Gmail API 转发电子邮件
- c++ - 在 Rcpp 中动态添加行
- angular - Angular 从 REST API 获取图片并显示
- sql - 该请求未通过验证基础。我不知道还能做什么((
- python - 通过 ANT 构建脚本的 Python unittest 获取 ImportError
- javascript - Mouseout,仅向上垂直移动
- wordpress - 如何打开一个wordpress网站?