请教:关于控制字的接收与解析,如何修改控制字的定义

大河大江 2018-10-09 05:54:48
这是发射transmit的控制字的获取函数

这是对于transmit的控制字解析,并进行的监测,是一个判断


现在需要,对控制字的定义进行更改。(transmit函数的控制字占了一个字节,这个字节的每一位便是控制字)
各位大神帮忙解答一下!
...全文
575 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
大河大江 2018-10-13
  • 打赏
  • 举报
回复
您的意思,我是这样理解的,您看我理解的对吗? 0XBF表示1011 1111,此时,在进行位读取时,只取1。把位读取到的0,进行舍弃。 就是说,位读取时,读取的是出现0或者1,出现次数多的那个位,代表的数值。
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
0XBF代表的二进制数为10111111 表示 只取 是 1 的 位 状态(可以是 0 或 1) ,0 表示 不要 这位。
大河大江 2018-10-13
  • 打赏
  • 举报
回复
您看,我上面那样推断的的正确吗?
大河大江 2018-10-13
  • 打赏
  • 举报
回复
这一句里 g_Status.TransmitterParam.Bits[0] &= 0xBF; 0XBF代表的二进制数为10111111 这刚好是8位bit,相当于硬件发射机的8个监测点。 0代表正常,1代表故障。则说明,最终传递给判断的只有那个0起作用,其他几个1,其实根本没传递给判断,也就是说,其他几个1对应的监测点都是虚设的,并没有起作用。
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
是 取高16位里的低8 位
大河大江 2018-10-13
  • 打赏
  • 举报
回复
g_DebugLog.L15_Receiver[0]=WSRP4_DSPStatus[dspSPI2H16St],所以g_DebugLog.L15_Receiver[0] 取的是 高16位,您说的“ & 0x00FF 取低 8 bit”,指的是,取高16位里的低8 位吗?
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
& 0x00FF 取低 8 bit
大河大江 2018-10-13
  • 打赏
  • 举报
回复
“g_Status.ReceiverParam.Bits[5] = g_DebugLog.L15_Receiver[0] & 0x00FF;”中“g_DebugLog.L15_Receiver[0] & 0x00FF”具体该怎么理解呢?
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
注意 64位 到 4*16 位的 字节序 (大小端)
大河大江 2018-10-13
  • 打赏
  • 举报
回复
这是获取返回字的那一段代码
// 获取接收发射状态字
	{
//		UINT1 * p=(UINT1 * )&WSRP4_DSPStatus[dspSPI2H16St];
// 		g_Status.TransmitterParam.Bits[0]=p[0];
// 		g_Status.TransmitterParam.Bits[1]=p[1];
		UINT1 * p=(UINT1 * )&WSRP4_DSPStatus[dspSPI2MH16St];
//		g_Status.ReceiverParam.Bits[5]=p[0];
		g_Status.TransmitterParam.Bits[0]=p[1];                                           // 获取发射状态字
		g_Status.TransmitterParam.Bits[0] &= 0xBF;	                                      // 输出功率 监测置0
//		g_Status.TransmitterParam.Bits[3]=p[1];

		g_DebugLog.L14_DIFR[0]=WSRP4_DSPStatus[dspLnkSt];    
		g_DebugLog.L14_DIFR[1]=WSRP4_DSPStatus[dspDifrSt];

		g_DebugLog.L15_Receiver[0]=WSRP4_DSPStatus[dspSPI2H16St];                         // 最高 16 位
		g_DebugLog.L15_Receiver[1]=WSRP4_DSPStatus[dspSPI2MH16St];                        // 次高 16 位
		g_DebugLog.L15_Receiver[2]=WSRP4_DSPStatus[dspSPI2ML16St];                        // 次低 16 位
		g_DebugLog.L15_Receiver[3]=WSRP4_DSPStatus[dspSPI2L16St];                         // 最低 16 位
		g_Status.ReceiverParam.Bits[5] = g_DebugLog.L15_Receiver[0] & 0x00FF;             // 获取接收状态字
		g_Status.ReceiverParam.Bits[6] = (g_DebugLog.L15_Receiver[1] & 0xFF00)>>8;        // 右移8位,除256
//		g_Status.TransmitterParam.Bits[0] = g_DebugLog.L15_Receiver[1] & 0x00FF;
	}
