资深Bug工程师 2023-10-27 23:39 采纳率: 50%
浏览 14
已结题

关于C#与地磅仪表通讯的问题(相关搜索:上位机|通讯方式)

img


如上图 是某地磅仪表的通讯参数,现在我想用C#做一个简单的软件,读取地磅重量
目前该仪表为tf=0模式,也就是连续发送模式,只连续发送数据,不接受数据,也就是说该仪表会不停的像上位机发送重量数据。没遇到过此类通讯方式,不知道咋整了
用C#怎么跟该仪表通讯,具体代码该怎么写啊?最好写出具体代码以便参考

  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-27 23:39
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    以下是一个用C#与地磅仪表进行通讯的示例代码:

    using System;
    using System.IO.Ports;
    
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个串口实例
            SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    
            // 添加接收数据的事件处理程序
            serialPort.DataReceived += SerialPort_DataReceived;
    
            try
            {
                // 打开串口
                serialPort.Open();
    
                // 发送读取重量的命令
                serialPort.Write(new byte[] { 0x02 }, 0, 1);
    
                // 保持程序运行,等待接收到数据
                Console.WriteLine("正在接收地磅重量数据,请稍候...");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("发生错误:" + ex.Message);
            }
            finally
            {
                // 关闭串口
                serialPort.Close();
            }
        }
    
        private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort serialPort = (SerialPort)sender;
    
            // 读取接收缓冲区中的数据
            byte[] buffer = new byte[serialPort.BytesToRead];
            serialPort.Read(buffer, 0, buffer.Length);
    
            // 处理接收到的数据
            if (buffer[0] == 0x02 && buffer[buffer.Length - 2] == 0x03 && buffer.Length == 13)
            {
                byte[] weightBytes = new byte[5];
                Array.Copy(buffer, 2, weightBytes, 0, 5);
    
                double weight = ParseWeight(weightBytes);
    
                Console.WriteLine("接收到地磅重量数据:" + weight + "kg");
            }
            else
            {
                Console.WriteLine("接收到无效的数据");
            }
        }
    
        private static double ParseWeight(byte[] weightBytes)
        {
            // 将重量字节转换为字符串
            string weightString = System.Text.Encoding.ASCII.GetString(weightBytes);
    
            // 解析重量字符串为实际的重量值(单位:kg)
            double weight = double.Parse(weightString) / 1000;
    
            return weight;
        }
    }
    

    请注意,上述代码假设地磅仪表通过串口连接到计算机的COM1端口,并且串口的波特率设置为9600。

    此代码使用SerialPort类来进行串口通讯,并在接收到数据后解析并打印地磅的重量值。在SerialPort_DataReceived事件处理程序中,我们判断接收到的数据是否符合地磅仪表发送的报文格式,然后从报文中提取重量数据并进行解析。

    请根据实际情况修改代码中的串口参数,并运行程序进行测试。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 创建了问题 10月27日

悬赏问题

  • ¥15 asp写PC网站开通了微信支付,扫码付款不能跳转
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