c# - 从串口读取 C#
问题描述
我有随机从串口读取代码,我想在特定位置获取特定数据,但是端口连续逐行发送数据,就像那样
H91F O69F S124F D-1F H94F O70F S119F D-2F H95F O69F S119F D0F H90F O70F S122F D2F H91F O69F S123F D3F H93F O69F S122F D5F H94F O71F S122F D2F H92F O69F S120F D1F H92F O69F S121F D1F H91F O69F S122F D1F H91F O70F S120F D-2F H95F O73F S121F D-4F H90F O69F S124F D-2F H94F O72F S123F D-3F H90F O70F S119F D-5F H94F O72F S122F D-6F H95F O69F S122F D-9F H90F O69F S123F D-11F
H
从到最后一行一行发送F
H91F O69F S124F D-1F
然后另一行H94F O70F S119F D-2F
我需要获取每个字母之间的数字,例如 between H
andF
和 between O
and F
,数字
SerialPort serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
serialPort.Open();
string datasize = serialPort.ReadTo("D");
string firstdata = "";
firstdata = serialPort.ReadExisting();
string data = "";
int firsth = 0;
int firstd = 0;
int lastf = 0;
firsth = firstdata.IndexOf("H");
firstd = firstdata.IndexOf("D" , startIndex: firsth);
lastf = firstdata.IndexOf("F" , startIndex: firstd);
data = firstdata.Substring(firsth, lastf + 1);
// MessageBox.Show(data);
int h = data.IndexOf("H");
int firstF = data.IndexOf("F" , startIndex: h);
string hdata = data.Substring(h + 1, firstF - h - 1);
// string hstring = Regex.Match(hdata, @"\d+").Value;
PulseBox.Text = hdata;
int o = data.IndexOf("O");
int secondF = data.IndexOf("F", startIndex: o);
string odata = data.Substring(o + 1, secondF - o - 1);
// string ostring = Regex.Match(odata, @"\d+").Value;
OxyBox.Text = odata;
int s = data.IndexOf("S");
int thirdF = data.IndexOf("F" , startIndex: s);
string sdata = data.Substring(s + 1, thirdF - s - 1);
// string sstring = Regex.Match(sdata, @"\d+").Value;
SystolicPressure.Text = sdata;
int d = data.IndexOf("D");
int fourthF = data.IndexOf("F", startIndex: d);
string ddata = data.Substring(d + 1, fourthF - d - 1);
// string dstring = Regex.Match(data, @"\d+").Value;
DiastolicPressure.Text = ddata;
解决方案
在处理固定模式时,您应该使用正则表达式(请参阅https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference以获取参考到正则表达式)。在您的情况下,这将是:
var regex = new Regex(@"H(?<H>[\-\d]+)F O(?<O>[\-\d]+)F S(?<S>[\-\d]+)F D(?<D>[\-\d]+)F");
var input = serialPort.ReadExisting(); // e.g. "H91F O69F S124F D-1F H94F O70F S119F D-2F H95F O69F S119F D0F H90F O70F S122F D2F H91F O69F S123F D3F H93F O69F S122F D5F H94F O71F S122F D2F H92F O69F S120F D1F H92F O69F S121F D1F H91F O69F S122F D1F H91F O70F S120F D-2F H95F O73F S121F D-4F H90F O69F S124F D-2F H94F O72F S123F D-3F H90F O70F S119F D-5F H94F O72F S122F D-6F H95F O69F S122F D-9F H90F O69F S123F D-11F";
如果您随后将此正则表达式应用于您的输入,它将返回所有匹配项:
var matches = regex.Matches(input);
foreach (Match match in matches)
{
// match.Value will be your complete match, e.g. "H91F O69F S124F D-1F"
// match.Groups["H"].Value will contain the value for H, e.g. "91"
// match.Groups["O"].Value will contain the value for O, e.g. "69"
// match.Groups["S"].Value will contain the value for S, e.g. "124"
// match.Groups["D"].Value will contain the value for D, e.g. "-1"
}
推荐阅读
- react-redux - 关于 react-redux 文档的问题
- python - 如何使用 python 让 ubuntu 操作系统进入睡眠状态?
- node.js - 存储和查询具有多个相关实体的 PostgreSQL 数据库实体?
- postgresql - 结合两个整数值生成月份和出生年份,用“/”分隔
- css - 如何覆盖基础小、中、大断点值?
- angular - 如何从过滤器内的输入中获取值
- django - Django 嵌套 ManyToManyField 对象计数查询
- dymo - DYMO 打印标签文本被截断
- hash - OpenSSL 消息摘要创建
- tensorflow - 如何使用张量流抓斗器?