串口接收数据不全

takpod 2015-05-20 09:56:50
我用超级终端可以接收到数据,但我自己只能收到一半为什么 呢?哪里出错了?



...全文
592 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-03-29
  • 打赏
  • 举报
回复
引用 11 楼 takpod 的回复:
[quote=引用 6 楼 zyl_leilei 的回复:] 这是我以前做的,你可以试一下,可能是比较笨的方法,发送指令后是休眠了一秒才去接收的返回数据。

byte[] temp3 = mysendb("FF FF 02 02 FF FF");//结束操作
            byte[] temp1 = mysendb("FF FF 00 00 FF FF"); //复位指令
            byte[] temp2 = mysendb("FF FF 01 01 01 03 30 FF FF"); //设置操作时间指令
            
            try
            {
                if (!serialPort1.IsOpen)
                {
                    serialPort1.Open();
                }
                
                 serialPort1.Write(temp1, 0, 6);//发送复位数据
                 Thread.Sleep(1000);
                 byte[] recb = new byte[6];//接收复位返回值
                 int iffuwei = serialPort1.Read(recb, 0, 6);
                 if (iffuwei != 6)
                 {
                     MessageBox.Show("复位未成功!");
                     timer1.Start();
                     return;
                 }
                 Thread.Sleep(1000);
                 serialPort1.Write(temp2, 0, 9);//发送考核数据

                timer1.Stop();
                //启动定时
                timer3.Interval = 1000;
                timer3.Start();
            }
            catch
            {
                timer1.Start();
                return;
            }
谢谢你 我已经找到方法了[/quote] 兄台怎么解决的?
takpod 2015-05-22
  • 打赏
  • 举报
回复
引用 6 楼 zyl_leilei 的回复:
这是我以前做的,你可以试一下,可能是比较笨的方法,发送指令后是休眠了一秒才去接收的返回数据。

byte[] temp3 = mysendb("FF FF 02 02 FF FF");//结束操作
            byte[] temp1 = mysendb("FF FF 00 00 FF FF"); //复位指令
            byte[] temp2 = mysendb("FF FF 01 01 01 03 30 FF FF"); //设置操作时间指令
            
            try
            {
                if (!serialPort1.IsOpen)
                {
                    serialPort1.Open();
                }
                
                 serialPort1.Write(temp1, 0, 6);//发送复位数据
                 Thread.Sleep(1000);
                 byte[] recb = new byte[6];//接收复位返回值
                 int iffuwei = serialPort1.Read(recb, 0, 6);
                 if (iffuwei != 6)
                 {
                     MessageBox.Show("复位未成功!");
                     timer1.Start();
                     return;
                 }
                 Thread.Sleep(1000);
                 serialPort1.Write(temp2, 0, 9);//发送考核数据

                timer1.Stop();
                //启动定时
                timer3.Interval = 1000;
                timer3.Start();
            }
            catch
            {
                timer1.Start();
                return;
            }
谢谢你 我已经找到方法了
takpod 2015-05-20
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
用sp的异步接收回调函数也一样 它也并不能区分什么时候算一个完整的数据 所以任何时候执行这个回调都是有可能的 比如对方给你发了16个字节,可能接收到8个字节,它就已经执行了 你需要先把接收到的内容放到list<byte>里,然后再次接收到数据之后拼接到后面
如果我想实现发送完毕 立刻等待返回的接收 应该怎么写? sp1.ReadTimeout=500; sp1.ReadLine();//这个是阻塞函数,但是读不到数据, //---------------- 接收完毕后全部的数据可以用以下函数来读 int n= sp1.BytesToRead; byte[] buf= new byte[n] sp1.Read(buf,0.n);//这样就可以将此前的数据读出来 //但问题是我不知什么时候才是接收完毕 ?
takpod 2015-05-20
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
用sp的异步接收回调函数也一样 它也并不能区分什么时候算一个完整的数据 所以任何时候执行这个回调都是有可能的 比如对方给你发了16个字节,可能接收到8个字节,它就已经执行了 你需要先把接收到的内容放到list<byte>里,然后再次接收到数据之后拼接到后面
明白了,我试一下
於黾 2015-05-20
  • 打赏
  • 举报
