通讯协议怎么看

快雪时晴 2021-02-19 10:25:29
这是某个控制卡的通讯协议

协议格式:
字节头(2bit)+功能码(1bit)+字节长度(1bit)+数据位(nbit)+校验位(2bit)+字节尾(2bit)

字节头:C1 C2
字节尾:0A 0D
字节长度(1bit)= 数据位(nbit)+校验位(2bit)

校验位:
计算方法:先把字节头+功能码+字节长度+数据位累加求和,累加的值高16bit的值加到低16bit上,即把累加中最高位的进位加到最低位上,最后进行取反。

使能输出设置:(括号内为校验位2byte)
下发: C1 C2 08 04 xx aa (00 00) 0A 0D(xx:1-4 1:X轴 2:Y轴 3:Z轴 4:B轴 aa:0输出低电平 1输出高电平)
回报: C1 C2 08 04 xx 00 (00 00) 0A 0D
备注:子命令解析失败:C9 C8 FF 02 (00 00) 0A 0D


请问如何根据上面的这些资料写出控制驱动器使能开关的函数?

...全文
3911 45 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
Phd_D 2022-08-05
  • 打赏
  • 举报
回复

请问怎样能查询到各种设备的通讯协议,比如(空压机、机房空调、工业锅炉、变压器、光伏设备)

m0_55844471 2021-03-07
  • 打赏
  • 举报
回复
一起努力赚钱养家
m0_53553242 2021-02-27
  • 打赏
  • 举报
回复
学习了谢谢大神门
  • 打赏
  • 举报
回复
哈哈gogo 2021-02-23
  • 打赏
  • 举报
回复
这是什么协议
zgl7903 2021-02-23
  • 打赏
  • 举报
回复
yeah2000 2021-02-23
  • 打赏
  • 举报
回复
引用 38 楼 pc12138cwp 的回复:
int  ReadData(char*           filePath       )
{
	HANDLE pFile;
	DWORD fileSize;     
	char* buffer, * tmpBuf;     
	DWORD dwBytesRead, dwBytesToRead, tmpLen;     
	pFile = CreateFile(    filePath/*这个文件名怎么来的*/    , GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,        //打开已存在的文件          
		FILE_ATTRIBUTE_NORMAL,
		NULL);    
	if ( pFile == INVALID_HANDLE_VALUE)   
	{        
		printf("open file error!\n");      
		CloseHandle(pFile);      
		return FALSE;    
	}   
	fileSize = GetFileSize(pFile,NULL);          //得到文件的大小    
	buffer = (char *) malloc(fileSize);    
	ZeroMemory(buffer, fileSize);  
	dwBytesToRead = fileSize;   
	dwBytesRead = 0;    
	tmpBuf = buffer;   
	do
	{                                       //循环读文件,确保读出完整的文件          
		ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);      
		if (dwBytesRead == 0)         
			break;      
		dwBytesToRead -= dwBytesRead;    
		tmpBuf += dwBytesRead;     
	} while (dwBytesToRead > 0);         //  TODO 处理读到的数据 buffer   
		free(buffer); 
	CloseHandle(pFile);   
	return TRUE;

}
这是我网上找的一个,我这个情况好像没有这个filePath文件,我怎么知道接受谁的数据
你的要求是串口收发,不是文件操作。 你网上找下串口通讯的示例
weixin_42066565 2021-02-22
  • 打赏
  • 举报
回复
回帖test
  • 打赏
  • 举报
回复
sichuanwww 2021-02-22
  • 打赏
  • 举报
回复
还能怎么看?我肯定是坐着看
yeah2000 2021-02-22
  • 打赏
  • 举报
回复
通讯发送的数据是以包为单位。每包数据包含一个字节数组,没个字节数据都有包头包尾命令字校验等结构。校验是针对当前包来说的,校验对前后包没意义。
快雪时晴 2021-02-22
  • 打赏
  • 举报
回复
了解了
yeah2000 2021-02-22
  • 打赏
  • 举报
回复
引用 24 楼 pc12138cwp 的回复:
哦哦哦,那我现在准备实现的是控制驱动器使能的开关,也要接受数据并检验吗
接收数据并校验是 为了确认系统接收到并响应了你的信息。如果系统能百分百接收也可以不管回应的数据
pzh000000 2021-02-22
  • 打赏
  • 举报
回复
都是高手。
快雪时晴 2021-02-22
  • 打赏
  • 举报
