将串行端口字节(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();
}

这是我的CCD_ 3事件。

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 ??的数据

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

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

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

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

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

如果这是不可能的,那么你可以通过用0x7F对接收到的每个字符进行"与"运算来屏蔽奇偶校验位——注意,我认为这有点像破解真正的问题。

最新更新