工具: VS2012,下位机(具备串口功能的)
要求:1.有一定的C/C++基础,更容易理解
2.有单片机开发经验,这样调试起来更容易比如串口的程序设计以及串口助手的使用以及相关调试
功能说明:1.选择外部输入的COM口,并且根据需要选择波特率
2.带有错误提醒机制
3.接收和发送:字符模式和数值模式(后续可以接收汉字。。。。。。)
程序如下:
大家在调试过程遇到什么问题可以直接问我
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports; //必须添加引用,否则接收事件处理函数会报错
namespace series_complex2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; //解决多线程问题,程序中存在循环与连续显示的矛盾问题
serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理接收
}
private void Form1_Load(object sender, EventArgs e) // 窗口初始化
{
for (int i = 1; i < 20; i++)
{
comboBox1.Items.Add("COM" + i.ToString());
}
comboBox1.Text = "COM1";//串口号默认值
comboBox2.Text = "9600";//波特率默认值
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) //串口数据接收事件
{
if (!radioButton3.Checked)//如果接收模式为字符模式
{
string str = serialPort1.ReadExisting();//以字符串方式读取数据
textBox1.AppendText(str); //添加内容到显示框里--尾部添加
//textBox1.Text += str;
}
else//如果接收模式为数值模式
{
byte data; //定义一个字节data
data = (byte)serialPort1.ReadByte();//强制转换数据类型为byte型
string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
if(str.Length==1)
{
str ="0"+str;
}
else
str =str;
textBox1.AppendText("0x"+str);
}
}
private void button2_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = comboBox1.Text; //获取端口名
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10); //波特率转换为10进制
serialPort1.Open(); //打开串口
button2.Enabled = false; //打开串口按钮不可用
button3.Enabled = true; //关闭串口按钮可用
}
catch
{
MessageBox.Show("端口错误,请检查串口", "错误");
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close(); //关闭串口
button2.Enabled = true; //打开串口按钮可用
button3.Enabled = false; //关闭串口按钮不可用
}
catch (Exception err)
{
}
}
private void button1_Click(object sender, EventArgs e)
{
byte[] Data = new byte[1]; //定义数组 byte型
if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
{
if (textBox2.Text != "")//如果发送内容不为空
{
if (!radioButton1.Checked)//如果发送模式是字符模式
{
try
{
serialPort1.WriteLine(textBox2.Text); //写数据在缓存区
}
catch(Exception err)
{
MessageBox.Show("串口数据写入错误","错误");//错误提示
}
}
else
{
for(int i=0;i<(textBox2.Text.Length-textBox2.Text.Length%2)/2;i++)//取余3运算作用是防止用户输入的字符为奇数个,如果输入11个字符,i<5,0-5 共5组
{
Data[0]=Convert.ToByte(textBox2.Text.Substring(i*2,2),16);
serialPort1.Write(Data,0,1); //循环发送(如果输入字符为0A0BB,则只能发送0A,0B)
}
if(textBox2.Text.Length%2!=0)//剩下一位单独处理
{
Data[0]=Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length-textBox2.Text.Length%2,textBox2.Text.Length%2),16); //单独发送0B
serialPort1.Write(Data,0,1);//发送
}
}
}
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void button4_Click(object sender, EventArgs e)
{
textBox1.Text = " ";
}
}
}