这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » PC上位机的串口程序中,如何完美、高效处理数据的接收问题?

共11条 1/2 1 2 跳转至

PC上位机的串口程序中,如何完美、高效处理数据的接收问题?

工程师
2020-01-08 15:16:21     打赏

最近用C# SerialPort类做单片机上位机程序,发现一个问题:


     单片机一次发送一批数据(400字节左右)到上位机,上位机利用事件触发方式接收数据。
     刚开始数据接收非常不稳定,上位机经常数据接收不完整。
     后来我在事件处理函数最开始处加入了500ms延时,则每次数据接收就完全OK了。
     不知道这是什么原因。感觉这样虽一时可以解决问题,但是感觉这样会影响接收的实时性。
    是否还有更好的解决方法,让事件触发接收既实时,又能保证数据接收完整?
    下面是我的事件处理程序演示代码:
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        Thread.Sleep(500);//这个延时非常重要
        
        int n = sp.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
        byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
        sp.Read(buf, 0, n);//读取缓冲数据
        
        //因为要访问ui资源,所以需要使用invoke方式同步ui。
        this.Invoke((EventHandler)(delegate
        {
                for(int i;i<n;i++)
                {
                        textBox1.text += buf[i].ToString();
                }                
        }));
}




关键词: 上位机     串口     串口程序     串口软件     C#    

高工
2020-01-08 21:21:10     打赏
2楼

这段程序解决了很大的问题


工程师
2020-01-08 21:23:58     打赏
3楼

学到了


工程师
2020-01-08 22:50:49     打赏
4楼

数据接收事件,跟单片机的串口接收中断是一个意思,搞个缓冲区,再搞个超时信号量,就可以了呀!


工程师
2020-01-08 22:59:14     打赏
5楼

数据接收本来就不是一次性收完的,可以分很多次,每次大小不一。你总想一次接收完,所以只能加延迟,早来的不理会,存在缓存里。
你这个接收函数只管接收,把数据存到一个数组里,每次收到都继续保存,直到接收长度符合你的需要,再去处理,不用加延时,就实时了。


工程师
2020-01-08 23:04:28     打赏
6楼

这属于串口和tcp数据处理的基本常识:粘包与分包处理
粘包,多个数据包合在一起同时收到
分包,一个数据包被分成多个分时送到


工程师
2020-01-11 15:40:44     打赏
7楼

学习了   干货 


工程师
2020-01-11 15:47:25     打赏
8楼

这段程序解决了很大的问题


工程师
2020-01-11 22:09:54     打赏
9楼

这个程序写的很简洁


工程师
2020-01-19 21:25:12     打赏
10楼

弄个多线程,一个负责接收到FIFO缓冲区,另外一个线程负责对缓冲器的数据进行解析和处理。


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]