我正在构建一个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.887
和8.7170
。
我尝试过以下方法,但没有返回有效的输出。
var str = System.Text.Encoding.ASCII.GetString(bytes);
它正在返回这个" 2?88?? ?? r?"
var str = System.Text.Encoding.UTF8.GetString(bytes);
它正在返回这个" 2�88�� �� r�"
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对接收到的每个字符进行"与"运算来屏蔽奇偶校验位——注意,我认为这有点像破解真正的问题。