首页 > 编程语言 >C# 串口助手

C# 串口助手

时间:2024-09-25 21:53:42浏览次数:3  
标签:string C# Text void private buffer 助手 串口 new

以实现下图效果为例:

 private void Form1_Load(object sender, EventArgs e)
 {
     BindPort();
     BindBaudRate();
     BindStopBits();
     BindDateBits();
     BindParity();
     SettingDDefault();
 }

 #region 绑定参数

 //端口
 private void BindPort()
 {
     string[] arr = SerialPort.GetPortNames();//拿到计算机中所有可用端口
     if (arr.Length == 0)
     {
         MessageBox.Show("没有搜索到可用串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
     cbbPort.DataSource = arr;
 }

 //波特率
 private void BindBaudRate()
 {
     List<int> list = new List<int>()
     {
         1382400,
         921600,
         460800,
         256000,
         230400,
         128000,
         115200,
         76800,
         57600,
         43000,
         38400,
         19200,
         14400,
         9600,
         4800,
         2400,
         1200
     };
     cbbBaudRate.DataSource = list;
 }

 //停止位
 private void BindStopBits()
 {
     List<StopBit> list = new List<StopBit>()
     {
         new StopBit(){Text="0",Value="None"},
         new StopBit(){Text="1",Value="One"},
         new StopBit(){Text="1.5",Value="OnePointFive"},
         new StopBit(){Text="2",Value="Two"}
     };
     cbbStopBits.DataSource = list;
     cbbStopBits.DisplayMember = "Text";
     cbbStopBits.ValueMember = "Value";
 }

 //数据位
 private void BindDateBits()
 {
     List<int> list = new List<int>()
     {
         8,
         7,
         6,
         5
     };
     cbbDateBits.DataSource = list;
 }

 //校验位
 private void BindParity()
 {
     List<ParityModel> list = new List<ParityModel>()
     {
         new ParityModel(){Text="无校验",Value="None"},
         new ParityModel(){Text="奇校验",Value="Odd"},
         new ParityModel(){Text="偶校验",Value="Even"},
         new ParityModel(){Text="标记校验",Value="Mark"},
         new ParityModel(){Text="空白校验",Value="Space"}
     };
     cbbParity.DataSource = list;
     cbbParity.DisplayMember = "Text";
     cbbParity.ValueMember = "Value";
 }
 #endregion

 private void SettingDDefault()
 {
     cbbBaudRate.Text = ConfigurationManager.AppSettings["BaudRate"];
     cbbStopBits.SelectedValue = ConfigurationManager.AppSettings["StopBits"];
     cbbDateBits.Text = ConfigurationManager.AppSettings["DateBits"];
     cbbParity.SelectedValue = ConfigurationManager.AppSettings["Parity"];
 }


 //打开串口
 private void btnSerialPort_Click(object sender, EventArgs e)
 {
     try
     {
         if (!serialPort1.IsOpen) //设置默认值
         {
             serialPort1.PortName = cbbPort.Text;//设置端口
             serialPort1.BaudRate = Convert.ToInt32(cbbBaudRate.Text);//设置波特率
             serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cbbStopBits.SelectedValue.ToString());//设置停止位
             serialPort1.DataBits = Convert.ToInt32(cbbDateBits.Text);//设置数据位
             serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), cbbParity.SelectedValue.ToString());//设置校验位

             serialPort1.Open();//打开串口

             btnSerialPort.Text = "关闭窗口";
             MessageBox.Show("打开成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
         }
         else
         {
             serialPort1.Close();
             btnSerialPort.Text = "打开串口";
             MessageBox.Show("关闭成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
         }

     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }

 private void btnSend_Click(object sender, EventArgs e)
 {
     if (!serialPort1.IsOpen)
     {
         MessageBox.Show("请打开串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
     }
     if (string.IsNullOrEmpty(rtbSend.Text))
     {
         MessageBox.Show("请输入文本", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
     }

     //换行
     if (cbNewRow.Checked)
     {
         //把字符串转成byte[]  ,处理中文乱码
         byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text + "\r\n");
         serialPort1.Write(buffer, 0, buffer.Length);
     }
     else
     {
         byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text);
         serialPort1.Write(buffer, 0, buffer.Length);
     }
 }


 //接收数据
 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
 {
     SerialPort sp = (SerialPort)sender;

     byte[] buffer = new byte[sp.BytesToRead];
     sp.Read(buffer, 0, buffer.Length);

     // 这里放置需要在 UI 线程执行的代码
     Invoke(new Action(() =>
     {
         if (cbHexShow.Checked)
         {
             rtbDisplayInfo.Text += HexByteConvert.ByteToHexString(buffer);
         }
         else 
         {
             //把字节数组转成字符串
             rtbDisplayInfo.Text += Encoding.UTF8.GetString(buffer, 0, buffer.Length);
         }
     }));
 }


 //白底黑字
 private void cbWhite_CheckedChanged(object sender, EventArgs e)
 {
     CheckBox checkBox = (CheckBox)sender;
     if (checkBox.Checked)
     {
         rtbDisplayInfo.BackColor = Color.White;
         rtbDisplayInfo.ForeColor = Color.Black;
     }
     else
     {
         rtbDisplayInfo.BackColor = Color.Black;
         rtbDisplayInfo.ForeColor = Color.FromArgb(0, 192, 0);
     }
 }

 
 //定时发送
 private void cbTimeSend_CheckedChanged(object sender, EventArgs e)
 {
     CheckBox checkBox = (CheckBox)sender;
     if (checkBox.Checked)
     {
         if (!serialPort1.IsOpen)
         {
             MessageBox.Show("请打开串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
             checkBox.Checked = false;
             return;
         }
         if (string.IsNullOrWhiteSpace(tbTimeInterval.Text))
         {
             MessageBox.Show("请输入周期", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
             checkBox.Checked = false;
             return;
         }

         timer1.Interval = Convert.ToInt32(tbTimeInterval.Text);
         timer1.Enabled = true;
         tbTimeInterval.Enabled = false;
     }
     else
     {
         timer1.Enabled = false;
         tbTimeInterval.Enabled = true;
     }
 }

 private void timer1_Tick(object sender, EventArgs e)
 {
     if (string.IsNullOrWhiteSpace(rtbSend.Text)) return;

     //换行
     if (cbNewRow.Checked)
     {
         byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text + "\r\n");
         serialPort1.Write(buffer, 0, buffer.Length);
     }
     else
     {
         byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text);
         serialPort1.Write(buffer, 0, buffer.Length);
     }
 }

 //以16进制发送
 private void cbHexSend_CheckedChanged(object sender, EventArgs e)
 {
     if (!string.IsNullOrWhiteSpace(rtbSend.Text))
     {
         CheckBox cb = (CheckBox)sender;
         if (cb.Checked)
         {
             byte[] buffer = Encoding.UTF8.GetBytes(rtbSend.Text);
             string str = HexByteConvert.ByteToHexString(buffer);
             rtbSend.Text = str.Trim();
         }
         else
         {
             byte[] buffer = HexByteConvert.HexStringToByte(rtbSend.Text);
             string str = Encoding.UTF8.GetString(buffer);
             rtbSend.Text = str;
         }
     }
 }


 //以16进制显示
 private void cbHexShow_CheckedChanged(object sender, EventArgs e)
 {
     if (string.IsNullOrWhiteSpace(rtbDisplayInfo.Text)) return;
     CheckBox checkBox = (CheckBox)sender;
     if (checkBox.Checked)
     {
         byte[] bbuffer = Encoding.UTF8.GetBytes(rtbDisplayInfo.Text.Trim());
         string str = HexByteConvert.ByteToHexString(bbuffer);
         rtbDisplayInfo.Text = str;
     }
     else
     {
         byte[] buffer = HexByteConvert.HexStringToByte(rtbDisplayInfo.Text.Trim());
         string str = Encoding.UTF8.GetString(buffer);
         rtbDisplayInfo.Text = str;
     }
 }

 
  // 判断输入是否是16进制格式的字符串,但也可以包含空格
 private bool IsHex(string input)
 { 
     Regex hexadecimal = new Regex("^[A-Fa-f0-9\\s]+$");
     return hexadecimal.IsMatch(input);
 }

 //限制以16进制发送时,rtbSend 输入框的输入
 private void rtbSend_TextChanged(object sender, EventArgs e)
 {
     RichTextBox richTextBox = (RichTextBox)sender;
     if (richTextBox != null && !string.IsNullOrWhiteSpace(richTextBox.Text) && cbHexSend.Checked)
     {
         bool result = IsHex(richTextBox.Text);
         if (!result)
         {
             MessageBox.Show("请输入正确格式0-9 a-f A-F,例如:01 0d 0a");
             richTextBox.Text = "";
         }
     }
 }


 //清除接收
 private void btnClear_Click(object sender, EventArgs e)
 {
     rtbDisplayInfo.Text = "";
 }

其中引用的类:

 public  class StopBit
 {
     public string Text { get; set; }
     public string Value { get; set; }
 }


  public class ParityModel
 {
     public string Text { get; set; }
     public string Value { get; set; }
 }


  public class HexByteConvert
 {
     /// <summary>
     /// 把字节数组转换成16进制的字符串,以空格分割,如:68 65 6C 6C 6F
     /// </summary>
     /// <param name="data">字节数组</param>
     /// <returns>16进制的字符串</returns>
     public static string ByteToHexString(byte[] data)
     {
         string result = string.Empty;
         for (int i = 0; i < data.Length; i++)
         {
             result += data[i].ToString("X2") + " ";
         }
         return result;
     }

     /// <summary>
     /// 把16进制的字符串转换成字节数组
     /// </summary>
     /// <param name="hexString">16进制的字符串,以空格分割</param>
     /// <returns>字节数组</returns>
     public static byte[] HexStringToByte(string hexString, int fromBase = 16)
     {
         string[] strs = hexString.Split(' ');
         byte[] result = new byte[strs.Length];
         for (int i = 0; i < strs.Length; i++)
         {
             result[i] = Convert.ToByte(strs[i], fromBase);
         }
         return result;  
     }
 }

标签:string,C#,Text,void,private,buffer,助手,串口,new
From: https://blog.csdn.net/hcyily/article/details/142501452

相关文章

  • 鸿蒙HarmonyOS HCIP认证题库
    鸿蒙HarmonyOSHCIP认证题库学习分享,本题库一共409道。反复刷考场得来,手打不易。记住不要光背选项,考试时可能打乱顺序,主要还是记住内容。一、单选题和填空题1.某开发者想要使用类Web开发范式的属性样式动画设置text组件的颜色变化动效,以下代码空白处应该填写什么?text......
  • 【Azure Event Hub】关于Event Hub指标 ConsumerLag 的解释
    问题描述在使用AzureEventHub的过程中,需要监控消费端是否正常消费数据?而常规的指标只有IncomingMessage,OutgoingMessage,是否指标能表明当前EventHub消费滞后,即Incoming数量远远大于Outgoing呢?IncomingMessages :发布到事件中心的消息数。OutgoingMessages :从事件中心使......
  • javaScript 值的比较
    值的比较值的比较是指判断两个数的大小,返回一个布尔值。  比较运算符列表:   大于>  小于<  大于等于>= 小于等于<= 等于== 严格等于===不进行类型转换不等于!= 严格不等于!==不进行类型转换 字符串比较大小字符串间的比较大小遵循以下规则:1比较字符串首字母的大小。......
  • 红米ac2100路由器刷breed和openwrt教程
    刷入Breed参考教程:https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=4066963&highlight=ˢbreedhttps://www.bilibili.com/video/BV1114y1X7TA/?vd_source=4866b7cfde4a08de2ba06a6ef4c96869固件以及资源下载:https://yecss.lanzoul.com/i1N0H2aup7te正文:1.事......
  • JavaScript中if嵌套 assert
    在JavaScript中,通常我们不会直接使用assert这个词,因为JavaScript标准库中并没有直接提供assert函数(尽管在一些测试框架如Jest、Mocha中经常看到)。但是,我们可以模拟一个assert函数的行为,即当某个条件不满足时抛出一个错误。结合if语句进行嵌套判断时,可以在每个需要断言的地方调用这......
  • x509: cannot validate certificate for 192.168.0.56 because it doesn't contain an
    containerd里无法拉取镜像无法从私建的harbor上拉取报错FATA[0000]pullingimage:rpcerror:code=Unknowndesc=failedtopullandunpackimage x509:cannotvalidatecertificatefor192.168.0.56becauseitdoesn'tcontainanyIPSANs 若是配置之后还是一直报x5......
  • 2024.9.24 Python与C++面试八股文
    1.externextern关键字用于在多个文件中引用同一个全局变量的声明在一个头文件中,如果这个变量声明了,但是在cpp文件中没找到他的定义,那么编译就会报错,但是如果加了extern,编译器就不会给头文件报错,而是给cpp文件报错,如果函数没定义的话。或者定义出错的话。2.关于反复调用简......
  • 【c++实战项目】从零实现一个高并发内存池
    主页:醋溜马桶圈-CSDN博客专栏:实战项目_醋溜马桶圈的博客-CSDN博客gitee:mnxcc(mnxcc)-Gitee.com目录1.项目介绍1.1 这个项目做的是什么?1.2这个项目的要求的知识储备和难度?2.什么是内存池2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4malloc3.开胃......
  • [GYM103119K][2020 ICPC Asia Macau] Candy Ads 题解
    题意简述有\(n\)个广告,每个广告在一个时间段内占据二维平面的矩形,\(m\)个约束表示两个广告至少有一个要被选择,选择若干广告,满足所有约束且同时刻不能有重叠的广告。Kosaraju算法流程在正图上跑一遍DFS,给每个位置打上时间戳从时间戳大到小枚举点,在反图上跑DFS,这个时候对......
  • PCB板缺陷检测识别系统
    PCB板缺陷检测识别系统通过机器视觉技术,PCB板缺陷检测识别系统对作业现场PCB是否存在缺陷部分进行实时分析检测,当PCB板缺陷检测识别系统检测到PCB本身存在缺陷的时候,立即抓拍存档告警同时将检测到的缺陷进行分类分析,方便后期工厂对生产线针对性的进行调整改进,从而提高良品率降低生......