公司项目接近尾部,从刚开始接触SerialPort到现在,用的最多算是它了。所以,现在做个总结。
刚开始接到这个项目的时候,就从没接触过SerialPort,不知道如何下手,像最基本的PortName(通信端口)、BaudRate(波特率)、Parity(奇偶校验)、DataBits(数据位长度)、StopBits(停止位数)都不知道,后来网上google别人的经验,知道了最基本的用法,原来串口通信还需要下层的同事把协议写好,烧到硬件上去。
串口的使用:
1,串口控件位于 工具箱—组件—SerialPort, 拖动到窗体上,设置属性(Name),命名。
可在属性处进行设置,也可以在后台代码页进行手动写:
需导入命名空间:using System.IO.Ports;
/// <summary>
/// 串行端口资源 端口名称 波特率 奇偶校验位 数据位 停止位
/// </summary>
public SerialPort port = new SerialPort("COM1", 115200, Parity.None, 8, StopBits.One);
设置好串行端口等属性之后,便可以操作串口进行通信了,如要对设备进行全部开启操作。
/// <summary>
/// //设备全开、关
/// </summary>
protected void AllOpenOrClose()
{
try
{
//打开串口
port.Open();
//判断是否选中开
if (chb_CheckAll.Checked == true)
{
//用字节的形式发送数据 全开 解释:order1 是控制命令,后面是2个byte的校验(高8位与低8位),0x00可以不写,直接写成(byte)((order1)>>8)
byte[] b = { order1, (byte)((order1 + 0x00) >> 8), (byte)(order1 + 0x00) };
//把b数组中的数据以字节的形式写入串行端口
port.Write(b, 0, b.Length);
//提示信息!
lab_Message.Text = "设备已经全部打开!";
}
else
{
//用字节的形式发送数据 全关
byte[] b = { order2, (byte)((order2 + 0x00) >> 8), (byte)(order2 + 0x00) };
v.port.Write(b, 0, b.Length);
lab_Message.Text = "设备已经全部关闭!";
}
//关闭串口 记得开启端口之后一定要关闭,和ADO.NET的Connection对象一样,用过之后必须关闭。
port.Close();
}
catch (Exception ex)
{
//捕获的异常信息
MessageBox.Show(ex.Message, "提示");
}
}
2,如果要对设备的状态进行实时监听,有一个很好的事件,在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中 SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为 1。
我们把串口的属性定义在InitializeComponent()方法下面,(不会连这个方法都不知道把?!!)。在页面命名空间下的第一个方法,是Visual Studio设计器自动生成的方法。
public SettingsTimePlay()
{
InitializeComponent();
//串行端口号
seriaSettingPlay.PortName = "COM1";
//波特率
seriaSettingPlay.BaudRate = 115200;
//奇偶校验位
seriaSettingPlay.Parity = Parity.None;
//数据位
seriaSettingPlay.DataBits = 8;
//停止位
seriaSettingPlay.StopBits = StopBits.One;
textChanged += new UpdateTextEventHandler(ChangeText);
try
{
//打开串口
seriaSettingPlay.Open();
}
catch (Exception ex)
{
//捕获的异常信息,没检查到串口或串口设置不正确。
MessageBox.Show("请检查是否已经连接串口!\n" + ex.Message, "提示");
}
}
属性定义完成之后,需要,
//定义委托
private delegate void GetText(string text);
//定义事件
private event GetText textChanged;
//事件处理方法
private void ChangeText(string text)
{
//这里为处理接收到的值,赋值到控件上。
...........
}
现在就是DataReceived事件进行实时监听了,
//定义接收的字节
private byte[] Data = new byte[8];
private void seriaSettingPlay_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//读取来自监听到的字节
seriaSettingPlay.Read(be,0,be.Length);
//把第一个命名赋值到text变量
text=be[0].Tostring();
seriaSettingPlay.DiscardInBuffer();
this.Invoke(textChanged, new string[] { text});
}
最后,记得在Load事件里去读取。还有取出来的数据最好也进行校验,因为不校验容易受到干扰。
希望对大家学习串口知识有所帮助。