我有一个串口等待来自外部秤的一些重量字符串。问题在于,对于被称重的相同产品,秤发送多个读数,大约每秒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事件。
我在这里做错了什么?
答案 0 :(得分:1)
就我个人而言,我不会想要删除这些事件。我让事件触发并找到过滤数据的方法。
我对你的硬件知之甚少,但是当重量大于零时,每次读数从不稳定到稳定时,你都可以打印一个标签?或者在收到几个具有相同权重的稳定值时打印标签,然后忽略相同值的后续权重。一旦值稳定,您可以平均所有收到的值,并在读数变得不稳定或偏离一定幅度时打印标签。