首页 > 解决方案 > 将串行端口字节(RS232)转换为文本 C#

问题描述

我正在构建一个 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,50,174,56,56,182,176,32,227,244,32,13,138]

[32,32,56,174,55,49,55,176,32,227,244,32,13,138]

它的输出应该是2.8878.7170分别。

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

  1. var str = System.Text.Encoding.ASCII.GetString(bytes); 它正在返回这个" 2?88?? ?? \r?"
  2. var str = System.Text.Encoding.UTF8.GetString(bytes); 它正在返回这个" 2�88�� �� \r�"
  3. var str = BitConverter.ToString(bytes); 它正在返回这个"20-20-32-AE-38-38-B6-B0-20-E3-F4-20-0D-8A"

返回的输出用于第一个数组。

我也尝试获取如下数据

var data = spL.ReadExisting();

但这是返回的数据 8?712 ??

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

标签: c#arraysserial-portbyte

解决方案


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

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

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

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

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


推荐阅读