回复
用sp的异步接收回调函数也一样 它也并不能区分什么时候算一个完整的数据 所以任何时候执行这个回调都是有可能的 比如对方给你发了16个字节,可能接收到8个字节,它就已经执行了 你需要先把接收到的内容放到list<byte>里,然后再次接收到数据之后拼接到后面
於黾 2015-05-20
  • 打赏
  • 举报
回复
串口通信和TCP通信不一样 TCP通信有数据包的概念,你执行了receive之后,会等到有完整的数据包到达,才会继续往下走. 而串口没有数据包的概念,它是一个字节一个字节发送,一个字节一个字节接收的 你发送完立即执行接收,那么串口缓冲区里有什么就读出来什么,根本不会管后面是否还有别的数据要来 使用同步方式接收的话,你必须做while循环,直到一定时间之内没有新的数据到达,才算一次完整的接收
yanquanheihei 2015-05-20
  • 打赏
  • 举报
回复
Thread.Sleep(100)
-小蕾- 2015-05-20
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
[quote=引用 6 楼 zyl_leilei 的回复:] 这是我以前做的,你可以试一下,可能是比较笨的方法,发送指令后是休眠了一秒才去接收的返回数据。
-小蕾- 2015-05-20
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
[quote=引用 6 楼 zyl_leilei 的回复:] 这是我以前做的,你可以试一下,可能是比较笨的方法,发送指令后是休眠了一秒才去接收的返回数据。
於黾 2015-05-20
  • 打赏
  • 举报
回复
引用 6 楼 zyl_leilei 的回复:
这是我以前做的,你可以试一下,可能是比较笨的方法,发送指令后是休眠了一秒才去接收的返回数据。[img=http://forum.csd [/code]
确实是很笨的办法 我多次用收快递举例 你先在网上订购了个东西,然后过些天快递就会来了 用异步的思想编程,就好比快递送来了,放到你们公司门卫,门卫给你打电话,然后你去取,这当然是最好的办法.如果有多个快递要收,但是每来一个包裹他们都骚扰你一次,你也要自己处理好各个包裹,什么时候收全了你自己清楚.除非包裹之间没有任何联系,否则不要在包裹没收全就开始往外分发了. 用同步的思想,就是你每隔一段时间,都去门卫那里望一望,看快递来了没有.这当然不算是好的办法. 而用阻塞等待的思路,就是你不管它来没来,你也不去门卫看,等一个月之后再去看,它保证早就到了.这是最差的办法了.
-小蕾- 2015-05-20
  • 打赏
  • 举报
回复
这是我以前做的,你可以试一下,可能是比较笨的方法,发送指令后是休眠了一秒才去接收的返回数据。

byte[] temp3 = mysendb("FF FF 02 02 FF FF");//结束操作
            byte[] temp1 = mysendb("FF FF 00 00 FF FF"); //复位指令
            byte[] temp2 = mysendb("FF FF 01 01 01 03 30 FF FF"); //设置操作时间指令
            
            try
            {
                if (!serialPort1.IsOpen)
                {
                    serialPort1.Open();
                }
                
                 serialPort1.Write(temp1, 0, 6);//发送复位数据
                 Thread.Sleep(1000);
                 byte[] recb = new byte[6];//接收复位返回值
                 int iffuwei = serialPort1.Read(recb, 0, 6);
                 if (iffuwei != 6)
                 {
                     MessageBox.Show("复位未成功!");
                     timer1.Start();
                     return;
                 }
                 Thread.Sleep(1000);
                 serialPort1.Write(temp2, 0, 9);//发送考核数据

                timer1.Stop();
                //启动定时
                timer3.Interval = 1000;
                timer3.Start();
            }
            catch
            {
                timer1.Start();
                return;
            }
於黾 2015-05-20
  • 打赏
  • 举报
回复
不要用readline. 除非发送端发送的就是字符串 用read接收字节数组,然后里面到底是什么内容需要自己写代码处理 上次我给你的例子里有API操作串口的例子,里面是用同步阻塞的方式做的 而serialPort,有datareceived事件表示有数据到达缓冲区

110,534

社区成员

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

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

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