北斗短报文格式协议

北斗短报文RDSS协议

短报文回传位置

$CCWAA

$CCTXA

电文内容需要根据传输方式修改,其中,当传输方式为2(混合传输)时,表示电文可以同时兼容中文和代码

其中每个中文的编码为GBK编码,可由查表所得:查看字符编码(简体中文)

例如,汉字 : 经   其对应的GBK编码为:BEAD(十六进制)

将16bit数据BEAD转成混合模式下的电文需要每4bit截取一次数据,分别得到0x0B、0x0E、0x0A、0x0D 

分别将以上4个字节转成字符,最终得到4个字符‘B’、‘E’、‘A’、‘D’

对于代码来说,和上述方法类似,形如float类型的数据40.445678f

首先将其通过snpritf

转成字符串“40.445678”

对于上述字符串,对其中每一个字符的ASCII码每4bit截取一次数据,所以’4‘ 对应ASCII为0x34,转成电文则为’34‘

40.445678→{'0x34','0x30','0x2E','0x34','0x34','0x35','0x36','0x37','0x38'} ->   {'3','4','3','0','2','E','3','4','3','4','3','5','3','6','3','7','3','8'}


void HexToString(u8 HexIn, char* StrOut)
{
    u8 HighPos = (HexIn >> 4) & 0x0F; // 取高4位
    u8 LowPos = HexIn & 0x0F; // 取低4位
 
    if (HighPos <= 0x09)
    {
        StrOut[0] = HighPos + '0';
    }
    else if (HighPos >= 0x0A && HighPos <= 0x0F)
    {
        StrOut[0] = HighPos + '7';
    }
 
    if (LowPos <= 0x09)
    {
        StrOut[1] = LowPos + '0';
    }
    else if (LowPos >= 0x0A && LowPos <= 0x0F)
    {
        StrOut[1] = LowPos + '7';
    }
}
 
 
void FloatAscHex2StrHex(float DataIn, char* StrOut, u8* TurnLen)
{
    char StrIn[20] = { 0 };
    sprintf(StrIn, "%f", DataIn);
 
    u8 Strlen = 0;
    Strlen    = strlen(StrIn);
 
    for (u8 i = 0; i < Strlen; i++)
    {
        HexToString(StrIn[i], &StrOut[i * 2]);
    }
 
    *TurnLen = 2 * Strlen;
}

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值