回复
int  ReadData(char*           filePath       )
{
	HANDLE pFile;
	DWORD fileSize;     
	char* buffer, * tmpBuf;     
	DWORD dwBytesRead, dwBytesToRead, tmpLen;     
	pFile = CreateFile(    filePath/*这个文件名怎么来的*/    , GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,        //打开已存在的文件          
		FILE_ATTRIBUTE_NORMAL,
		NULL);    
	if ( pFile == INVALID_HANDLE_VALUE)   
	{        
		printf("open file error!\n");      
		CloseHandle(pFile);      
		return FALSE;    
	}   
	fileSize = GetFileSize(pFile,NULL);          //得到文件的大小    
	buffer = (char *) malloc(fileSize);    
	ZeroMemory(buffer, fileSize);  
	dwBytesToRead = fileSize;   
	dwBytesRead = 0;    
	tmpBuf = buffer;   
	do
	{                                       //循环读文件,确保读出完整的文件          
		ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);      
		if (dwBytesRead == 0)         
			break;      
		dwBytesToRead -= dwBytesRead;    
		tmpBuf += dwBytesRead;     
	} while (dwBytesToRead > 0);         //  TODO 处理读到的数据 buffer   
		free(buffer); 
	CloseHandle(pFile);   
	return TRUE;

}
这是我网上找的一个,我这个情况好像没有这个filePath文件,我怎么知道接受谁的数据
yeah2000 2021-02-22
  • 打赏
  • 举报
回复
从网上找个串口收发的例子吧,这一句两句的说不清楚
快雪时晴 2021-02-22
  • 打赏
  • 举报
回复

typedef struct _SerialConfig//串口配置
{
	CString SerialName;//串口
	CString SerialBaud;//波特率
	CString SerialDatabits;//数据位
	CString SerialChecksum;//校验
	CString SerialStopbits;//停止位
}SerialConfig;
请问串口怎么发送接受数据
快雪时晴 2021-02-22
  • 打赏
  • 举报
回复
引用 15 楼 zgl7903 的回复:
设备间一般以字节流定义通讯协议,主要是因为不同CPU架构/编译器的存储大小端有差异


//发送数据帧
int TransFrame(BYTE bFun /*功能码*/,
               BYTE bDataLen /*数据长度*/,
               BYTE *pbData /*数据*/)
{
 //注意这里*********(根据协议选择大端、小端)
#define _BIG_ENDIAN //大端模式?

  //检查参数
  ASSERT(bDataLen > 0);
  ASSERT(pbData);  
  if(bDataLen == 0 || pbData==NULL)
    return 0;

  //总目标发送长度
  int iTxLen = 0
    + 2 //字节头
    + 1 //功能码
    + 1 //字节长度
    + bDataLen //数据长度
    + 2 //校验
    + 2 //字节尾
    + 0;

  //申请缓冲区
  BYTE *pTxData = new BYTE[iTxLen];

  //构造发送数据帧
  int iOfst = 0;
  //字节头
  pTxData[iOfst] = 0xC1; iOfst++;
  pTxData[iOfst] = 0xC2; iOfst++;
  //功能码
  pTxData[iOfst] = bFun; iOfst++;
  //字节长度
  pTxData[iOfst] = bDataLen+2; iOfst++;
  //数据
  memcpy(pTxData+iOfst, pbData, bDataLen); iOfst+=bDataLen;
  //计算校验
  {
    //之前所有数据的累计和
    ULONG uSumL = 0;
    for(int n=0; n<iOfst; n++) { uSumL += pTxData[n]; }
    //(高16位+低16位)后取反
    WORD wSum = (WORD)(~(HIWORD(uSumL) + LOWORD(uSumL)));

   #ifdef _BIG_ENDIAN //大端模式
    pTxData[iOfst] = HIBYTE(wSum); iOfst++;
    pTxData[iOfst] = LOBYTE(wSum); iOfst++;
   #else //!_BIG_ENDIAN //小端模式    
    pTxData[iOfst] = LOBYTE(wSum); iOfst++;
    pTxData[iOfst] = HIBYTE(wSum); iOfst++;
   #endif //_BIG_ENDIAN
    ////////////////////////////
  }
  //字节尾
  pTxData[iOfst] = 0x0A; iOfst++;
  pTxData[iOfst] = 0x0D; iOfst++;

  //检验长度
  ASSERT(iOfst == iTxLen);

  //这里用串口等通讯接口发送数据
  //WriteFile(hCom, pTxData, iTxLen,……)

  //接收&等待响应
  //ReadFile(hCom, pRxData, iRxBuffLen, ……)
  //解析接收数据

  //结束清理
  delete [] pTxData;

  return 1;
}

BOOL SendCmd(BYTE bAix /*轴:1=X 2=Y 3=Z 4=B*/, 
             BYTE bOut /*输出 0电平 1高电平*/
             )
{
  BYTE bData[]= {bAix/*轴*/,  bOut/*输出*/};
  return TransFrame(0x08/*功能码*/, 0x02/*数据长度*/, bData /*数据*/);
}


串口发送、接受数据又该怎么写啊
weixin_47476439 2021-02-22
  • 打赏
  • 举报
回复
看了也我不明白
abc4160201 2021-02-21
  • 打赏
  • 举报
回复
学习一下、、、
加载更多回复(25)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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