Example #1
0
        public void functionControlButton_Click(object sender, EventArgs e)
        {
            Button btn  = sender as Button;
            string send = "$s";

            switch (btn.Name)
            {
            case "registerFunctionButton":
                break;

            case "displaySteerButton":
                send += "@#";
                BTserialPort.Write(send);
                break;

            case "clearFunctionButton":
                send += "i#";
                BTserialPort.Write(send);
                break;

            case "testFunctionButton":
                send += "t#";
                BTserialPort.Write(send);
                break;

            case "saveFunctionButton":
                break;

            case "openFunctionButton":
                break;

            default: break;
            }
        }
Example #2
0
        private void openPortButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (portComboBox.SelectedItem == null)
                {
                    MessageBox.Show("无串口!.");
                }
                else
                {
                    if (BTserialPort.IsOpen == true)
                    {
                        portInfo.Closing = true;
                        while (portInfo.Listening)
                        {
                            Application.DoEvents();
                        }

                        BTserialPort.DataReceived -= BTserialPort_DataReceived;
                        BTserialPort.Close();
                        openPortButton.Text  = "打开串口";
                        portComboBox.Enabled = true;
                        portInfo.Closing     = false;
                    }
                    else
                    {
                        //初始化SerialPort对象
                        BTserialPort.NewLine   = "\r\n";
                        BTserialPort.RtsEnable = true;//根据实际情况吧。
                        //实例化委托对象
                        BTserialPort.DataReceived += new SerialDataReceivedEventHandler(BTserialPort_DataReceived);

                        BTserialPort.PortName = portComboBox.SelectedItem.ToString();
                        BTserialPort.BaudRate = portInfo.Baudrate;
                        BTserialPort.DataBits = portInfo.DataBits;
                        BTserialPort.Parity   = portInfo.PARITY;
                        BTserialPort.StopBits = portInfo.STOPBITS;
                        BTserialPort.Open();
                        openPortButton.Text  = "关闭串口";
                        portComboBox.Enabled = false;
                    }
                }
            }
            catch
            {
                MessageBox.Show("Serial port not available or in use now. Please try another port.");
            }
        }
Example #3
0
 private void sendButton_Click(object sender, EventArgs e)
 {
     //定义一个变量,记录发送了几个字节
     if (BTserialPort.IsOpen)
     {
         int n = 0;
         //16进制发送
         if (sendForm == 0)
         {
             //我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数
             MatchCollection mc  = Regex.Matches(dataSendTextBox.Text, @"(?i)[\da-f]{2}");
             List <byte>     buf = new List <byte>();//填充到这个临时列表中
             //依次添加到列表中
             foreach (Match m in mc)
             {
                 buf.Add(byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber));
             }
             //转换列表为数组后发送
             BTserialPort.Write(buf.ToArray(), 0, buf.Count);
             //记录发送的字节数
             n = buf.Count;
         }
         else//ascii编码直接发送
         {
             //包含换行符
             //if (checkBoxNewlineSend.Checked)
             //{
             //    serialPort1.WriteLine(dataSendTextBox.Text);
             //    n = dataSendTextBox.Text.Length + 2;
             //}
             //else//不包含换行符
             //{
             BTserialPort.Write(dataSendTextBox.Text);
             n = dataSendTextBox.Text.Length;
             //}
         }
         //labelSendCount.Text = "Send:" + send_count.ToString();//更新界面
     }
     else
     {
         MessageBox.Show("串口未打开,请打开串口!");
     }
 }
