串口助手收不到数据

qq_36435339 2017-04-17 05:01:39
买了一个优利德UT61-E系列的数显万用表想进行二次开发,用串口助手可以收到万用表发送过来的数据,自己写的串口助手收不到! 求大神帮助
...全文
575 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zy100Papa 2019-07-07
  • 打赏
  • 举报
回复
用device-monitoring-studio.7.25这个串口软件监控看一下,串口的打开,关闭,发送接收数据都能看得到的。
很有用
qq_45360480 2019-07-06
  • 打赏
  • 举报
回复
你要给4口供电,5接地
dingzyi 2017-05-08
  • 打赏
  • 举报
回复
把协议数据简单的放在text里面,直接发送看看,一般协议都是有校验的,串口设置要和仪表一样。
lawesly 2017-05-08
  • 打赏
  • 举报
回复
串口接收跟波特率数据校验位等配置也都有关的,看你的完整配置
qq_36435339 2017-04-17
  • 打赏
  • 举报
回复
跪求大神帮忙啊!感激不尽。。。。
qq_36435339 2017-04-17
  • 打赏
  • 举报
回复
//数据接收函数 void serialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e) { if (closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 try { listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 receiveCount += n;//增加接收计数 serialPort1.Read(buf, 0, n);//读取缓冲数据 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //<协议解析> bool data_1_catched = false;//缓存记录数据是否捕获到 //1.缓存数据 buffer.AddRange(buf); //2.完整性判断 while (buffer.Count >= 4)//至少要包含头(2字节)+长度(1字节)+校验(1字节) { //请不要担心使用>=,因为>=已经和>,<,=一样,是独立操作符,并不是解析成>和=2个符号 //2.1 查找数据头 if (buffer[0] == 0xAA && buffer[1] == 0x44) { //2.2 探测缓存数据是否有一条数据的字节,如果不够,就不用费劲的做其他验证了 //前面已经限定了剩余长度>=4,那我们这里一定能访问到buffer[2]这个长度 int len = buffer[2];//数据长度 //数据完整判断第一步,长度是否足够 . //len是数据段长度,4个字节是while行注释的3部分长度 if (buffer.Count < len + 4) break;//数据不够的时候什么都不做 //这里确保数据长度足够,数据头标志找到,我们开始计算校验 //2.3 校验数据,确认数据正确 //异或校验,逐个字节异或得到校验码 byte checksum = 0; for (int i = 0; i < len + 3; i++)//len+3表示校验之前的位置 { checksum ^= buffer[i]; } if (checksum != buffer[len + 3]) //如果数据校验失败,丢弃这一包数据 { buffer.RemoveRange(0, len + 4);//从缓存中删除错误数据 continue;//继续下一次循环 } //至此,已经被找到了一条完整数据。我们将数据直接分析,或是缓存起来一起分析 //我们这里采用的办法是缓存一次,好处就是如果你某种原因,数据堆积在缓存buffer中 //已经很多了,那你需要循环的找到最后一组,只分析最新数据,过往数据你已经处理不及时 //了,就不要浪费更多时间了,这也是考虑到系统负载能够降低。 buffer.CopyTo(0, binary_data_1, 0, len + 4);//复制一条完整数据到具体的数据缓存 data_1_catched = true; buffer.RemoveRange(0, len + 4);//正确分析一条数据,从缓存中移除数据。 } else { //这里是很重要的,如果数据开始不是头,则删除数据 buffer.RemoveAt(0); } } //分析数据 if (data_1_catched) { //我们的数据都是定好格式的,所以当我们找到分析出的数据1,就知道固定位置一定是这些数据,我们只要显示就可以了 string data = binary_data_1[3].ToString("X2") + " " + binary_data_1[4].ToString("X2") + " " + binary_data_1[5].ToString("X2") + " " + binary_data_1[6].ToString("X2") + " " + binary_data_1[7].ToString("X2"); //更新界面 this.Invoke((EventHandler)(delegate { txtReceive.Text = data; })); } //如果需要别的协议,只要扩展这个data_n_catched就可以了。往往我们协议多的情况下,还会包含数据编号,给来的数据进行 //编号,协议优化后就是: 头+编号+长度+数据+校验 //</协议解析> ///////////////////////////////////////////////////////////////////////////////////////////////////////////// builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16禁止 if (chbHEXPlay.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 this.txtReceive.AppendText(builder.ToString()); //修改接收计数 lblReceiveCount.Text = "Get:" + receiveCount.ToString(); })); } finally { listening = false;//我用完了,ui可以关闭串口了。 } }

111,092

社区成员

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

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

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