怎么用c#读取串口rs-232电子称传来的数据
开始我用超级终端先测试的,能读取到数据并且解析正常读取的数据时2528.0 kg
2.0 kg PT
2526.0 kg N
2478.0 kg
2.0 kg PT
2476.0 kg N
2497.0 kg
2.0 kg PT
2495.0 kg N
超级终端读取到这样的数据格式。我的电子称可以设置连续输出信号,也可以做成触发式发送方式,我现在的做的是触发式的,超级终端每次接受一组数据,就像打印机一样,每次打印一组数据。
请高手指点,给点类似的代码资料,我在网上搜的资料现在还不能对数据进行解析!
--------------------编程问答-------------------- 能取出数据,余下的事也就是对取出的字符串进行操作了,没什么可参考的了。取电子秤数据唯一需要注意的com连接。 --------------------编程问答-------------------- SerialPort --------------------编程问答-------------------- SerialPort,按照通信协议取数据 --------------------编程问答-------------------- SerialPort
设置好参数和监听事件
然后打开串口,
读取数据根据协议解析 --------------------编程问答-------------------- 一般电子秤条码的设置有两种类型:重量型与金额型,而又可以以‘2’;‘20’或‘22’等为起始码,相应的商品为最大5或6字节编号。
如:可以设置电子秤条码为‘2’+ 6字节商品编号 + 5字节重量 + 1字节校验
‘2’+ 6字节商品编号 + 5字节金额 + 1字节校验
‘20’+ 5字节商品编号 + 5字节金额 + 1字节校验
具体的要看电子秤说明书进行设置,解析时要求与电子秤的设置相一致
可能需要 用户自行根据其电子秤的设置 进行 输入参数 或 选择解析方式 --------------------编程问答--------------------
通讯协议是不是设置好波特率 停止位,校验位等那些参数? --------------------编程问答-------------------- 什么样的协议解析啊?不懂这个。。。新手 请指教 --------------------编程问答--------------------
不懂协议这个概念,能具体说下么? --------------------编程问答-------------------- 协议
在你这里具体就是指 电子秤经过设置后,它发出来的数据格式是怎样子的,每一个字节代表什么意思,要根据这些进行解析。
不同的电子秤或同一电子秤进行不同的设置后,格式可能不相同,需要不同的解析方法 --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace one
{
/// <summary>
/// 一个串口的例子
/// </summary>
public partial class Form1 : Form
{
Form from = new Form();
private string str = string.Empty;
private byte[] by;
public Form1()
{
InitializeComponent();
}
#region 加载本电脑上的串口
private void Form1_Load(object sender, EventArgs e)
{
button3.Enabled = true;
button4.Enabled = false;
comboBox2.Text = "9600";
string[] portList = System.IO.Ports.SerialPort.GetPortNames();
for (int i = 0; i < portList.Length; i++)
{
comboBox3.Items.Add(portList[i]);
comboBox1.Items.Add(portList[i]);
comboBox4_shou.Items.Add(portList[i]);
}
}
#endregion
/// <summary>
/// 将信息发送到该Com口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
byte[] b = new byte[10];
b = GEt();
write();
//MessageBox.Show(ByteArrayToHexString(Data).ToString());
}
#region 写入数据
public void write()
{
try
{
// serialPort1.PortName = comboBox1.Text;
//serialPort1.Open();
//serialPort1.BaudRate = int.Parse(comboBox2.Text);
//声明一个byte的数组来将需要发的信息发到byte 上
byte[] Data = new byte[4];
Data = Encoding.Unicode.GetBytes(textBox1.Text.Trim());
// string sr = ByteArrayToHexString(Data);
//使用缓冲区将数据写入 串行端口
serialPort1.Write(by, 0, by.Length);
}
catch (Exception p)
{
Console.WriteLine(p.Message);
MessageBox.Show(p.Message);
}
}
#endregion
private void button2_Click(object sender, EventArgs e)
{
//read();
textBox2.Text = "";
}
#region 读取串口数据的方法
public void read()
{
try
{
byte[] _data = new byte[4];
serialPort2.Read(_data,0,_data.Length );
// str = Encoding.Unicode.GetString(_data);
str = ByteArrayToHexString(_data);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
#endregion
#region 打开串口
/// <summary>
/// 打开当前串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = 9600;
if (!serialPort1.IsOpen)
{
serialPort1.Open();
button3.Enabled = false;
button4.Enabled = true;
}
else
{
MessageBox.Show("串口或许被打开或者不存在");
}
}
catch (Exception g)
{
Console.WriteLine(g.Message);
MessageBox.Show(g.Message);
}
}
#endregion
#region 关闭串口
/// <summasry>
/// 关闭当前串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
try
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
button4.Enabled = false;
button3.Enabled = true;
}
else
{
MessageBox.Show("串口或许被关闭或者串口不存在");
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
MessageBox.Show(ex.Message);
}
}
#endregion
private void button5_Click(object sender, EventArgs e)
{
MessageBox.Show(serialPort1.ReadBufferSize.ToString());
}
#region 打开串口
/// <summary>
/// 打开接受信息的串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button7_Click(object sender, EventArgs e)
{
try
{
serialPort2.PortName = comboBox4_shou.Text;
serialPort2.BaudRate = 9600;
if (!serialPort2.IsOpen)
{
serialPort2.Open();
button7.Enabled = false;
button6.Enabled = true;
}
else
{
MessageBox.Show("串口或许被打开或者不存在");
}
}
catch (Exception g)
{
Console.WriteLine(g.Message);
MessageBox.Show(g.Message);
}
}
#endregion
#region 串口被关闭
/// <summary>
/// 关键接受信息的串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button6_Click(object sender, EventArgs e)
{
try
{
if (serialPort2.IsOpen)
{
serialPort2.Close();
button6.Enabled = false;
button7.Enabled = true;
}
else
{
MessageBox.Show("串口或许被关闭或者串口不存在");
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
MessageBox.Show(ex.Message);
}
}
#endregion
#region 设置自动发送的代码
private void timer1_Tick(object sender, EventArgs e)
{
if (chek_bok.Checked)
{
write();
send();
}
else
{
send();
}
}
#endregion
#region 读取串口数据
private void serialPort2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
read();
}
#endregion
#region 发送数据
/// <summary>
/// 发送数据
/// </summary>
private void send()
{
button8.Text = DateTime.Now.ToString();
if (str.Length > 0)
{
textBox2.Text += " " + str;
str = "";
}
else
{
textBox2.ForeColor = Color.Red;
}
if (textBox2.Text.Length > 100)
{
//textBox2.Clear();
}
}
#endregion
#region 将字节数据转换为16进制的数据
/// <summary>
/// 一个将字节数组转换为16进制的
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
{
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
string s= Convert.ToString(b, 16);
}
return sb.ToString().ToUpper();
}
#endregion
/// <summary>
/// 返回一个byte[] 类型的一个数组
/// </summary>
/// <returns>byte类型的数组</returns>
public byte[] GEt()
{
string s = textBox1.Text.Trim();
/*拿到那个从文本框输入的文本值
*
* 并且
*/
if (s.Length<10)
{
for (int i = 0; i < 9; i++)
{
if (s.Length==9)
{
goto GZ;
}
else
{
s += 0;
}
}
}
GZ:
List<byte> arr = new List<byte>();
string a_ = string.Empty;
for (int i = 0; i < s.Length;i++)
{
if (s.Length > 2)
{
a_ = s.Substring(0, 2);
s = s.Remove(0, 2);
byte a = Convert.ToByte(Convert.ToInt32(a_, 16));
arr.Add(a);
}
else
{
break;
}
}
by = new byte[4];
by = arr.ToArray();
return by;
}
}
}
一个测试串口通信的类 我写的不懂的话 qq 我 417457624
补充:.NET技术 , C#