C# “串行端口返回”\0“;

C# “串行端口返回”\0“;,c#,serial-port,C#,Serial Port,我正在尝试使用串行端口与工业称重桥通信。我知道如何编写代码(c#)。问题是,当我将桥接器连接到指示器时,会显示重量。但是,当我将网桥连接到电脑并运行程序时,返回的所有内容都是“\0”(NULL)。当我将电脑连接到指示灯并运行程序时,我会得到连续的“\0”。我使用的是xk3190-a9指示器。这是一个示例程序 namespace SerialPort { class Program { private static string dev = "";

我正在尝试使用串行端口与工业称重桥通信。我知道如何编写代码(c#)。问题是,当我将桥接器连接到指示器时,会显示重量。但是,当我将网桥连接到电脑并运行程序时,返回的所有内容都是“\0”(NULL)。当我将电脑连接到指示灯并运行程序时,我会得到连续的“\0”。我使用的是xk3190-a9指示器。这是一个示例程序

namespace SerialPort
{
    class Program
    {
        private static string dev = "";
        static void Main(string[] args)
        {
            System.IO.Ports.SerialPort mySerialPort = new System.IO.Ports.SerialPort("COM15")
            {
                BaudRate = 2400,
                Parity = Parity.None,
                StopBits = StopBits.Two,
                DataBits = 8,
                RtsEnable = true,
            };
            mySerialPort.DataReceived += DataReceivedHandler;
            mySerialPort.Open();
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
            mySerialPort.Close();
        }    
        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            System.IO.Ports.SerialPort sp = (System.IO.Ports.SerialPort) sender;
            dev += sp.ReadExisting();
                Console.WriteLine(dev);
        }
    }
}

我的问题是,桥梁是否需要“特殊”命令来发回重量,或者我可以做些什么来获得重量。来自该端口的任何其他数据都将被删除。我还尝试了不同的端口设置,结果都是一样的。

在网上搜索后,没有找到适合我情况的解决方案,我放弃了数字追逐,咨询了一位称重桥“专家”。如果你也在拔头发,这里有几件事需要注意:

  • 大多数称重桥(卡车和车辆)将重量作为模拟信号发送。因此,即使它们有一个串行端口,您的计算机也肯定不会“获取”,因此返回\0
  • 要让你的软件有任何分量,你必须通过一个指示器,它的主板上有转换器,可以读取模拟信号并将其转换为数字信号
  • 正如指示器所得到的,其中一些具有非常低的波特率,并且速率可能被设置为一个奇怪的数字(参见4),因此您可能希望尝试从低至100到9600。在我的例子中,波特率是600,我从未尝试过,因此连续\0
  • 知道如何配置您的指示器-使用指示器编号进行简单的谷歌搜索应该会产生一本好的英语手册,一开始可能会让人困惑,但这是您能够更改波特率(以及其他设置)并避免所有猜测的唯一方法
  • 简单指示器返回的总重量很轻,大多数情况下这就足够了,但如果您需要每个轴的重量或每个称重传感器的重量,则可能需要一个高级指示器,如Avery weight Tronix E1310

  • 这篇笔记应该会引导你找到一个可行的解决方案,我从1、3和4中得到了我的解决方案。

    在网上搜索后,没有找到适合我情况的解决方案,我放弃了数字追逐,咨询了一位体重桥“专家”。如果你也在拔头发,这里有几件事需要注意:

  • 大多数称重桥(卡车和车辆)将重量作为模拟信号发送。因此,即使它们有一个串行端口,您的计算机也肯定不会“获取”,因此返回\0
  • 要让你的软件有任何分量,你必须通过一个指示器,它的主板上有转换器,可以读取模拟信号并将其转换为数字信号
  • 正如指示器所得到的,其中一些具有非常低的波特率,并且速率可能被设置为一个奇怪的数字(参见4),因此您可能希望尝试从低至100到9600。在我的例子中,波特率是600,我从未尝试过,因此连续\0
  • 知道如何配置您的指示器-使用指示器编号进行简单的谷歌搜索应该会产生一本好的英语手册,一开始可能会让人困惑,但这是您能够更改波特率(以及其他设置)并避免所有猜测的唯一方法
  • 简单指示器返回的总重量很轻,大多数情况下这就足够了,但如果您需要每个轴的重量或每个称重传感器的重量,则可能需要一个高级指示器,如Avery weight Tronix E1310

  • 本说明将引导您找到一个可行的解决方案,我从1、3和4中获得了我的解决方案。

    您不应该这样问这个问题,因为这里的大多数人不知道什么是重量桥或指示器。您必须向设备支持/制造商请求此信息(通常是某种操作手册)。这可能是硬件问题(错误的电缆)、通信配置错误(例如,可以单独配置balance以接受大范围的波特率/平价等,您必须知道它当前是如何配置的,或者根据需要重新配置),或者只是没有正确使用通信协议(命令等)。以及@Sinatr评论。大多数问题在于没有为任何设备实现串行协议。//您可能面临的另一个问题是Microsoft
    SerialPort
    实现存在相当多的错误,尤其是
    DataReceived
    事件将这两个答案结合在一起,一般串行端口方法是
    SerialPort.SendBytes
    然后
    SerialPort.ReceiveBytes
    。您发送和期望接收的字节是基于通信协议的。@KDecker我已经尝试了字节方法,而不是Microsoft的错误实现。您建议使用其他库。Sinatr该手册是中文的,翻译后它谈到了一个与bridge捆绑在一起的软件,它需要windows Xp:P,它是中文的,并且只做称重。。。我想做的不仅仅是称重,否则我会使用指示器…@LordBlack我仍然使用微软的实现,如果你解决了bug,它工作得很好,其他人在网上很好地记录了它们。//如果不知道设备的串行协议,就无法尝试“字节方法”。您必须知道发送和接收什么才能使其工作。您需要实现ErrorReceived事件,以便查看错误。与帧错误一样,如果没有正确猜测停止位或波特率的数量,可能会导致帧错误。ReadExisting()的使用也是不正确的,不能保证得到测量的完整响应。也许ReadLine或ReadTo可以做得更好,但您必须在手册中查找协议。在如此低波特率下工作的刻度通常发送二进制数据,这种数据必须读取()并计数。手册应该告诉你。你不应该像大多数人那样问这个问题