串口的使用:
1,串口控件位于 工具箱—组件—SerialPort, 拖动到窗体上,设置属性(Name),命名。
可在属性处进行设置,也可以在后台代码页进行手动写:
/// <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事件里去读取。还有取出来的数据最好也进行校验,因为不校验容易受到干扰。