目录
C#串口助手实现两个串口相互通讯
该软件可以实现两个串口之间的相互收发信息,如果没有硬件设备,可以下载一个虚拟的串口软件
虚拟出一对串口进行调试
虚拟串口软件下载
直接下载一个VSPD
资源链接:https://pan.baidu.com/s/1V1Z5r6o6Iek507tzwwcP5A
提取码:mmor
1)点击vspd.exe进行安装:
2)vspd.exe安装成功之后,把该vspdctl.dll文件替换为vspd.exe安装目录下的同名文件,完成破解
3)运行桌面创建的vspd快捷方式即可
软件界面
用panel容器可以使得单选按钮分组
然后自己手动在设计界面添加波特率、停止位、校验位
添加内容完毕
还需要拖拽一个SerialPort助手到软件界面
程序设计
自动扫描电脑串口
先加一个命名空间引用
//自动扫描可用串口并添加到串口号列表上
private void ReflashPortToComboBox(SerialPort serialPort, ComboBox comboBox)
{ //将可用端口号添加到ComboBox
if (!serialPort.IsOpen)//串口处于关闭状态
{
comboBox.Items.Clear();
string[] str = SerialPort.GetPortNames();
if (str == null)
{
MessageBox.Show("本机没有串口!", "Error");
return;
}
//添加串口
foreach (string s in str)
{
comboBox.Items.Add(s);
Console.WriteLine(s);
}
}
else
{
MessageBox.Show("串口处于打开状态不能刷新串口列表", "Error");
}
}
然后在窗口加载的时候调用该函数
private void Form1_Load(object sender, EventArgs e)
{
//取消跨线程访问检查
Control.CheckForIllegalCrossThreadCalls = false;
//自动扫描可用串口
ReflashPortToComboBox(serialPort1,comboBox1);
comboBox1.SelectedIndex = 0;//串口号默认值
comboBox2.SelectedIndex = 4;//波特率默认值9600
comboBox3.SelectedIndex = 0;//停止位默认值1
comboBox4.SelectedIndex = 0;//默认无校验位
//手动注册端口接收事件
serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
}
打开串口
//打开串口按钮
private void button1_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = comboBox1.Text; //将端口绑定给sp类
//设置波特率
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//十进制数据转换
switch (comboBox3.Text.Trim()) //停止位
{
case "1":
serialPort1.StopBits = StopBits.One;
break;
case "2":
serialPort1.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("Error:参数不正确!停止位", "Error");
break;
}
//设置校验位
switch (comboBox4.Text.Trim())
{
case "无":
serialPort1.Parity = Parity.None;
break;
case "奇校验":
serialPort1.Parity = Parity.Odd;
break;
case "偶校验":
serialPort1.Parity = Parity.Even;
break;
default:
MessageBox.Show("Error:参数不正确!校验位", "Error");
break;
}
serialPort1.Open();
button1.Enabled = false;//打开串口按钮不可用
button2.Enabled = true;//关闭串口
}
catch (Exception)
{
MessageBox.Show("端口错误,请检查串口", "错误");
}
}
串口接受
//端口接受事件
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
{
if (!radioButton4.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);
}
}
发送信息
//发送按钮
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();
button1.Enabled = true;//打开串口按钮可用
button2.Enabled = false;//关闭串口按钮不可用
}
}
else
{
for (int i = 0; i < (textBox1.Text.Length - textBox2.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);//发送
}
}
}
}
}
关闭串口
//关闭端口按钮
private void button2_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close();//关闭串口
button1.Enabled = true;//打开串口按钮可用
button2.Enabled = false;//关闭串口按钮不可用
}
catch (Exception err)//一般情况下关闭串口不会出错,所以不需要加处理程序
{
}
}
发送中文
public Form1()
{
InitializeComponent();
serialPort1.Encoding = Encoding.GetEncoding("GB2312"); //串口编码引入GB2312编码(汉字编码)
}
发送中文需要加一句上面的代码
完整代码下载
链接:https://pan.baidu.com/s/155Um2JoVwXyaDh_pcje4Lg
提取码:06fo
如果对你有帮助,就请点赞,谢谢。