求思路:linux C下多线程接收数据如何进行存储再统一处理

xinxin26 2011-01-18 11:08:41
本人菜鸟一枚,临危受命,硬着头皮接受任务。现遇到严重的瓶颈求牛人提供思路。
问题如下:
用串口4接收有效反馈数据并对数据进行提取处理(PS;用Linux下多线程接收数据的函数前人已经写好了不用我操心),接收有效反馈数据部分有一个专门的函数(函数1)处理,提取数据的部分字节并处理也有一个专门的函数(函数2)处理。现在的瓶颈是:串口4按反馈码字节的有效长度不停的来接收,接收完每串函数的全部字节后传给那个专门处理的函数2来进行相应的提取和操作。而我的反馈码需要根据不同的情况进行接收后再统一处理,反馈回来的数据非常多串,而且不能确定具体串数(要分视实际情况而定),即要在函数2里面把接收到的多次数据先进行提取有效字节后存储起来,等到接收完所有的的反馈码(因为都是在同一个函数里面处理所有很麻烦)后再统一把这些数据传给其他的变量,请问该如何处理?
...全文
272 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzs_13933908434 2012-10-13
  • 打赏
  • 举报
回复
你这看着像学校做项目啊
feicer 2011-01-21
  • 打赏
  • 举报
回复
16楼说的不错。。。
谭海燕 2011-01-20
  • 打赏
  • 举报
回复
看你这个题目,描述的越来越差。唉。。。。
谭海燕 2011-01-20
  • 打赏
  • 举报
回复
malloc动态分配在堆上。

一个进程中的所有线程都共享。

所以。malloc出来的buffer。只要是同一个进程中,这些线程都可以共享操作。

当然你的做一些保护工作。用互斥锁,或者读写锁对这个buffer进行保护。

同步。

差不多了。
谭海燕 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xinxin26 的回复:]
先谢谢各位的热心帮助!

引用 10 楼 feiyinzilgd 的回复:
C的话,使用内存动态分配,最后统一处理buffer


请问可以详细的讲一下要怎么一组一组的存(每来一串数据要存储其中的10个字符),存完后调用调用更新界面图标函数一起把所有的有用的值传给更新界面图标函数里面相应的变量时要怎么一组一组的取出来呢?还有能不能在存每一组数据的时候计数呢?PS:我现在在狂补内存动态分……
[/Quote]

其实你自己把问题复杂化了。

你直接设置一个最大的

char buffer[1024]//单个线程里面。

如果你需要在不同线程里面操作这个buffer

可以这样 char *buffer

然后 buffer = (char *)malloc(1024)//这样1024的缓冲一半就够了。不够可以继续扩充

如果你想动态分配空间,反而效率降低,

动态分配
malloc remalloc就足够了。

所以。你之前秒速了那么多。你唯一的思想就是把零碎的数据整合到一起是吧?

可以啊,没问题的,就这样就足够了。没必做的太复杂,太复杂反而效率更低。
xinxin26 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 weerweer 的回复:]
真麻烦,为什么不能即时更新呢?
你连什么时候收完都不知道,那程序又怎么知道呢?

是不是可以这样理解,所有外设上电后会有类似注册的动作,那么在一段时间后就知道有多少个设备需要交互,然后每次计数,齐了之后一起上报?

多线程是什么意思?函数1234是并行的?
[/Quote]
真麻烦,为什么不能即时更新呢?
你连什么时候收完都不知道,那程序又怎么知道呢?
-----------------
因为我是查询整个房间内所有家居设备的工作状态的,所有设备的图标都在同一个界面里所以要一起更新,以前我有试过接收一串就更新,但当第二串来的时候更新后的界面只显示第二串的状态第一次的状态被清零,所以必须一起更新才不会有错。

