通讯协议怎么看

快雪时晴 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


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

...全文
3772 45 打赏 收藏 转发到动态 举报
写回复
用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)
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议,协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。

16,472

社区成员

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

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

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