根据升级协议的lvds升级

1.中控和仪表通信并且传输升级包
主要就是传输升级包的功能,传输通路是socket, 传输协议是东风的双屏互动的升级协议。
用TCP的socket,写个socket线程替代原来的spi_ipc_lvds内部的线程。
除了修改协议,adptor和spi_ipc_cluster通过一个socket线程替换就可以。

主要是用tcp,socket创建读写函数接口,替换原来的adptor中的读写接口,这样可以直接用新的读写接口替换main函数中原来的接口。可以不用pthread_create创建线程函数,可以将socket连接的id值定义成类的成员变量,再单独写读写函数,因为socket的读写函数主要就是利用这个id值来传输的 ,其他的传递步骤可以保持不动,剩下的就是修改协议中的交互步骤。

	int ret = read(sock, buf, TCP_PROTOLAL_SIZE);
	int ret  = write(sock, buf, len);

2.用pthread_create函数创建了一个线程,读写,以及处理函数的调用都在这个线程中,是可以实现传输,但是必须一步一步的执行。
服务器和客户端的线程id,服务器有两个,一个用来监听,一个用来连接。

3.数组不能整体赋值

4.将读写线程分开的一些问题,以及其他的问题
a.把读和写放在线程中,处理函数放在线程外面,结果读和写的线程自己去跑,压根不出来。
想到的办法是,在最开始加一个信号量,读完减1,写完加1,并加条件判断,当信号量的值不符合时,continue,这样就会从当前的线程中跳出来,不过会立马跳到另一个线程,还是不出来。最后只能把处理的函数重写写进线程里面。

b.pthread_join会一直阻塞等待线程退出,第二个线程就一直执行不了了。
想到的办法是,将pthread_join函数注释掉,在它之前加sleep(1000),在后面的测试中,发现一直在等待,过后就停掉了,因为sleep(1000)等待时间过长。

c.char* message_buf; 定义了指针,但是没分配空间,在后面运行的过程中,总是会死掉。
解决办法,给指针开辟空间 char* message_buf = new char[IVI_TO_CLUSTER_LENGTH];

d.传输速度很慢,原因是在读之前的等待时间过长
解决办法是,将sleep的等待时间减小,改成usleep函数。但是这个在进行不同设备之前的传输的时候,并不能起到很稳定的作用,因为本地传输的话,可以在等待一会后,读到自己想读到的数据长度,但是网络传输,接收的时候,收到的长度是不固定的。

e.cmake的文件中替换原来的文件,链接的库也要修改,socket线程就调用socket库

f.代码一运行,就直接挂了,以为没有进入main函数,当时学到了一个很简单实用的方法,就是将return 0加在main函数的刚开始,如果不报错,说明进入main函数了;接下来就可以将return 0 一步一步挪动,来检查停在哪一步了。表明单纯的加log也不一定起作用。

g.因为创建线程的同时,会有其线程的启动函数,但是是static模式的,不能调用类的内部函数和内部变量;并且因为调用的处理函数是属于其他类的,也不能直接调用。
解决办法是:
1.需要先定义其相关的对象,可以在.cpp文件的开头进行定义,在需要用到的线程中进行实现;
2.可以将pthread_create函数的第四个参数,改成this指针。本身第四个参数是thread_run函数的参数,这样可以在thread_run函数中用this指针指向类的另一个内部函数,相当于回调,将读写的过程都放在thread_read这个函数中去实现,这样就可以当做读写都在同一个类中,而不是在static函数中。
pthread_create(&threadTCP, &attrTCP, thread_run, this);

void* thread_run(void* arg)
{
   
	   ((TCPClient*)arg)->thread_read();
	   return NULL;
}

例子:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
class Thread
{
   
private:
	pthread_t pid;
private:
	static 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值