是不是可以这样理解,所有外设上电后会有类似注册的动作,那么在一段时间后就知道有多少个设备需要交互,然后每次计数,齐了之后一起上报?
-----------------
我也不大懂你的意思,请参照我刚才回复你的第一条的内容你应该就理解了。关于计数确实我我所需要的,但我还没想好要怎么写。

多线程是什么意思?函数1234是并行的?
-------------
这个是我当时提问时没写好,其实我的问题里面不包含多线程了,多线程是我的智能终端还有很多其他的功能需要用到多线程(比如串口4不停的接收这些反馈数据要用到线程、串口2不停的接收触摸屏的操作数据也要用到线程还有其他的等待)。
xinxin26 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wickyboy 的回复:]
好办啊,楼主

用C++ 里面的STL容器就可以办到,而且效率不低

你选一个吧:

vector<> list<> dequeue<> .......这些全部可以动态增长
[/Quote]

谢谢,你说的这样我以前还真没接触过,没学过C++,我也正在看到底能不能用进来。
xinxin26 2011-01-20
  • 打赏
  • 举报
回复
先谢谢各位的热心帮助!
[Quote=引用 10 楼 feiyinzilgd 的回复:]
C的话,使用内存动态分配,最后统一处理buffer
[/Quote]

请问可以详细的讲一下要怎么一组一组的存(每来一串数据要存储其中的10个字符),存完后调用调用更新界面图标函数一起把所有的有用的值传给更新界面图标函数里面相应的变量时要怎么一组一组的取出来呢?还有能不能在存每一组数据的时候计数呢?PS:我现在在狂补内存动态分配这部分的知识。
xinxin26 2011-01-19
  • 打赏
  • 举报
回复
管理员可以不可以帮忙把7楼给删了啊?

[size=16px]我的问题是在接收多串数据的过程中要如何存储这些先接收到的多串数据的有用的10个字符呢?是用堆栈(这个其实考虑过了很不好用)?指针?或链表?数组来存储这些数据呢?让后等到接收完全部反馈数据之后再调用更新界面图标函数一起把所有的有用的值传给更新界面图标函数里面相应的变量呢?

另外查询房间反馈回来的数据非常多串,而且不能确定具体串数(要视实际每个房间内接了多少个智能家居设备的情况而定),不好判断哪一串为结束串数据也是很大的麻烦
。[/
size]
xinxin26 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 feiyinzilgd 的回复:]
你的题目描述的我都不想看。。。太乱了。。


一会儿是串口4,一会儿又是所有串口。。
你到底几个串口呢?

还有,你究竟是什么现成在干啥,,,、

题目描述不清楚。。。。。。。


麻烦你把题目重新描述清楚。提交之前先自己看一遍。。

反馈数据。。。把你需求中的专业术语用简单化的词语表述。不做你这个项目的人怎么知道什么反馈数据。。


唉。。。
[/Quote]

一会儿是串口4,一会儿又是所有串口。。
你到底几个串口呢?
------------------
一直都只有串口4没有说所有串口,而且其实串口接收数据部分是可以不用管的。

不好意思,我昨天是想求思路,就没有把关于项目的具体情况描述清楚。其实这是一个控制整个大楼所有智能家居设备的智能终端,由这个智能终端(触摸屏菜单操作)发送命令来控制智能家居设备工作或不工作,并且要把经控制后的所有设备的当前状态(工作或不工作,如灯亮或灭)的状态在在智能终端的菜单(有一个界面专门显示所有设备的工作状态)上显示出来。
只要这个智能终端发送控制命令出去后,则相应的设备(如某盏灯)执行此命令:开(或关),并返回一串数据(即此设备的状态反馈码)给智能终端的串口4,智能终端的串口4要接收此数据(我上面提到的函数1)并传给其他函数(我上面提到的函数2)进行提取相应有用的数据(这串数据共有22个字符,要提取其中的10有用字符【包含2个字符的楼层号、2个字符的房间号、2个字符的设备号、4个字符的设备反馈状态】)给相应的变量再传给更新界面图标函数作为更新图标的判断条件(作为判断条件的是4个字符的设备反馈状态)。

