C# winform中 接受串口数据,将数据包里的3个数据分别写进3个数组里面

易小侠
C/C++领域新星创作者
2016-04-28 11:03:20


协议: 帧头+数据长度+数1+数2+数3+校验和

即: 88+06+xxxx+yyyy+zzzz +mm 16进制


将数1 数2 数3写进3个数组里面 x[] y[] z[]

求完整程序 (包括怎样判断一个数据包。。)
...全文
284 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
易小侠 2016-05-06
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
上面漏字了,更正: 数据完整性验证少不了,否则校验位就失去意义了。
你可以给我一个类似串口数据解析的C#程序么,分全给你 协议 加C#解析
xian_wwq 2016-04-29
  • 打赏
  • 举报
回复
对于数据完整性验证少不了,否则就需要校验位了。 1.数据不完整,得继续接收,保证数据完整。 2.如果出现大量乱码,得查发送和接受环节,否则无法解决 另外 string[] x = new string[sub.Length]; 不能放在循环里头,否则出了{}就无效了
xian_wwq 2016-04-29
  • 打赏
  • 举报
回复
上面漏字了,更正: 数据完整性验证少不了,否则校验位就失去意义了。
  • 打赏
  • 举报
回复
88 06是固定值?那校验值mm怎么得出 还是你只要将这个字符串的结果分别解析放入已经存在的x,y,z数组?
易小侠 2016-04-28
  • 打赏
  • 举报
回复
[quote=引用 3 楼 xian_wwq 的回复:]
引用
格式固定,使用字符串split就可以完成,例如

  string input0 = "880611112222333355880611112222333355880611112222333355";
            input0 = input0.Replace("55", "-");
            input0 = input0.Replace("8806", "");
            string[] sub = input0.Split('-');

            foreach (string subStr in sub)
            {
                if (!string.IsNullOrEmpty(subStr))
                {
                     int x = Convert.ToInt32(subStr.Substring(0, 4));
                     int y = Convert.ToInt32(subStr.Substring(4, 4));
                    ...
                }
            }
按照你的思路 我做了修改 input0 = input0.Replace("55", "-"); input0 = input0.Replace("8806", ""); string[] sub = input0.Split('-'); //sub[]就是一个数据包xxxxyyyyzzzz for (int j = 0; j < sub.Length; j++) { string[] x = new string[sub.Length]; string[] y = new string[sub.Length]; string[] z = new string[sub.Length]; x[j] = sub[j].Substring(0, 4); //截取 y[j] = sub[j].Substring(4, 4); z[j] = sub[j].Substring(8, 4); } 另一个问题,如果出现乱码,数据缺少怎么办 @#¥%@#¥%8806xxxxyyyyzzzz55 //@#¥%是开始接收数据的乱码 又比如8806xxxxyyyyzzzz558806xxxxyyy //数据缺少
xian_wwq 2016-04-28
  • 打赏
  • 举报
回复
引用
textBox得到的结果是 8806xxxxyyyyzzzz558806xxxxyyyyzzzz558806xxxxyyyyzzzz55循环 我想把xxxx yyyy zzzz分别保存到3个数组里。请问怎么写。
格式固定,使用字符串split就可以完成,例如

  string input0 = "880611112222333355880611112222333355880611112222333355";
            input0 = input0.Replace("55", "-");
            input0 = input0.Replace("8806", "");
            string[] sub = input0.Split('-');

            foreach (string subStr in sub)
            {
                if (!string.IsNullOrEmpty(subStr))
                {
                     int x = Convert.ToInt32(subStr.Substring(0, 4));
                     int y = Convert.ToInt32(subStr.Substring(4, 4));
                    ...
                }
            }
易小侠 2016-04-28
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
88 06是固定值?那校验值mm怎么得出 还是你只要将这个字符串的结果分别解析放入已经存在的x,y,z数组?
那就把校验值换成帧尾55吧 88 06是固定值 我的程序是 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { byte data; data = (byte)serialPort1.ReadByte(); string str = Convert.ToString(data, 16).ToUpper(); textBox1.AppendText((str.Length == 1 ? "0"+str:str)); } textBox得到的结果是 8806xxxxyyyyzzzz558806xxxxyyyyzzzz558806xxxxyyyyzzzz55循环 我想把xxxx yyyy zzzz分别保存到3个数组里。请问怎么写。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