最近由于在搭建双目模块,下面使用的是180度舵机。但是使用Arduino自带的调式软件略感不爽,所以研究一下决定自己搞一个出来满足自己一下,增加一下成就感,毕竟不是做软件的,所以这个是不是自己写的这个不是很重要,关键是学习的过程和方法。而且改成满足自己的要求最重要,需求导向型。
本人想到用c#是因为本人学习过一段时间的C#语法,但是不怎么用的到,这个上位机是最初级的,本人感觉还不算入门,以后会更加努力学习。
这个要搭建的对象是不是萌萌哒。废话不多说干货。
效果图:
大致的制作过程:
声明一下本人使用的是vs2013版本。具体的什么版本依你的爱好。
1、建立c#”Windows窗口应用程序“工程
2、安装本人的山寨版的布局先布局好,建议使用groupBox控制把各个模块区分开。本人是这样做的分为4个模块即串口设置、发送格式、发送数据、接受数据,想再次扩展的话也方便。
3、强烈建议把一个模块搞好测试没问题,再去弄下一个模块。
4、程序源码(可以直接复制粘贴到相应模块下)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 初始化版的上位机
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SearchAndAddSerialToComboBox(serialPort1, CKH); //扫描并讲课用串口添加至下拉列表
}
/// <summary>
/// 扫描可用串口
/// </summary>
/// <param name="MyPort"></param>
/// <param name="MyBox"></param>
private void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox)
{ //将可用端口号添加到ComboBox
string[] MyString = new string[20]; //最多容纳20个,太多会影响调试效率
string Buffer; //缓存
MyBox.Items.Clear(); //清空ComboBox内容
for (int i = 1; i < 20; i++) //循环
{
try //核心原理是依靠try和catch完成遍历
{
Buffer = "COM" + i.ToString();
MyPort.PortName = Buffer;
MyPort.Open(); //如果失败,后面的代码不会执行
MyString[i - 1] = Buffer;
MyBox.Items.Add(Buffer); //打开成功,添加至下俩列表
MyPort.Close(); //关闭
}
catch
{
}
}
MyBox.Text = MyString[0]; //初始化
}
/// <summary>
/// 加载框架赋初值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
BTL.Text = "4800";
/*****************非常重要************************/
serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序
}
/// <summary>
/// 串口数据接收
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
{
if (!radioButton3.Checked)//如果接收模式为字符模式
{
string str = serialPort1.ReadExisting();//字符串方式读
textBox2.AppendText(str);//添加内容
}
else
{ //如果接收模式为数值接收
byte data;
data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据
string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
textBox2.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”
//上一句等同为:if(str.Length == 1)
// str = "0" + str;
// else
// str = str;
// textBox1.AppendText("0x" + str);
}
}
/// <summary>
/// 打开串口程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string CommNum = this.CKH.Text;
int IntBdr = Convert.ToInt32(this.BTL.Text);//将波特率和串口号保存起来
if (!serialPort1.IsOpen)
{
serialPort1.PortName = CommNum;
serialPort1.BaudRate = IntBdr;
try
{
serialPort1.Open();//打开串口
CKbutton.Text = "关闭串口";
CKH.Enabled = false;
CKH.Enabled = false;//将串口号与波特率选择控制关闭
}
catch
{
MessageBox.Show("串口打开失败!\n\n可能是串口已补占用");
}
}
else
{
serialPort1.Close();
CKbutton.Text = "打开串口";
CKH.Enabled = true;
CKH.Enabled = true;//将串口号与波特率选择控件打开。
}
}
/// <summary>
/// 串口发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
byte[] Data = new byte[1];//作用同上集
if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
{
if (textBox1.Text != "")
{
if (!radioButton1.Checked)//如果发送模式是字符模式
{
try
{
serialPort1.WriteLine(textBox1.Text);//写数据
}
catch (Exception err)
{
MessageBox.Show("串口数据写入错误", "错误");//出错提示
serialPort1.Close();
}
}
else
{
for (int i = 0; i < (textBox1.Text.Length - textBox1.Text.Length % 2) / 2; i++)//取余3运算作用是防止用户输入的字符为奇数个
{
Data[0] = Convert.ToByte(textBox1.Text.Substring(i * 2, 2), 16);
serialPort1.Write(Data, 0, 1);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
}
if (textBox1.Text.Length % 2 != 0)//剩下一位单独处理
{
Data[0] = Convert.ToByte(textBox1.Text.Substring(textBox1.Text.Length - 1, 1), 16);//单独发送B(0B)
serialPort1.Write(Data, 0, 1);//发送
}
}
}
}
}
}
}
本人开始做的时候在网上查看了很多资料都说简单,但是就是做出不来,后来才想明白,简单只是对于做过的人来说的,现在我也可以说这个东西没想象的那么难,加油。。。。
要是需要急用的话可以联系本人把工程给大家。邮箱:757860682@qq.com。本人以互相学习为目的,希望大家不吝赐教。。