最近导师派的新活:写一个和开发板的通讯软件,要求能够传输开发板的屏幕、led灯、lcd数字(大小0-255之间?还是字符?)显示屏等信息(局域网内,所以速度可以有保证)。
上位机:PC用QT作界面,背景弄成开发板的背景。
下位机:由公司人员负责
协议:协议基本上已经定完(需按32字节对齐封装),但是具体的包怎么发送还没有给我说。
基本思路:
屏幕信息通过传图片过来,led和lcd也通过类似数据帧过来。开一个线程定时发送请求,然后用主线程一直通过UDP收包(收包的时候需要考虑到过来的信息是三种类型的,而且不知道公司那边是怎么搞,有可能是同时发送过来在一个UDP包里面)。
目前完成的工作:
1.界面的搭建以及界面ui的响应函数已经完成
2.自定义结构体已经定义出来,大概分为以下几种:
/*结构体定义和各类宏定义*/ #ifndef DATA_H #define DATA_H #define REV_AUTO_PORT 9001 #define REV_MAN_PORT 9003 #define LED_ON 1 #define LED_OFF 0 #define LED_COUNT 8 #define DATA_PIC 28 typedef unsigned char UINT8; struct general_frame { UINT8 Type; UINT8 data[31]; }; struct command_frame //////请求命令帧格式 { UINT8 commandType; ////请求命令类型 UINT8 reserved[31]; ////保留字段 }; struct probe_frame { UINT8 dataType; //// 数据类型 UINT8 reserved[31]; ////保留字段 }; struct pic_frame { UINT8 dataType; UINT8 padding; /////标识最后一个包的填充字节数(0-32) UINT8 reserved; UINT8 data[28]; UINT8 finishFlag; }; struct led_frame { UINT8 dataType; UINT8 led1; UINT8 led2; UINT8 led3; UINT8 led4; UINT8 led5; UINT8 led6; UINT8 led7; UINT8 led8; UINT8 reserved[23]; }; struct lcd_frame { UINT8 dataType; UINT8 lcdNumber[2]; UINT8 reserved[29]; }; #endif3.用java试着写了个demo,尝试了一下UDP传输图片,发现基本不会丢包(公司工程师建议用UDP,开始觉得不可行),也就是说UDP传输这种简单的方式在局域网下没问题。
4.按照上面定义,想的是每32字节对齐封装,然后接包的时候按32字节拆(因为图片有多个包,而且不一定能对齐,所以需要padding字段),检测如果数据类型是图片数据,则一直取对应的图片数据并不断拼接,直到读到完毕则emit对应的刷新屏幕的信号并响应。检测如果数据类型是LED和LCD则很好处理,直接取出对应数据就emit 对应刷新led和lcd数字信号并响应。
5.目前在写UDP接收部分的图片处理部分,为了测试按照上面的定义写了一个UDP发送端的小程序,今天写完了在测试,但是测试发现现在把图片拆成多个帧发送拆的有问题。
下一步工作:
1.检查图片拆分以及封装、测试图片接收模块
2.完成UDP的LED以及LCD接收模块并测试
3.完成请求线程并测试
PS.今天还遇到一个特别大的问题就是Qt的UDPsocket通信readReady信号一直没反应,后来发现好像是被其他网络软件给占用了还是怎么着,把好几个软件关了就能用了。
接收端建议使用绑定模式QUdpSocket::ShareAddress,它表明其他服务也可以绑定到这个端口上
receiverSocket->bind(45454,QUdpSocket::ShareAddress);