C#串口数据读取速度很慢,但串口调试助手工具数据变化很快,怎么解决啊?

Fly_tohigh 2015-10-27 03:18:25
我用FPGA向C#上位机串口实时连续发送数据,并在testbox控件中显示出来,当所发数据内容改变时,上位机串口数据的显示会维持原来的数一段时间很慢才变化,而利用串口调试助手可以看到,串口接收到的数据确实很快就变化了,不明白C#的串口为什么会那么长时间才变化。急求各位大神大牛帮忙解决,小弟学生党一枚,初学C#,缺少经验,也请大家帮帮忙,跪谢了!!
...全文
1950 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
慢,是自己的程序的问题。当它没有收到数据的时候,那么应该没有任何代码在那里循环、浪费CPU时间。当它收到了数据,不管是多少字节,都应该被迅速读取完毕并且被处理,而不是堆积在那里。两个方面都要做到,才能保证最基本的效率。
liuhuaqiang1118 2015-12-27
  • 打赏
  • 举报
回复
我也出现了这个问题词,感觉串口读取30个字节好慢
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
引用 9 楼 shuzhongxiao 的回复:
串口调试助手变化很快,可以证明是程序的问题,可能是代码中做了延时或者有算法执行时间过久造成的。你可以先把数据处理的内容除掉,就保留数据的接受部分,看看数据接收的效率。
我设置了几个全局变量,在串口接收数据时在其线程里把接收到的数据送给全局变量,然后主线程一直在处理这些全局变量,并进行显示,但出来的界面就完全乱了,不知为何了,您看我这么处理有什么不妥吗
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
引用 11 楼 wukaiping870123 的回复:
读取一个字节太慢了 有readtoend 一般协议都会有结束符啊
能不能麻烦大牛给我个例子,实在初学,都不知道这些用法
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
引用 9 楼 shuzhongxiao 的回复:
串口调试助手变化很快,可以证明是程序的问题,可能是代码中做了延时或者有算法执行时间过久造成的。你可以先把数据处理的内容除掉,就保留数据的接受部分,看看数据接收的效率。
您说的没错,我这里确实有数据的处理,可能会有一定影响,我再试试再回复您,谢谢哈
alex_gao2011 2015-10-27
  • 打赏
  • 举报
回复
最好建立一个串口的监控线程对串口监控,在有数据输入时立刻响应。你这个程序看不到是如何实现的
火星大能猫 2015-10-27
  • 打赏
  • 举报
回复
读取一个字节太慢了 有readtoend 一般协议都会有结束符啊
Poopaye 2015-10-27
  • 打赏
  • 举报
回复 1
不光只有ReadByte,还有Read方法
shuzhongxiao 2015-10-27
  • 打赏
  • 举报
回复
串口调试助手变化很快,可以证明是程序的问题,可能是代码中做了延时或者有算法执行时间过久造成的。你可以先把数据处理的内容除掉,就保留数据的接受部分,看看数据接收的效率。
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
引用 7 楼 shingoscar 的回复:
[quote=引用 6 楼 u014025715 的回复:] [quote=引用 5 楼 shingoscar 的回复:] 你的数据是一个一个字节传的吗?
我的数据是FPGA发的,每次发送三字节的数据。[/quote] 那你应该每次读3字节,准确的说应该每次都读光、处理、交给UI显示 你一个个读再回给UI有延迟是正常的[/quote] 每次读光?我是新手,不太清楚,怎么做到每次读三个字节的数据啊,我理解的是datareceived事件触发就readbyte读取一个字节的数据,这样子理解是不是不对呢?应该如何进行修正呢
Poopaye 2015-10-27
  • 打赏
  • 举报
回复
引用 6 楼 u014025715 的回复:
[quote=引用 5 楼 shingoscar 的回复:] 你的数据是一个一个字节传的吗?
我的数据是FPGA发的,每次发送三字节的数据。[/quote] 那你应该每次读3字节,准确的说应该每次都读光、处理、交给UI显示 你一个个读再回给UI有延迟是正常的
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
你的数据是一个一个字节传的吗?
我的数据是FPGA发的,每次发送三字节的数据。
Poopaye 2015-10-27
  • 打赏
  • 举报
回复
你的数据是一个一个字节传的吗?
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
第一次发帖,总是提示我有非法词汇,不知道怎么回事,我贴了程序, a = new mydelegate(deal); 后面那个Private void deal(int str)是委托函数,也请帮忙看看,感谢了!
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复
引用 1 楼 losebaby 的回复:
第一,两个是不是采用的相同波特率? 其次,你的textbox显示变更是在发送成功前还是成功后?
波特率相同,都是115200,另外我是在委托中让textbox显示数据的,您可以看我的程序,每次收到数据就让textbox.text显示出来
Fly_tohigh 2015-10-27
  • 打赏
  • 举报
回复

private void serialPort2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            BeginInvoke(a, serialPort2.ReadByte());
        }

        //对接收到的数据进行处理
        string string_total;
        int myint1;
        private void deal(int str)
        {
           //System.Threading.Thread.Sleep(100);
            //对收到的第一位数据进行处理
            if (i == 1)
            {
                string_total = str.ToString();
                textBox1.Text = string_total;
                i++;
                string data3 = textBox1.Text;
            }
            else if (i == 2)
                //收到的第二位数据储存起来
                myint1 = str;
                i++;
            }
            else if (i == 3)
            {
              ......
                }
         
                i = 1;//令i归1
            }
        }
可乐罐 2015-10-27
  • 打赏
  • 举报
回复
第一,两个是不是采用的相同波特率? 其次,你的textbox显示变更是在发送成功前还是成功后?

110,537

社区成员

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

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

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