OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7367|回复: 4
打印 上一主题 下一主题

分享两个C#与VB.net串口例程

[复制链接]

13

主题

3412

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8734
金钱
8734
注册时间
2020-5-11
在线时间
4265 小时
跳转到指定楼层
楼主
发表于 2022-11-27 23:57:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程序采用 Microsoft Visual Studio 2010 中的 Visual Basic 与 Visual C# 编写。
(二者界面的控件可直接复制,这功能很方便)
“串口助手_VBnet1.0”与“串口助手1.0”的功能较全,可通过分割条调节接收区与发送区的大小,
“多字符串发送”可通过文本输入框输入数字发送对应的指令。
“串口test_VB”与“串口test_C#”为简化版,只有基本的串口相关功能。

串口助手_VBnet1.0.rar (116.39 KB, 下载次数: 18)
串口test_VB.rar (74.85 KB, 下载次数: 22)
串口助手1.0_C#.rar (93.01 KB, 下载次数: 29)
串口test_C#.rar (56.2 KB, 下载次数: 23)
部分代码:
  1. //--------------------------------------------------
  2.         //发送字符串,tHex为true时字符串转为hex 来发送
  3.         //--------------------------------------------------
  4.         private void SendStr(string str, bool tHex)
  5.         {
  6.             int i, slen;
  7.             int n;
  8.             string str0, str1 = "", str2 = "";
  9.             byte[] txbuf = { };
  10.             slen = 0;
  11.             n = 0;
  12.             if (str == "") return;
  13.             if (SerialPort1.IsOpen == false) return;
  14.             if (tHex == true)//hex 发送
  15.             {
  16.                 for (i = 0; i < str.Length; i++)
  17.                 {
  18.                     //if (((str[i] >= '0') && (str[i] <= '9')) || ((str[i] >= 'a') && (str[i] <= 'f'))|| ((str[i] >= 'A') && (str[i] <= 'F')))//提取16进制字符         
  19.                     if (isHex(str[i]) == true)
  20.                     {
  21.                         str1 = str1 + str[i];
  22.                         n++;
  23.                     }
  24.                     else//处理只有一个字符的情况如:1 23 4 56
  25.                     {
  26.                         if (n == 1)
  27.                         {
  28.                             n++;
  29.                         }
  30.                     }
  31.                     if (i == (str.Length - 1))//结尾单个字符的情况:12 3
  32.                     {
  33.                         if (n == 1)
  34.                         {
  35.                             n++;
  36.                         }
  37.                     }
  38.                     if (n >= 2)//两个字符之后添加空格
  39.                     {
  40.                         str2 = str2 + str1 + " ";
  41.                         n = 0;
  42.                         str1 = "";
  43.                     }
  44.                 }
  45.                 if (str2.Length > 0)//有数据才发送
  46.                 {
  47.                     string[] s = str2.Trim().Split(' ');
  48.                     txbuf = new byte[s.Length];
  49.                     for (i = 0; i < s.Length; i++)//16进制字符串转数组
  50.                     {
  51.                         txbuf[i] = Convert.ToByte(s[i], 16);
  52.                     }
  53.                 }
  54.             }
  55.             else//字符串发送
  56.             {
  57.                 txbuf = System.Text.Encoding.GetEncoding("Gb2312").GetBytes(str);
  58.             }
  59.             if (txbuf.Length > 0)//长度大于0才发
  60.             {
  61.                 SerialPort1.Write(txbuf, 0, txbuf.Length);
  62.                 n_txd = (n_txd + txbuf.Length) ;// '防溢出
  63.                 LabTxn.Text = n_txd.ToString();
  64.             }
  65.         }
  66. //串口接收中断
  67.         private void UartRx()
  68.         {
  69.             int i, n, r;
  70.             string apdstr = "", s1 = "";
  71.             byte[] rbuf = { };
  72.             //serialPort1.ReadByte();读单字节
  73.             n = SerialPort1.BytesToRead;
  74.             rbuf = new byte[n];
  75.             SerialPort1.Read(rbuf, 0, n);//读多字节
  76.             //直接转换文本,如果中文断帧则会乱码
  77.             //TextBox1.AppendText(System.Text.Encoding.GetEncoding("Gb2312").GetString(rbuf))
  78.             //为便于处理中文,添加状态机处理
  79.             for (i = 0; i < n; i++)
  80.             {
  81.                 //TxtRxd.AppendText(rbuf[i].ToString() );
  82.                 r = rbuf[i];               
  83.                 rec_hex1 = rec_hex1 + r.ToString("X2") + " ";

  84.                 if (u_rcha > 0)// '中文低字节
  85.                 {
  86.                     r = u_rcha * 256 + r;
  87.                     rec_str1 = rec_str1 + Asc2C(r); //(char)(r);
  88.                     u_rcha = 0;
  89.                 }
  90.                 else
  91.                 {
  92.                     if (r < 128)//'英文
  93.                     {                        
  94.                         rec_str1 = rec_str1 + (char)r;// Convert.ToString(r);
  95.                     }
  96.                     else //'中文高字节
  97.                     {
  98.                         u_rcha = r;
  99.                     }
  100.                 }
  101.             }
  102.             //'-------------------------存储收到的字符串            
  103.             rec_hex = rec_hex + rec_hex1;            
  104.             rec_str = rec_str + rec_str1;            
  105.             n_rxd = (n_rxd + n) ;
  106.             LabRxn.Text = n_rxd.ToString();
  107.             //'-------------------------添加当前字符串到TxtRxd
  108.             if (ChkRhex.Checked == true)//'hex显示
  109.                 apdstr = rec_hex1; //'TxtRxd.AppendText(rec_hex1)
  110.             else
  111.                 apdstr = rec_str1; //'TxtRxd.AppendText(rec_str1)
  112.             TxtRxd.AppendText(apdstr);//添加到末尾            
  113.         }
