C# 串行端口未禁用
我有一个串口在等待来自外部秤的重量字符串。问题是,对于正在称重的同一产品,电子秤发送多个读数,大约每秒8个读数,所有读数的重量都相同。收到重量后,我必须打印标签,但由于我获得了多个读数,因此每次收到读数时,它都会打印标签 我尝试了以下解决方案,并对前两个产品进行称重,然后再次触发多个打印C# 串行端口未禁用,c#,visual-studio-2010,serial-port,C#,Visual Studio 2010,Serial Port,我有一个串口在等待来自外部秤的重量字符串。问题是,对于正在称重的同一产品,电子秤发送多个读数,大约每秒8个读数,所有读数的重量都相同。收到重量后,我必须打印标签,但由于我获得了多个读数,因此每次收到读数时,它都会打印标签 我尝试了以下解决方案,并对前两个产品进行称重,然后再次触发多个打印 private void SerialReader_Event(object sender, SerialDataReceivedEventArgs e) { string dataRe
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事件
我做错了什么?就我个人而言,我不会费心去删除这些事件。我会让事件触发并找到一种过滤数据的方法
我对你们的硬件不太了解,但当重量大于零时,每次读数从不稳定变为稳定时,也许你们可以打印一个标签?或者在收到两个具有相同权重的稳定值时打印标签,然后忽略相同值的后续权重。一旦某个值稳定,您就可以对接收到的所有值取平均值,并在读数不稳定或偏离某个边距时打印标签。每当调用RemoveReceiveDeventhadler时,我都会启动计时器。只有在发生变化时才打印新数据。您无法确保这一点的可靠性。删除事件处理程序的问题只是在实践中出错的一个预兆,没有任何可靠的方法使程序与包流保持同步。您需要与工厂工程师交谈,需要某种机制来可靠地检测进入秤的包装。可能来自控制输送机的PLC,可能需要一个光电探测器等。我有一个非常敏感的秤类似的问题,读数将由路过的人(或打喷嚏!)产生的微风触发。我建立了一个机制来忽略前一个读数的+/-阈值的读数(我想你们已经尝试过了,或者你们只是使用了n以上的权重?),然后就开始了。但不清楚你的秤是否每秒只发送8个读数,而不管它是否认为重量已经改变。我得到多个读数,不管数值是否改变。我试图通过检查稳定重量(0)来消除+读数,但即使重量稳定,我也会得到多个读数,秤会不断发送数据。仅当重量超过n时才应进行打印。如何检测DataReceived事件何时完成接收数据以计算平均值并打印?我可以在一定的秒数(称重过程的持续时间)后启动计时器进行此计算,但这听起来不是一个合适的解决方案。如果不提供更多信息,我认为您不会得到合适的解决方案。你能用天平发出的测量两个项目的完整信息序列更新你的问题吗?通过查看该序列,您/我们应该能够确定一些合适的过滤。我建议将逻辑转换为接收所有数据,然后使用正确的过滤来识别单个项目的称重时间。如果我理解正确,我应该首先接收所有读数,然后应用过滤。我可能只保留所有读数,并接受所有读数的第一个稳定权重。听起来不错,就是这样。我把它想象成一个长长的读数流,属于多重项目的称重。然后,您可以使用过滤功能来区分不同物品的重量。您是否需要一种方法来识别该流中的一组值属于单个项。然后你可以选择使用第一个值,所有值的平均值,或者你能想到的任何其他值。