串口未禁用
本文关键字:串口 | 更新日期: 2023-09-27 18:16:35
我有一个串行端口等待一些重量字符串从外部秤。问题是,秤发送多个读数,大约每秒8个读数,所有这些读数都是相同的重量,对于相同的产品被称重。我必须在收到重量后打印一个标签,但由于我有多个读数,因此它会在收到每个读数时打印一个标签。
我尝试了下面的解决方案,对前两个被称重的产品有效,然后再次触发多次打印。
private void SerialReader_Event(object sender, SerialDataReceivedEventArgs e)
{
string dataRead = String.Empty;
try
{
SerialPort port = (SerialPort)sender;
if (port.IsOpen)
{
dataRead = port.ReadExisting();
}
portDataRead = new DataRead(HandlePortReadData);
this.Invoke(portDataRead, new object[] { dataRead });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Reading Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void HandlePortReadData(string dataRead)
{
int parsedValue;
if (!String.IsNullOrEmpty(dataRead))
{
var stability = dataRead.Substring(1, 1);
var weight = dataRead.Substring(2, 5);
if (stability == "0") //0 is a Stable wieght
{
this.RemoveReceivedEventHandler();
var parsedSuccess = int.TryParse(weight, out parsedValue);
if (parsedSuccess)
{
if (parsedValue > _weightTrigger) //only trigger print if weight is greater than (n) weight
{
if (!this.IsDisposed)
{
AddWeight(parsedValue);
PerformPrint();
}
}
}
}
}
}
private void RemoveReceivedEventHandler()
{
//remove event
sp.DataReceived -= SerialReader_Event;
System.Threading.Thread.Sleep(1000);
sp.DiscardInBuffer();
sp.DiscardOutBuffer();
_timer.Enabled = true;
_timer.Interval = _weighingDelay;
_timer.AutoReset = false;
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Tick);
_timer.Start();
}
void _timer_Tick(object sender, EventArgs e)
{
this.AddReceivedEventHandler();
}
private void AddReceivedEventHandler()
{
if (sp != null)
{
sp.DataReceived += SerialReader_Event;
sp.DiscardInBuffer();
}
//InitialiseSerialPort();
if (_timer != null)
{
_timer.Stop();
_timer.Enabled = false;
}
}
可以看到,当我删除DataReceived事件时,我启动一个计时器,几秒钟后,应该再次添加DataReceived事件。
我在这里做错了什么?
我个人不会费心尝试删除事件。我将让事件触发并找到一种方法来过滤数据。
我不太了解你的硬件,但也许你可以打印一个标签,每次读数从不稳定到稳定,当重量大于零?或者在接收到两个具有相同权重的稳定值时打印一个标签,然后忽略相同值的后续权重。一旦一个值是稳定的,你可以平均你收到的所有值,并打印标签一旦读数不稳定或偏离了一定的边距。