Example #4
0
        /* private void textBox1_KeyDown(object sender, KeyEventArgs e)
         * {
         *       if (e.KeyData == Keys.A)
         *       {
         *           dataReceiveTextBox.AppendText("a\n");
         *       }
         * }*/
        private void BTserialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (portInfo.Closing)
            {
                return;                  //如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
            }
            try
            {
                portInfo.Listening = true;             //设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
                int    n   = BTserialPort.BytesToRead; //先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
                byte[] buf = new byte[n];              //声明一个临时数组存储当前来的串口数据
                received_count += n;                   //增加接收计数
                BTserialPort.Read(buf, 0, n);          //读取缓冲数据
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //<协议解析>
                bool data_1_catched = false;//缓存记录数据是否捕获到
                //1.缓存数据
                buffer.AddRange(buf);
                //2.完整性判断
                while (buffer.Count >= 2)//至少要包含头(2字节)+长度(1字节)+校验(1字节)
                {
                    //请不要担心使用>=,因为>=已经和>,<,=一样,是独立操作符,并不是解析成>和=2个符号
                    //2.1 查找数据头
                    if (buffer[0] == 0xAA)
                    {
                        //if (buffer.Count < 10)
                        //break;
                        if (buffer.Count < 10)
                        {
                            break;
                        }
                        byte checksum = 0;
                        for (int i = 0; i < 9; i++)//len+3表示校验之前的位置
                        {
                            checksum ^= buffer[i];
                        }
                        if (checksum != buffer[9])     //如果数据校验失败,丢弃这一包数据
                        {
                            buffer.RemoveRange(0, 10); //从缓存中删除错误数据
                            continue;                  //继续下一次循环
                        }
                        //至此,已经被找到了一条完整数据。我们将数据直接分析,或是缓存起来一起分析
                        //我们这里采用的办法是缓存一次,好处就是如果你某种原因,数据堆积在缓存buffer中
                        //已经很多了,那你需要循环的找到最后一组,只分析最新数据,过往数据你已经处理不及时
                        //了,就不要浪费更多时间了,这也是考虑到系统负载能够降低。
                        buffer.CopyTo(0, binary_data_1, 0, 10); //复制一条完整数据到具体的数据缓存
                        data_1_catched = true;
                        buffer.RemoveRange(0, 10);              //正确分析一条数据,从缓存中移除数据。
                    }
                    else
                    {
                        //这里是很重要的,如果数据开始不是头,则删除数据
                        //buffer.RemoveAt(0);
                        buffer.RemoveRange(0, 1);
                    }
                    if (buffer[0] == '#')
                    {
                        displayNum = 1;
                    }
                    else
                    {
                        displayNum = 0;
                    }
                }
                //分析数据
                if (data_1_catched)
                {
                }
                //如果需要别的协议,只要扩展这个data_n_catched就可以了。往往我们协议多的情况下,还会包含数据编号,给来的数据进行
                //编号,协议优化后就是: 头+编号+长度+数据+校验
                //</协议解析>
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////

                builder.Clear();//清除字符串构造器的内容
                //因为要访问ui资源,所以需要使用invoke方式同步ui。
                this.Invoke((EventHandler)(delegate
                {
                    //判断是否是显示为16进制
                    if (receiveForm == 0)
                    {
                        //依次的拼接出16进制字符串
                        foreach (byte b in buf)
                        {
                            builder.Append(b.ToString("X2") + " ");
                        }
                    }
                    else
                    {
                        //直接按ASCII规则转换成字符串
                        builder.Append(Encoding.ASCII.GetString(buf));
                    }
                    if (displayNum == 0)
                    {
                        //追加的形式添加到文本框末端,并滚动到最后。
                        this.dataReceiveTextBox.AppendText(builder.ToString());
                    }
                    else if (displayNum == 1)
                    {
                        this.functionTextBox.AppendText(builder.ToString());
                    }
                }));
            }
            finally
            {
                portInfo.Listening = false;//我用完了,ui可以关闭串口了。
            }
        }
