将串行端口字节(RS232)转换为文本C#

将串行端口字节(RS232)转换为文本C#,c#,arrays,serial-port,byte,C#,Arrays,Serial Port,Byte,我正在构建一个windows服务,用于从称重机接收重量(sartorius)。称重机通过rs232连接 使用下面的代码 var sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); sp.DtrEnable = true; sp.RtsEnable = false; sp.D

我正在构建一个windows服务,用于从称重机接收重量(
sartorius
)。称重机通过rs232连接

使用下面的代码

                var sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
                sp.DtrEnable = true;
                sp.RtsEnable = false;
                sp.DataReceived += port_OnReceiveDatazz;
                if (!sp.IsOpen)
                {
                    sp.Open();
                }
这是我的
DataReceived
事件

        private void port_OnReceiveDatazz(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                SerialPort spL = (SerialPort)sender;
                byte[] buf = new byte[spL.BytesToRead];
                spL.Read(buf, 0, buf.Length);
                string data = "";
                //buf=[32,32,50,174,56,56,182,176,32,227,244,32,13,138]
                //actual wt is 2.887
                //buf=[32,32,56,174,55,49,55,176,32,227,244,32,13,138]
                // actual wt is 8.7170
                foreach (Byte b in buf)
                {
                    data += Convert.ToString(b) + ",";
                }
                SendData(new WeightModel() { DateTime = DateTime.Now, Weight = data });
            }
            catch (Exception ex)
            {
                WriteLog(JsonConvert.SerializeObject(ex));
            }
        }
从端口接收到以下字节数组

[32,32,50174,56,56182176,3227244,32,13138]

[32,32,56174,55,49,55176,3227244,32,13138]

其输出应分别为
2.887
8.7170

我尝试了以下方法,但没有返回有效的输出

  • var str=System.Text.Encoding.ASCII.GetString(字节)
    它正在返回此
    “2?88???\r?”
  • var str=System.Text.Encoding.UTF8.GetString(字节)
    它正在返回此
    “2�88�� �� \R�"
  • var str=BitConverter.ToString(字节);
    它正在返回此
    “20-20-32-AE-38-38-B6-B0-20-E3-F4-20-0D-8A”
  • 返回的输出用于第一个数组

    我还试图获得如下数据

    var data = spL.ReadExisting();
    
    但这是返回的数据,如
    8?712??


    您能帮我从这些字节数组中获取原始输出吗。

    问题似乎是串行端口的配置不正确

    似乎需要的是奇数奇偶校验和1个停止位的7位数据。您已将端口设置为具有8位数据、无奇偶校验和1个停止位。配置以每个字节发送的正确位数结束,因此不会发生帧错误

    您得到的8位数据的情况是,较低的7位是您需要的实际ASCII数据,最高位实际上是发送的奇偶校验位

    您需要做的是正确配置串行端口(7位、奇偶校验位和1个停止位)&从读取方法获得的数据将仅为7位(奇偶校验位将在设备级别剥离)


    如果不可能,那么您可以通过使用0x7F对接收到的每个字符进行and运算来屏蔽奇偶校验位-注意,我认为这是一个解决实际问题的技巧。

    帮我一个忙,尝试将数据位设置为7。这只是一个有根据的猜测……实际上可以尝试以下设置:
    新串行端口(“COM1”)“,9600,奇偶校验。奇数,7,停止位。1)如果你屏蔽了所有值的顶部位(buf[x]&=0x7F;)-然后转换成ASCII,你会得到“2.8860 ct”和“8.7170 ct”@PaulF这难道不等于将数据位设置为7吗?@MongZhu:你是对的-我的评论应该解释一下,如果设置7位数据,你会得到这样的结果。我所做的就是屏蔽奇偶校验位。我只是展示了你将得到的结果。@Manoj:我不想把我的建议作为答案——因为我所做的就是绕开这个问题——真正的答案是设置正确的数据位和奇偶校验,那么你从串行端口返回的数据将不需要进一步处理。数组中的值大于127的原因是它们设置了奇偶校验位。