复制代码
  1. '--------------------------------------------------
  2.     '发送字符串,tHex为true时字符串转为hex 来发送
  3.     '--------------------------------------------------
  4.     Private Sub SendStr(ByRef str As String, ByVal tHex As Boolean)
  5.         Dim slen As Long '要发送的长度
  6.         'Dim ts As Long
  7.         Dim state As Integer
  8.         Dim i As Long
  9.         Dim str0 As String, str1 As String = "", str2 As String = ""
  10.         slen = 0
  11.         state = 0

  12.         If str = "" Then Exit Sub '字符串为空,不处理
  13.         If SerialPort1.IsOpen = False Then Exit Sub '串口没打开,不处理

  14.         If tHex = True Then  'hex 发送
  15.             '将字符串中的HEX存入str1
  16.             'ts = DateTime.Now.Millisecond
  17.             ReDim u_txbuf((str.Length + 1) / 2)
  18.             For i = 0 To str.Length - 1 '16进制字符串转数组
  19.                 str0 = str.Substring(i, 1)
  20.                 Select Case state
  21.                     Case 0
  22.                         If isHex(str0) = True Then
  23.                             u_txbuf(slen) = Val("&H" & str0)
  24.                             slen = slen + 1 '只要有一个字符就长度加1
  25.                             state = 1
  26.                         End If
  27.                     Case 1
  28.                         If isHex(str0) = True Then
  29.                             u_txbuf(slen - 1) = u_txbuf(slen - 1) * 16 + Val("&H" & str0) '上一字符乘16加本字符
  30.                         End If
  31.                         state = 0
  32.                 End Select
  33.             Next
  34.             ReDim Preserve u_txbuf(slen - 1)
  35.             'Debug.Print("转换时间:" & DateTime.Now.Millisecond - ts)
  36.             'u_txbuf = {}
  37.         Else    '字符串发送
  38.             u_txbuf = System.Text.Encoding.GetEncoding("Gb2312").GetBytes(str)
  39.         End If

  40.         If u_txbuf.Length > 0 Then '长度大于0才发
  41.             SerialPort1.Write(u_txbuf, 0, u_txbuf.Length)
  42.             'n_txd += u_txbuf.Length
  43.             n_txd = (n_txd + u_txbuf.Length) And &H6FFFFFFF '防溢出
  44.             LabTxn.Text = n_txd
  45.         End If
  46.     End Sub
  47. '接收中断
  48.     Private Sub uartint(ByVal sender As Object, ByVal e As EventArgs)
  49.         Dim n As Integer, i As Integer, r As Integer
  50.         Dim apdstr As String
  51.         rec_hex1 = ""
  52.         rec_str1 = ""
  53.         n = SerialPort1.BytesToRead
  54.         Dim rbuf(0 To n - 1) As Byte
  55.         SerialPort1.Read(rbuf, 0, n) '批量读取
  56.         n_rxd = (n_rxd + n) '接收计数
  57.         LabRxn.Text = n_rxd
  58.         '如果中文高低字节间有分包,直接转码是会有乱码的
  59.         'TextBox1.AppendText(System.Text.Encoding.GetEncoding("Gb2312").GetString(rbuf))
  60.         '利用状态机处理中文
  61.         For i = 0 To n - 1
  62.             r = rbuf(i)
  63.             rec_hex1 = rec_hex1 & Strings.Right("0" & Hex(rbuf(i)), 2) & " " '数据转HEX字符串
  64.             If u_rcha > 0 Then '中文低字节
  65.                 r = u_rcha * 256 + r
  66.                 rec_str1 = rec_str1 & Chr(r)
  67.                 u_rcha = 0
  68.             Else
  69.                 If r < 128 Then '英文                    
  70.                     rec_str1 = rec_str1 & Chr(r)
  71.                 Else '中文高字节
  72.                     u_rcha = r
  73.                 End If
  74.             End If
  75.         Next
  76.         rec_hex = rec_hex & rec_hex1 '记录HEX
  77.         rec_str = rec_str & rec_str1 '记录文本
  78.         '-------------------------添加当前字符串到TxtRxd
  79.         If ChkRhex.Checked = True Then 'hex显示
  80.             apdstr = rec_hex1 'TxtRxd.AppendText(rec_hex1)
  81.         Else
  82.             apdstr = rec_str1 'TxtRxd.AppendText(rec_str1)
  83.         End If
  84.         TxtRxd.AppendText(apdstr) '添加到文本框
  85.     End Sub
