c# - 将串行端口字节(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.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 个停止位)并且您从读取方法获得的数据将仅为 7 位(奇偶校验位将在设备级别被剥离)。
如果这不可能,那么您可以通过与 0x7F 接收到的每个字符进行 AND 运算来屏蔽奇偶校验位 - 请注意,我认为这是解决实际问题的一种技巧。
推荐阅读
- python - 如何使用 python 和 matplotlib 制作自定义路径?
- python - 使用 Python 从大型工作簿中仅加载一张工作表
- yii2 - Yii2 框架中的 UNION 问题
- postgresql - 如何触发 [42P09] 错误(不明确的别名)
- angular - 当 headerComponent 中的复选框状态更改时检测组件网格中的更改
- python - 从一些刮和标题
- .net - 在 asp.net core 中嵌入 Excel 显示
- python-3.x - Python如何将变量传递给SQLite复杂的SQL更新查询
- python - 创建 Tkinter 文本并使以前的文本上升
- latex - 寻找大型乳胶文件(~200 页/1mb+)来测试压缩实现