国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

串口通信--控制舵機運動

2019-11-17 03:12:24
字體:
來源:轉載
供稿:網友

串口通信--控制舵機運動

界面部分使用krytonToolKit開發,整個軟件實現了串口通信,并且控制四個自由度的舵機運動。

整個軟件使用多線程開發,采集舵機指令保存到TXT文檔中,然后調用TXT文檔再現舵機運動過程,軟件界面如下:

優化之后的界面 如下:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.IO.Ports;using System.Windows.Forms;using System.Text.RegularExPRessions;using System.Threading;using System.IO;//DotNetMagicusing Crownwood.DotNetMagic;using Crownwood.DotNetMagic.Common;using Crownwood.DotNetMagic.Controls;using Crownwood.DotNetMagic.Docking;using Crownwood.DotNetMagic.Forms;using System.Runtime.InteropServices;using System.Collections;namespace ComAssistant{ public partial class ComAssistantForm : DotNetMagicForm { private int received_count = 0;//接收計數 private long send_count = 0;//發送計數 private bool Listening = false;//是否沒有執行完invoke相關操作 //private bool Closing = false;//是否正在關閉串口,執行application.DoEvents,并阻止再次invoke private bool Closing = false;//是否正在關閉串口,執行Application.DoEvents,并阻止再次invoke private bool Query = false;//查詢狀態 private List<byte> buffer = new List<byte>(4096);//默認分配1頁內存,并始終限制不允許超過 private byte[] binary_data_1 = new byte[10];//FF FF 01 06 00 B1 0A 00 00 3D List<Array> dataList = new List<Array>(); //數據再現 string FILE_INFO_NAME = "FileInfo.txt"; private bool kaiguan = true; private bool openClose = true; string strShow = ""; public ComAssistantForm() { InitializeComponent(); } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { //返回指令格式:FF FF 01 06 00 B1 0A 00 00 3D , 其中B1 0A為ID為1的舵機當前位置,00 00為其當前速度 // 第2位是舵機,5、6位是位置,7、8位為速度 if (Closing) return;//如果正在關閉,忽略操作,直接返回,盡快的完成串口監聽線程的一次循環 try { Listening = true;//設置標記,說明我已經開始處理數據,一會兒要使用系統UI的。 int n = serialPort1.BytesToRead;//先記錄下來,避免某種原因,人為的原因,操作幾次之間時間長,緩存不一致 byte[] buf = new byte[n];//聲明一個臨時數組存儲當前來的串口數據 serialPort1.Read(buf, 0, n);//讀取緩沖數據 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //<協議解析> //1.緩存數據 buffer.AddRange(buf); //2.完整性判斷 while (buffer.Count >= 10)//至少要包含頭(2字節)+長度(7字節)+校驗(1字節) { if (buffer[0] == 0xFF && buffer[1] == 0xFF && buffer[2] == 0xFF) { buffer.RemoveRange(0, 10);//從緩存中移除數據。 continue; } //2.1 查找數據頭 if (buffer[0] == 0xFF && buffer[1] == 0xFF&& buffer[2] != 0xFF) { received_count++; //至此,已經被找到了一條完整數據。我們將數據直接分析,或是緩存起來一起分析 buffer.CopyTo(0, binary_data_1, 0, 9);//復制一條完整數據到具體的數據緩存 //3.分析數據 //根據舵機編號分類并存入TXT文件 string zhuanbian = binary_data_1[7].ToString("X2"); if (zhuanbian == "00") { zhuanbian = "01"; } //我們的數據都是定好格式的,所以當我們找到分析出的數據1,就知道固定位置一定是這些數據,我們只要顯示就可以了 string data = binary_data_1[2].ToString("X2") + " " + binary_data_1[5].ToString("X2") + " " + binary_data_1[6].ToString("X2") + " " + zhuanbian + " " + binary_data_1[8].ToString("X2"); //更新界面 this.Invoke((EventHandler)(delegate { kryptonRichTextBox1.Text += data + "**"; WriteFile(data); })); if (received_count == 4) { WriteFileLine(); received_count = 0; //更新界面 this.Invoke((EventHandler)(delegate { kryptonRichTextBox1.Text += "/r/n"; })); } buffer.RemoveRange(0, 10);//正確分析一條數據,從緩存中移除數據。 } else { //這里是很重要的,如果數據開始不是頭,則刪除數據 buffer.RemoveAt(0); } } } catch (Exception) { MessageBox.Show("串口接收數據出錯,請查看串口接收指令!", "軟件提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); } finally { Listening = false;//我用完了,ui可以關閉串口了。 } } //初始化 private void ComAssistantForm_Load(object sender, EventArgs e) { int ii = 0; foreach (string s in SerialPort.GetPortNames()) { if (ii >= 1) { ktComboBoxCom.Items.Add(s); } ii++; } if (SerialPort.GetPortNames().Length != 0) { ktComboBoxCom.Text = (string)ktComboBoxCom.Items[0]; } //string[] strCom = new string[] { "COM1", "COM2", "COM3", "COM4" }; //ktComboBoxCom.DataSource = strCom; string[] ss = new string[] {"2000000" , "9600", "19200", "57600" }; ktComboBoxBount.DataSource = ss; ktComboBoxJiaoyan.DataSource = Enum.GetNames(typeof(Parity)); ss = new string[] { "5", "6", "7", "8" }; ktComboBoxData.DataSource = ss; ktComboBoxData.Text = "8"; ktComboBoxStop.DataSource = Enum.GetNames(typeof(StopBits)); ktComboBoxStop.Text = Enum.Format(typeof(StopBits), StopBits.One, "G"); kryptonTextBox1.Text = "FF FF 04 04 03 18 00 DC"; try { if (!serialPort1.IsOpen) { serialPort1.PortName = ktComboBoxCom.Text; serialPort1.BaudRate = Convert.ToInt32(ktComboBoxBount.Text); serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), ktComboBoxJiaoyan.Text); serialPort1.DataBits = Int32.Parse(ktComboBoxData.Text); serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), ktComboBoxStop.Text); serialPort1.Encoding = Encoding.GetEncoding("Gb2312"); serialPort1.Open(); pictureBox1.Image = Image.FromFile(Application.StartupPath + "http://kai.jpg"); } } catch (Exception) { MessageBox.Show("初始化出問題,請檢查串口設備", "軟件提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); } } //連接串口 private void ktBtnLink_Click(object sender, EventArgs e) { try { if (!serialPort1.IsOpen) { serialPort1.PortName = ktComboBoxCom.Text; serialPort1.BaudRate = Convert.ToInt32(ktComboBoxBount.Text); serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), ktComboBoxJiaoyan.Text); serialPort1.DataBits = Int32.Parse(ktComboBoxData.Text); serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), ktComboBoxStop.Text); serialPort1.Encoding = Encoding.GetEncoding("Gb2312"); serialPort1.Open(); pictureBox1.Image = Image.FromFile(Application.StartupPath + "http://kai.jpg"); } } catch (Exception) { MessageBox.Show("初始化出問題,請檢查串口設備", "軟件提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); } } //關閉串口 private void ktBtnClose_Click(object sender, EventArgs e) { try { if (serialPort1.IsOpen) { Closing = true; while (Listening) Application.DoEvents(); serialPort1.Close(); pictureBox1.Image = Image.FromFile(Application.StartupPath + "http://guan.jpg"); //打開時點擊,則關閉串口 Closing = false; } } catch (System.Exception ex) { MessageBox.Show("串口關閉出錯,請檢查串口連接!", "軟件提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); } } //發送數據 private void ktBtnSend_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) { MessageBox.Show("請打開串口!", "軟件提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); } else { string content = kryptonTextBox1.Text; byte[] bytes = MyClass.StringToHex(content); serialPort1.Write(bytes, 0, bytes.Length); } } //接收數據 private void ktBtnAccept_Click(object sender, EventArgs e) { //Closing = false; int n = serialPort1.BytesToRead; byte[] dbs = new byte[n]; int len = serialPort1.Read(dbs, 0, n); int[] num = new int[len]; string show = ""; show = MyClass.byteToHexStr(dbs); kryptonRichTextBox1.Text += show; } //清空數據 privat
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 十堰市| 九龙县| 平江县| 婺源县| 林西县| 常德市| 三门峡市| 莱州市| 松滋市| 东莞市| 贵阳市| 油尖旺区| 通辽市| 石城县| 天津市| 贵港市| 抚顺县| 宜宾市| 论坛| 二连浩特市| 武城县| 文山县| 淮安市| 资溪县| 乐陵市| 辽宁省| 郁南县| 蒲城县| 连州市| 白山市| 栾城县| 衡山县| 舞阳县| 东丰县| 德化县| 厦门市| 彰化市| 云浮市| 包头市| 尼勒克县| 天台县|