从代码中,我发现,发射机获取控制字时,获取的位数有变化。注释掉的,是最早获取 高16位作为发射机的控制字,现在的代码里,是获取次高16位作为发射机的控制字。 所以,现在发现接收到的发射机的控制字进行解析后,全部是0,是否是因为发射机的控制字根本没有获取到?就是说,次高16位获取的并不是发射机的控制字? 您怎么看待这个问题?
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
#define dspSPI2H16St 0
#define dspSPI2MH16St 1
#define dspSPI2ML16St 2
#define dspSPI2L16St 3

short wsrp4_dispstatus[32]; =2*32=64Bytes !
4个就够了
short wsrp4_dispstatus[4]; 下标dspSPI2H16St 。。。。。。
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
dspSPI2H16St
dspSPI2ML16St
dspSPI2ML16St
dspSPI216St
4*16=64
大河大江 2018-10-13
  • 打赏
  • 举报
回复
懂了,是个位运算 谢谢您啦 我的重拾大学时学的基础知识啦
schlafenhamster 2018-10-13
  • 打赏
  • 举报
回复
00000000 & 10111111=00000000
11111111 & 10111111=10111111
10101010 & 10111111=10101010
01010101 & 10111111=00010101
^ 这一位 永远 为 0

0 & 1= 0
1 & 1= 1
大河大江 2018-10-12
  • 打赏
  • 举报
回复
这是通信协议里的信息字部分,是4个byte WSRP4_DSPStatus的定义在软件中如下: 数组用64位,确实很奇怪,我也不是很懂,在最早的协议里是这样定义的。 “WSRP4_DSPStatus[dspSPI2ML16St/*dspSPI2H16St*/] >> 8;”是否应该修改为“ WSRP4_DSPStatus.dspSPI2ML16St >> 8; ”,对于这个问题,我是这样理解的,WSRP4_DSPStatus[dspSPI2ML16St/*dspSPI2H16St*/] >> 8表示的是 将dspSPI2ML16St(次低16位)在右移8位,可是,按照里面的注释/*dspSPI2H16St*/,dspSPI2ML16St右移8位就表示的是dspSPI2H16St(高16位)。对于这个移位计算,也不是很懂。
大河大江 2018-10-12
  • 打赏
  • 举报
回复
您帮我再分析分析
大河大江 2018-10-12
  • 打赏
  • 举报
回复
从理论上讲,发射机的8位监测点都是和显控软件是实时通信的。所以,当其中的一个监测点从硬件上断开后,软件上,监测的那一位bit应该显示出故障。 然而,此时,8位监测点都显示正常。 所以,我推断,是否,此时,发射机并没有和显控软件之间进行通信?或者,两者之间的通信存在问题?
schlafenhamster 2018-10-12
  • 打赏
  • 举报
回复
transmit发射机的故障 位,没有与 1个 监测点 连接 ?
大河大江 2018-10-12
  • 打赏
  • 举报
回复
我把transmit需要监测的一路信息,给从硬件上设置了故障,打开软件后,按道理,软件中transmit监测信息里,有一项必须要显示故障。 然而,所有监测BIT,均显示的是正常。 所以,我总感觉,transmit的返回字,并没有回送给显控软件,所以,显控软件就默认所有监测bit位都正常。 如果,情况真是这样,transmit发射机并未和显控软件建立连接呢?他们之间并未进行通信,这个问题该怎么解决呢?
schlafenhamster 2018-10-12
  • 打赏
  • 举报
回复
0 也可能是没用到 ! 1 应该 使 发射机硬件 产生 一个 故障 !
加载更多回复(28)

16,471

社区成员

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

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

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