第一次写文章。
最近在做一个自定义通讯协议的项目,基于socket通讯写一个上位机的驱动,输入指令向下位机发送一串特定的16进制字符串,然后接收下位机回复数据并解析。记录一下思路过程和遇到的问题。
思路:
1)为了方便操作将数据包定义成结构体,成员对应字段,类型都为unsigned char,存放16进制数
2)数据包包含帧头、帧尾、指令标识符、数据区等等,且数据区是不定长的
3)每条指令写一个驱动函数,变量设置为形参
4)按顺序给数据包结构体成员赋值
5)将结构体转换成string类型
6)发送数据并接收反馈数据
7)反馈回来的16进制string转换为16进制数存入数据包结构体并解析输出反馈结果
问题与解决:
1)结构体转string:先直接复制结构体前几位定长部分(帧头,数据区长度等),for循环赋值不定长部分,最后复制帧尾
struct TCP_SENDER
{
unsigned char FrameHead[2]; //帧头
unsigned char DataLength[2]; //数据区长度
unsigned char Command; //帧命令标识
unsigned char SpecialCommand; //特殊指令标识
unsigned char TestCommand[1024]; //测试指令,数据不定长
unsigned char FrameEnd[2]; //帧尾
}
/*********************************************************
/TCP_Sender Send_Data: 数据包结构体
/int len:数据区不定长部分的长度
*********************************************************/
string Struct2string(TCP_Sender Send_Data, int len)
{
unsigned char buf[1024];
CString RecText;
CString str