怎么才能使得不同大小的数据都按照两个字节发送? 2个字节就用short(或u_short),加和到一个int,然后字节序需要转一下(用htons把大头在后转成大头在前),在把数据都拷到一个内存块(BYTE数组什么的)。发送就发送那个内存块,具体串口怎么发送没做过就不知道了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你写段代码参考。BOOL SendData(LPWORD Data, BYTE Length) // Data是要发送的数据指针,Length是数据的个数{ int bufferLength = Length * sizeof(WORD) + 4; // 计算要发送的数据的字节总数 LPBYTE buffer = new BYTE[bufferLength]; // 分配缓冲区 buffer[0] = 0x24; // 数据头 buffer[1] = Length; // 数据长度 buffer[2] = 0x54; // 为指令 LPBYTE p = buffer + 3; // 数据开始 BYTE checkSum = 0x54; // 校验和 for (BYTE i=0; i<Length; i++) // 复制并调整数据 { *p = *((LPBYTE)(Data+i)+1); // 取高字节 checkSum += *p++; // 计算校验和 *p = (BYTE)*(Data+i); // 取低字节 checkSum += *p++; // 计算校验和 } *p = checkSum; // 把校验和放在发送数据的最后 BOOL result = Send(buffer, bufferLength); // 自己写个发送数据函数 return result; // 返回发送结果} 你想复杂了,协议一般放在unsigned char字符串中发送出去;至于数据只是字符串中的任意2字节而已。从你的叙述中,我假设你的数据都是整型数据,现以任意数据n为例:int nDatan; //整型数据nunsigned char cD[2]; //数据n转化为协议中的2字节cD[0] = nDatan / 256 ; //协议中高字节cD[1] = nDatan % 256 ; //低字节将cD[2]赋给协议相应位置即可,多个数据就自己处理一下循环逻辑。协议的其他字节就向unsigned char字符串中赋值就行了,最后计算一下校验位,按上面的方法取余,OK。 BOOL SendData(USHORT u16Data,HANDLE hComm){ if(!hComm) { return FALSE; } BYTE pu8DataBuffer[6]; pu8DataBuffer[0]=0x24; pu8DataBuffer[1]=4; pu8DataBuffer[2]=0x54; pu8DataBuffer[3]=u16Data>>8; pu8DataBuffer[4]=u16Data; pu8DataBuffer[5]=pu8DataBuffer[2]+pu8DataBuffer[3]+pu8DataBuffer[4]; DWORD byteswritten; return WriteFile(hComm,pu8DataBuffer,6,&byteswritten,NULL);}其中hComm是用CreateFile获得的串口句柄。 几个三维物体相交的体积及表面积计算 如何在DLL中的线程中执行DLL中的函数?(在线等待) 请高手指点接下来该怎么学vc了 得到socket号,用哪个api得到进程的ID? _T()中的参数如果是变量怎么办? 两个工作区的协同工作问题,急!!! 如何在系统报错之前捕获异常! CArray,CString的问题 ===菜鸟系列===:毕业设计中的简单任务!不管你是高手还是菜鸟,不管有没有把握,请先进来看看! 请问哪位有PE文件格式的资料? MFC是不是免费的? 关于ListBox单独设置某项的问题
BOOL SendData(LPWORD Data, BYTE Length) // Data是要发送的数据指针,Length是数据的个数
{
int bufferLength = Length * sizeof(WORD) + 4; // 计算要发送的数据的字节总数
LPBYTE buffer = new BYTE[bufferLength]; // 分配缓冲区
buffer[0] = 0x24; // 数据头
buffer[1] = Length; // 数据长度
buffer[2] = 0x54; // 为指令
LPBYTE p = buffer + 3; // 数据开始
BYTE checkSum = 0x54; // 校验和
for (BYTE i=0; i<Length; i++) // 复制并调整数据
{
*p = *((LPBYTE)(Data+i)+1); // 取高字节
checkSum += *p++; // 计算校验和
*p = (BYTE)*(Data+i); // 取低字节
checkSum += *p++; // 计算校验和
}
*p = checkSum; // 把校验和放在发送数据的最后 BOOL result = Send(buffer, bufferLength); // 自己写个发送数据函数 return result; // 返回发送结果
}
从你的叙述中,我假设你的数据都是整型数据,现以任意数据n为例:int nDatan; //整型数据n
unsigned char cD[2]; //数据n转化为协议中的2字节
cD[0] = nDatan / 256 ; //协议中高字节
cD[1] = nDatan % 256 ; //低字节将cD[2]赋给协议相应位置即可,多个数据就自己处理一下循环逻辑。协议的其他字节就向unsigned char字符串中赋值就行了,最后计算一下校验位,按上面的方法取余,OK。
{
if(!hComm)
{
return FALSE;
} BYTE pu8DataBuffer[6]; pu8DataBuffer[0]=0x24;
pu8DataBuffer[1]=4;
pu8DataBuffer[2]=0x54;
pu8DataBuffer[3]=u16Data>>8;
pu8DataBuffer[4]=u16Data;
pu8DataBuffer[5]=pu8DataBuffer[2]+pu8DataBuffer[3]+pu8DataBuffer[4]; DWORD byteswritten;
return WriteFile(hComm,pu8DataBuffer,6,&byteswritten,NULL);
}其中hComm是用CreateFile获得的串口句柄。