Example #5
0
        public void steerControlButton_Click(object sender, EventArgs e)
        {
            Button btn  = sender as Button;
            string send = "$c";

            string[] steerPWM = new string[12];
            switch (btn.Name)
            {
            case "steerOpenButton":
                break;

            case "steerSaveButton":
                break;

            case "steerInitButton":
                if (BTserialPort.IsOpen)
                {
                    steerTextBox0.Text  = "75";
                    steerTextBox1.Text  = "75";
                    steerTextBox2.Text  = "75";
                    steerTextBox3.Text  = "75";
                    steerTextBox4.Text  = "75";
                    steerTextBox5.Text  = "75";
                    steerTextBox6.Text  = "75";
                    steerTextBox7.Text  = "75";
                    steerTextBox8.Text  = "75";
                    steerTextBox9.Text  = "75";
                    steerTextBox10.Text = "75";
                    steerTextBox11.Text = "75";
                    send += "75,75,75,75,75,75,75,75,75,75,75,75#";
                    BTserialPort.Write(send);
                }
                else
                {
                    MessageBox.Show("串口未打开,请打开串口!");
                }
                break;

            case "steerSendDataButton":
                if (BTserialPort.IsOpen)
                {
                    steerPWM[0]  = steerTextBox0.Text;
                    steerPWM[1]  = steerTextBox1.Text;
                    steerPWM[2]  = steerTextBox2.Text;
                    steerPWM[3]  = steerTextBox3.Text;
                    steerPWM[4]  = steerTextBox4.Text;
                    steerPWM[5]  = steerTextBox5.Text;
                    steerPWM[6]  = steerTextBox6.Text;
                    steerPWM[7]  = steerTextBox7.Text;
                    steerPWM[8]  = steerTextBox8.Text;
                    steerPWM[9]  = steerTextBox9.Text;
                    steerPWM[10] = steerTextBox10.Text;
                    steerPWM[11] = steerTextBox11.Text;
                    send         = send + steerPWM[0] + "," + steerPWM[1] + "," + steerPWM[2] + "," + steerPWM[3] + "," + steerPWM[4]
                                   + "," + steerPWM[5] + "," + steerPWM[6] + "," + steerPWM[7] + "," + steerPWM[8] + "," + steerPWM[9]
                                   + "," + steerPWM[10] + "," + steerPWM[11] + "#";
                    BTserialPort.Write(send);
                }
                else
                {
                    MessageBox.Show("串口未打开,请打开串口!");
                }
                break;

            default: break;
            }
        }
Example #6
0
        public void CarControlButton_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            string send;
            string speed;
            string angle;

            if (BTserialPort.IsOpen)
            {
                switch (btn.Name)
                {
                case "stopRobotButton":
                    send = "$zs#";
                    BTserialPort.Write(send);
                    break;

                case "autoRobotButton":
                    send = "$zx$";
                    BTserialPort.Write(send);
                    break;

                case "frontButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zq" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "backButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zw" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "leftButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$ze" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "rightButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zr" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "leftStraightButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zy" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "rightStraightButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zt" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "rightBackButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zu" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "leftBackButton":
                    if (int.Parse(speedTextBox.Text) <= 999 && int.Parse(speedTextBox.Text) >= 0)
                    {
                        speed = speedTextBox.Text;
                        send  = "$zi" + speed + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("速度没设置好!");
                    }
                    break;

                case "rightRoateButton":
                    if (int.Parse(rightRoateTextBox.Text) <= 360 && int.Parse(rightRoateTextBox.Text) >= 0)
                    {
                        angle = rightRoateTextBox.Text;
                        send  = "$zo" + angle + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("角度没设置好!");
                    }
                    break;

                case "leftRoateButton":
                    if (int.Parse(leftRoateTextBox.Text) <= 360 && int.Parse(leftRoateTextBox.Text) >= 0)
                    {
                        angle = leftRoateTextBox.Text;
                        send  = "$zp" + angle + "#";
                        BTserialPort.Write(send);
                    }
                    else
                    {
                        MessageBox.Show("角度没设置好!");
                    }
                    break;

                default:
                    break;
                }
            }
            else
            {
                MessageBox.Show("串口未打开,请打开串口!");
            }
        }