宁波科力地磅串口开发(C#)

宁波科力地磅串口开发(C#)

宁波科力地磅和电脑采用DB9接线方式,RS232协议传输。

(上图为DB9,母头共九个接线孔)
如果电脑没有RS232接口,可使用RS232转USB连接线,建议采用质量较好的连接线。也可以采用RS232的PCI转接板,转接板可以支持多个磅头连接。

(串口转USB线,串口连接磅头,USB口连接电脑)

接线以后可以在设备管理器查看串口驱动是否运行正常。

接线正常后我们开始通过C#遍历计算机所有的串口设备。
using System.IO.Ports;

///
/// 获取本机所有端口
///
///
public static List loadComPorts()
{
List portsList = new List();
string[] ports = SerialPort.GetPortNames();
if (ports != null)
portsList = ports.ToList();
return portsList;
}

返回的串口名称是字符串,我们可以直接打开串口了,我们可以使用定时器,每隔一段时间检查串口是否打开,如果没有打开则尝试自动打开。这里用到了SerialPort控件。
//PORT 设置的参数名称为空
if (string.IsNullOrEmpty(PortName))
{
rtxlog.AppendText(DateTime.Now.ToString(“mm:ss”) + “地磅端口名称错误” + PortName );
return;
}

//检查参数,如果没有设置则设置为默认值
if (String.IsNullOrEmpty(Vars.baud)) Vars.baud = “9600”;
if (String.IsNullOrEmpty(Vars.dsite)) Vars.baud = “8”;
if (String.IsNullOrEmpty(Vars.ssite)) Vars.baud = “1”;
if (String.IsNullOrEmpty(Vars.parity)) Vars.baud = “无”;

if (!serialPort1.IsOpen)
{
try
{
serialPort1.PortName = GlobalVars.Port;
serialPort1.BaudRate = Convert.ToInt32(Vars.baud);
serialPort1.DataBits = Convert.ToInt32(lVars.dsite);
//停止位字符串转换为控件接受的格式
string tzw = Vars.tzw;
if (tzw.Equals(“1”))
serialPort1.StopBits = StopBits.One;
else if (tzw.Equals(“1.5”))
serialPort1.StopBits = StopBits.OnePointFive;
else if (tzw.Equals(“2”))
serialPort1.StopBits = StopBits.Two;
//校验位字符串转换为控件接受的格式
string jyw = GlobalVars.parity;
if (jyw == “无”)
serialPort1.Parity = Parity.None;
else if (jyw == “奇校验”)
serialPort1.Parity = Parity.Odd;
else if (jyw == “偶校验”)
serialPort1.Parity = Parity.Even;
serialPort1.Open();
}catch (Exception exp)
{
LogHelper.Err("打开端口失败: " + exp.Message);
}
}
else
{
SetPontStatus("已打开端口 " + serialPort1.PortName, Color.Green);
}

接下来,我们在SerialPort控件的接收数据方法中获取数据。我们写一个简单的判断,如果是宁波科力的地磅,则将读取到的字节流使用该方法处理。
private string _recv_string = “”;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int len = serialPort1.BytesToRead;
Byte[] readBuffer = new Byte[len];
serialPort1.Read(readBuffer, 0, len);

  if ("宁波柯力D2002".Equals(Vars.PontName))
  {
       RECV_NBKL_D2002(readBuffer);
  }
  serialPort1.DiscardInBuffer();

}

///
/// 宁波科力D2002
///
///
private void RECV_NBKL_D2002(byte[] readBuffer)
{
string str_read = Encoding.Default.GetString(readBuffer);
_recv_string += str_read;
//取出最后一个完整的数据段,并将历史数据清空 EG +047190010
if (!_recv_string.EndsWith("")) return;
int _idx = _recv_string.LastIndexOf("+");
if (_idx == -1) return;
string lastitem = _recv_string.Substring(_idx + 1, _recv_string.Length - _idx - 5); //称重数据
_recv_string = “”;
//将传入的千克转化为吨
decimal dValue = StringUtil.parseDecimal(lastitem)/1000M;
lastitem = dValue.ToString(“F2”);
}

大致意思是我们准备一个字符串,地磅每次传输的数据要追加到字符串后面,然后尝试去除最后一个完整的数据单元,并且计算出来实际吨位数。

这里有一个情况,车辆上磅以后,吨位数持续传递到电脑中,所以上述方法会一直在运行中,实际上屏幕只需要0.1秒延时显示已经很精准了。如果电脑配置很低,建议该方法只追加字符串,另外创建一个Timer分析字符串,总知不建议在DataReceived方法中写入太多处理逻辑,将分析算法放在另一个线程中。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碧海银帆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值