请教一个串口通信的问题

bluegens 2014-08-13 02:09:48
我们开发了一个串口的软件和嵌入式板卡通信,把嵌入式板卡上报的数据按照一定的协议解析以后在软件界面上显示出来。嵌入式板卡的数据量比较大,因此采用的是多线程通信,但是现在有个问题,在有的电脑上数据显示正常,但是在有的电脑上数据显示就很慢,刷新速率很低,感觉像是数据积压了。关闭串口以后会将前面积压的数据迅速的显示出来。

我现在就很奇怪了,为什么在有的电脑上可以使用,在有的电脑上怎么就用不来啊?

还请各位高手指点一下,谢谢。
...全文
299 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hubo86915531 2014-08-26
  • 打赏
  • 举报
回复
可以先测试一下屏蔽掉数据的显示,有可能是显示没做好,导致刷新慢
用户 昵称 2014-08-25
  • 打赏
  • 举报
回复
引用 9 楼 lulu23260 的回复:
[quote=引用 6 楼 jennyvenus 的回复:] 这是接收线程,还有其他几个线程,其中一个线程判断缓冲区中是否有数据(接收指针与读取指针不一致,就有数据,一致就是空,差1字节就是满),如果有数据则按规则整理成长短不同的包,并丢入包缓冲区。 第二个线程判断有没有包,有包则进行显示处理,只要缓冲区设置合适,一秒钟几十k、总数据不超过几十兆的数据,总能慢慢显示完,并且不影响接收。
好方法,感觉好高科技啊!疑问 疑问:如果读取线程处理速度慢,会丢数吧?就是接收指针又转了一圈?[/quote]如果读取的特别慢,就会丢数,所以读取线程不能太复杂,收到数就立刻接下一个数。如果第一级缓冲区小,很容易丢缓冲区大小的数据,所以要按实际需求来决定第一级缓冲区的大小,比如一秒最多3K的话,高峰时持续300秒,那么就需要至少1000K,在写代码的时候,直接扩大16倍就足够了。 循环缓冲一般设置为2^N大小,这样容易处理。
lulu23260 2014-08-20
  • 打赏
  • 举报
回复
引用 6 楼 jennyvenus 的回复:
这是接收线程,还有其他几个线程,其中一个线程判断缓冲区中是否有数据(接收指针与读取指针不一致,就有数据,一致就是空,差1字节就是满),如果有数据则按规则整理成长短不同的包,并丢入包缓冲区。 第二个线程判断有没有包,有包则进行显示处理,只要缓冲区设置合适,一秒钟几十k、总数据不超过几十兆的数据,总能慢慢显示完,并且不影响接收。
好方法,感觉好高科技啊!疑问 疑问:如果读取线程处理速度慢,会丢数吧?就是接收指针又转了一圈?
叶恭介叶恭介 2014-08-20
  • 打赏
  • 举报
回复
试试这个测试工程http://blog.csdn.net/cvbtvbwu/article/details/24694739
Naxx_4DK 2014-08-20
  • 打赏
  • 举报
回复
能不能采用问答的方式,比如每100ms请求板卡返回数据
用户 昵称 2014-08-19
  • 打赏
  • 举报
回复
DWORD dwEvents, dwBytesRead; size_t i; while( g____bComm_Open ) { if( WaitCommEvent( g____hComm, &dwEvents, NULL ) ) { if( EV_RXCHAR == dwEvents ) { dwBytesRead = ReadCommBlock( g____Buf, 1024 ); if( dwBytesRead ) { for( i = 0; i < dwBytesRead; i++ ) { *( g____IO_Buf + g____Receivep ) = g____Buf[ i ]; g____Receivep++; g____Receivep &= ( 0xfffff ); } g____Receivep1 = g____Receivep; } } } 不能让楼上的白顶,这是我在一个代码里面的写法,线程一直在重复接收,并往缓冲区中写,由于缓冲区只有1兆(再大的缓冲区也是有头的,循环缓冲区用好了,相当于无限的缓冲),所以在往缓冲区里面写的时候,不是使用memcpy的方法,而是自动逐字节赋值(算法写好了,也可以双字节,4字节赋值)。 这是接收线程,还有其他几个线程,其中一个线程判断缓冲区中是否有数据(接收指针与读取指针不一致,就有数据,一致就是空,差1字节就是满),如果有数据则按规则整理成长短不同的包,并丢入包缓冲区。 第二个线程判断有没有包,有包则进行显示处理,只要缓冲区设置合适,一秒钟几十k、总数据不超过几十兆的数据,总能慢慢显示完,并且不影响接收。
wyx100 2014-08-16
  • 打赏
  • 举报
回复
引用 3 楼 jennyvenus 的回复:
你的串口要用异步方式读取,取完了放在缓冲中,之后继续接收,最好显示也放在线程中,准备好了,用sendmessage告诉界面窗口进行最终显示。
vcf_reader 2014-08-16
  • 打赏
  • 举报
回复
楼 上 正 解
用户 昵称 2014-08-14
  • 打赏
  • 举报
回复
你的串口要用异步方式读取,取完了放在缓冲中,之后继续接收,最好显示也放在线程中,准备好了,用sendmessage告诉界面窗口进行最终显示。
hhhh63 2014-08-13
  • 打赏
  • 举报
回复
只用一个串口吧,为什么要用多线程呢?
悟迟 2014-08-13
  • 打赏
  • 举报
回复
慢的那台机CPU利用率高吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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