如果是控制单个设备时反馈回来的反馈码只有一串非常好处理,单个控制时接收到一串反馈码就直接提取数据给相应的变量然后调用那个更新界面图标函数传值给里面的变量,然后更新图片显示即可;但当我要查询整个房间所有设备的工作情况时,返回来的反馈码是多串(每一个设备都有一串反馈码)不止一串的,而函数1接收完每串反馈数据后立刻传给函数2来进行相应的提取和操作。则函数2需要在接收完第一串反馈码时把第一串反馈码有用的10个字符存储起来,继续接收第二串反馈码然后存储有用的10个的字节,再接收下一串,直到接收完房间内所有设备的反馈码接收完,然后再调用那个更新界面图标函数,一起传值给更新界面图标函数里面的变量然后更新设备状态的显示图标,但因为每一串反馈数据都是在同一个函数(函数2)里面提取有用的10个字符处理所以很麻烦,我的问题是在接收多串数据的过程中要如何存储这些先接收到的多串数据的有用的10个字符呢?是用堆栈(这个其实考虑过了很不好用)?指针?或数据来存储这些数据呢?让后等到全部接收完全部反馈数据之后再调用更新界面图标函数一起把所有的有用的值传给更新界面图标函数里面相应的变量呢?
另外查询房间反馈回来的数据非常多串,而且不能确定具体串数(要分视实际房间内接了多少个智能家居设备的情况而定),不好判断那一串为结束串数据也是很大的麻烦。
zhuxueling 2011-01-19
  • 打赏
  • 举报
回复
你还是贴代码吧。
也许你的问题是一个很简单的问题, 也许是你没有描述清楚。

所谓的堆啊,栈啊,或是什么stl,这些东西都不是线程安全的。
既然你用到了多线程,首先要考虑的就是线程安全。。。

建议你学一下apr和glib,这两个库里有很多并行编程中用得到的东西。

weerweer 2011-01-19
  • 打赏
  • 举报
回复
真麻烦,为什么不能即时更新呢?
你连什么时候收完都不知道,那程序又怎么知道呢?

是不是可以这样理解,所有外设上电后会有类似注册的动作,那么在一段时间后就知道有多少个设备需要交互,然后每次计数,齐了之后一起上报?

多线程是什么意思?函数1234是并行的?
谭海燕 2011-01-19
  • 打赏
  • 举报
回复
C的话,使用内存动态分配,最后统一处理buffer
wickyboy 2011-01-19
  • 打赏
  • 举报
回复
好办啊,楼主

用C++ 里面的STL容器就可以办到,而且效率不低

你选一个吧:

vector<> list<> dequeue<> .......这些全部可以动态增长
xinxin26 2011-01-18
  • 打赏
  • 举报
回复
问题补充:函数1接收完每一串数据后立刻传给函数2进行处理。
wangtingguang 2011-01-18
  • 打赏
  • 举报
回复
写得确实不好理解,
jbz001 2011-01-18
  • 打赏
  • 举报
回复
分段存储,一个连续的存储空间,每个线程分配一段。
各存各的,互不干涉
谭海燕 2011-01-18
  • 打赏
  • 举报
回复
你的题目描述的我都不想看。。。太乱了。。


一会儿是串口4,一会儿又是所有串口。。
你到底几个串口呢?

还有,你究竟是什么现成在干啥,,,、

题目描述不清楚。。。。。。。


麻烦你把题目重新描述清楚。提交之前先自己看一遍。。

反馈数据。。。把你需求中的专业术语用简单化的词语表述。不做你这个项目的人怎么知道什么反馈数据。。


唉。。。
xinxin26 2011-01-18
  • 打赏
  • 举报
回复
怎么都没有人理我啊?泪奔啊!!!!!!!!再次人工置顶让牛人看到我的问题!

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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