复制代码


专治疑难杂症
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

351

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2022-4-20
在线时间
386 小时
2#
发表于 2022-11-29 17:08:53 | 只看该作者
请问一下1.0 C#的那个,自动发送是用什么实现的?
又菜又爱指点
回复 支持 反对

使用道具 举报

13

主题

3412

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8734
金钱
8734
注册时间
2020-5-11
在线时间
4265 小时
3#
 楼主| 发表于 2022-11-29 17:24:26 | 只看该作者
驭剑的秘密 发表于 2022-11-29 17:08
请问一下1.0 C#的那个,自动发送是用什么实现的?

定时器调用“发送”按钮的函数
专治疑难杂症
回复 支持 反对

使用道具 举报

54

主题

351

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2022-4-20
在线时间
386 小时
4#
发表于 2022-11-29 17:54:42 | 只看该作者
LcwSwust 发表于 2022-11-29 17:24
定时器调用“发送”按钮的函数

请问一下这样报错是因为什么?
又菜又爱指点
回复 支持 反对

使用道具 举报

13

主题

3412

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8734
金钱
8734
注册时间
2020-5-11
在线时间
4265 小时
5#
 楼主| 发表于 2022-11-29 19:23:24 | 只看该作者
驭剑的秘密 发表于 2022-11-29 17:54
请问一下这样报错是因为什么?

我这边没问题

专治疑难杂症
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-31 23:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表