VS_WinForm_IO.Ports.SerialPort串口通信初步程序代码

在VS2010里,可以看系统分装的IO.Ports.SerialPort类:
这里写图片描述
虽然不能看到具体的函数实现,但是可以看到有那些函数,并且函数注释了其功能,对于SerialPort的初步学习很有用

  1. 新建C#WinForm项目后,可以拖放SerialPort控件
private System.IO.Ports.SerialPort COMM2;
  1. 拖放一个控件来显示当前可以打开的串口端口
    这里写图片描述
 string s;
            COMM2.Close();
            for (int i = 1; i < 32; i++)
            {
                s = "COM" + i.ToString();
                COMM2.PortName = s;
                SerialPort2.Items.Add(s);
                try
                {
                    COMM2.Open();
                }
                catch
                {
                    SerialPort2.Items.Remove(s);
                }
                COMM2.Close();
            }
            //load current setting
            COMM2.BaudRate = 115200;
            COMM2.ReceivedBytesThreshold = 1;
            COMM2.ReadTimeout = 10;

            if (SerialPort2.Items.Count > 0)
            {
                SerialPort2.Text = SerialPort2.Items[0].ToString();
                COMM2.PortName = SerialPort2.Items[0].ToString();
            }
            else
            {
                SerialPort2.Text = "";
                COMM2.PortName = uPort2;
            }
  1. 当需要向串口发送数据的时候的发送操作
private void Send_Data()
        {
            int length = uScanCode.Length;
            byte[] sn = new byte[length + 4];
            byte totalsum = 0;
            byte checksum = 0;
            sn[0] = 0xAA;
            sn[1] = (byte)(0xff & (length + 4));
            sn[2] = 0xEE;

            for (int i = 0; i < length; i++)
            {
                sn[i + 3] = (byte)(0xff & uScanCode[i]);
                totalsum += (byte)(0xff & uScanCode[i]);
            }
            checksum = (byte)(0xff - (byte)(0xff & totalsum) - sn[0] - sn[1] - sn[2]);
            sn[length + 3] = checksum;
            if (uRS232Connect)
            {
                return_flag = false;
                COMM2.Write(sn, 0, length + 4);
                while (!return_flag)
                {
                    Delay(100);
                }
                return_flag = false;
            }
        }
  1. 数据接受的多线程接收函数处理,只要在SerialPort控件上绑定一个多线程接收函数就可以了
// 
            // COMM2
            // 
            this.COMM2.PortName = "COM2";
            this.COMM2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.COMM2_DataReceived);
 private void COMM2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(200);
            try
            {
                int DataLength = COMM2.BytesToRead;
                byte[] data = new byte[DataLength];
                int len = COMM2.Read(data, 0, DataLength);

                //校验获取的数据是否正确
                byte checksum = 0;
                for (int i = 0; i < len; i++)
                {
                    checksum += (byte)(0xff & data[i]);
                }

                //获取TV网络MAC地址
                if ((len == data[1])&&(checksum == 0xff))
                {
                    return_flag = true;
                    sReciebeData = System.Text.Encoding.Default.GetString(data);
                    this.Invoke((EventHandler)(delegate
                    {
                        this.Status.Text = uScanCode + "成功存入TV,谢谢!";
                    }));
                }
                if ((len == 4) && (data[0] == 0x4E) && (data[1] == 0x47) && (data[2] == 0x4E) && (data[3] == 0x47))
                {
                    return_flag = false;
                    Status.Text = "失败,请再扫描一次!";
                }
            }
            catch
            {
                this.BeginInvoke(new MethodInvoker(delegate()
                {
                    COMM2.Close();
                    uRS232Connect = false;
                    //Console.WriteLine("串口连接出错2,请检查连线! ");
                    MessageBox.Show("串口连接出错2,请检查连线! ");
                }));
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值