将串行端口字节(RS232)转换为文本C#
我正在构建一个windows服务,用于从称重机接收重量(将串行端口字节(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
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的原因是它们设置了奇偶校验位。