从串行 Mettler Toledo 数字秤读取重量

Posted

技术标签:

【中文标题】从串行 Mettler Toledo 数字秤读取重量【英文标题】:Read Weight from a Serial Mettler Toledo Digital Scale 【发布时间】:2012-03-29 02:26:47 【问题描述】:

我正在尝试从 c# 应用程序中的数字秤读取重量,发现 this 问题 这正是我想要做的 但对我来说,下面的函数永远不会运行。

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
 
this.Invoke(new EventHandler(DoUpdate)); 
 

我在设备管理器中检查了比例,它的位置设置为Port_#0004.Hub_#0003 并且似乎工作正常 我不确定秤的端口号,所以我做了

var test = SerialPort.GetPortNames();

只有COM1 被返回

【问题讨论】:

也许秤没有给你任何数据?使用 portmon 查看计算机是否正在接收任何数据。 如果你还没有,你可能需要一个驱动把USB连接变成一个虚拟的COMM端口,否则打开串口将无法连接到USB设备。编辑 SamFisher83 的观点很好,您可能需要以某种方式对其进行初始化以使其发送信息。 @SamFisher83 我正在使用 win 7 (x64) portmon,现在可以使用,还有其他选择吗? 秤收到指令后总会返回响应。响应可能是说命令未被理解或用户传递了错误的参数,但只要接收到某些内容就会返回。 如果这是 USB 连接而不是真正的串行端口连接(使用 d-sub 连接器直接连接到计算机上的物理端口),那么 COM1 可能是错误的。检查 Windows 控制面板上的设备管理器,查看 Windows 是否看到虚拟 COM 端口。如果您不确定,请将其拔下并重新插入,然后查看哪个端口消失然后重新出现。如果您没有看到任何内容,则可能是缺少驱动程序。 【参考方案1】:

我遇到了这样的问题,我解决了它在设备中将 COM 配置 (Configuration > Comunication > Conections) 更改为 SICS。我不知道您的比例模型,但也许我的代码可以提供帮助。 [Reading data from Mettler Toledo (IND560) scale device using C#]

【讨论】:

【参考方案2】:

您可以尝试轮询而不是使用 DataReceived 事件吗?另外,我相信 DataReceived 事件在触发之前有一个阈值,您可能也想研究一下。

【讨论】:

我应该轮询端口的哪个属性? 设置一个定时器来定期检查串口上的BytesToRead。然后使用 Read 读取数据。查看 MSDN 页面了解更多详情:msdn.microsoft.com/en-us/library/30swa673.aspx【参考方案3】:

你能从天平上得到序列号吗?这应该是您连接时要做的第一件事。它将让您验证连接是否已建立。如果您在通过 C# 接口连接时遇到问题,请先尝试使用超级终端。您可以非常快速地更改很多设置并拨入正确的设置以使用。虽然天平应该能够使用多种波特率和停止位等。它们通常适应性很强。但是请尝试使用超级终端。

我正在寻找 pdf,但可用命令列表很长(取决于您的型号)。 pdf 大约有 130 页。你读过这个吗?

【讨论】:

感谢您的回答 1) 是的,我已阅读 pdf,它说验证 USB 连接已建立的步骤很好 2) 超级终端在 win 7 中不可用 3) 当你说我是能够从天平中获取序列号,它就像我可以通过硬件设置访问的秤的属性吗? 序列号是您特别要求或发出重新启动命令时天平返回的响应(两个响应应该看起来相同)。这是要测试的第一件事。超出【参考方案4】:

请看this的帖子,我用Mike库连接的。

using System;
using System.Linq;
using System.Text;
using HidLibrary;

namespace MagtekCardReader

    class Program
    
        private const int VendorId = 0x0801;
        private const int ProductId = 0x0002;

        private static HidDevice _device;

        static void Main()
        
            _device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();

            if (_device != null)
            
                _device.OpenDevice();

                _device.Inserted += DeviceAttachedHandler;
                _device.Removed += DeviceRemovedHandler;

                _device.MonitorDeviceEvents = true;

                _device.ReadReport(OnReport);

                Console.WriteLine("Reader found, press any key to exit.");
                Console.ReadKey();

                _device.CloseDevice();
            
            else
            
                Console.WriteLine("Could not find reader.");
                Console.ReadKey();
            
        

        private static void OnReport(HidReport report)
        
            if (!_device.IsConnected)  return; 

            var cardData = new Data(report.Data);

            Console.WriteLine(!cardData.Error ? Encoding.ASCII.GetString(cardData.CardData) : cardData.ErrorMessage);

            _device.ReadReport(OnReport);
        

        private static void DeviceAttachedHandler()
        
            Console.WriteLine("Device attached.");
            _device.ReadReport(OnReport);
        

        private static void DeviceRemovedHandler()
        
            Console.WriteLine("Device removed.");
        
    

【讨论】:

以上是关于从串行 Mettler Toledo 数字秤读取重量的主要内容,如果未能解决你的问题,请参考以下文章

Mettler toledo IND780 通过 javascript 读取重量

C# 从串口读取数据 - 如何只获取新的/当前数据?

c#读取串口体重秤210

电子台秤功能怎么使用

在 python 中通过 RS232 到 USB 电缆读取秤数据

Linux CentOS 6 上的节点串行端口